DB2 UDB中用戶出口程序是如何工作的?
?
采用用戶出口程序與DB2 UDB共同工作背后的基本思想是提供一種歸檔和檢索數據庫日志文件的方法以實現日志冗余處理并從易失性介質上轉儲出來。重要的,值得注意的是,根據你的特殊需求,在用戶出口程序當中,除了能實現歸檔和檢索日志之外,你還可以實現其他的操作。
?
如果一個數據庫需要采用歸檔日志文件來進行恢復,在DB2 UDB中實行用戶出口程序策略將不能恢復100%的事務。用戶出口程序只是一種通過拷貝已經存在的日志文件到一個安全的地方來為其提供更多保護的方法。它是數據完整性策略中的一部分,而且是重要的一部分。
?
編譯了用戶出口程序之后,可執行程序db2uext2被放置在數據庫管理器可以找到的目錄當中。在UNIX?中,這個目錄是/sqllib/adm;在Windows?中,是Program FilesIBMSQLLIBBIN。
?
除非數據庫管理器知道用戶出口程序是可用的,不然它不會調用db2uext2。讓數據庫管理器知道db2uext2可以被調用的唯一方法是將數據庫配置參數userexit設置為on。一旦這個參數被設定好而且DB2實例被重復利用了,數據庫管理器將每五分鐘調用一次用戶出口程序來檢查那些可以被歸檔到程序相關的歸檔目錄的日志文件。
?
如果數據庫的恢復是必要的,在前滾操作期間,數據庫管理器將調用db2uext2把歸檔日志文件拷貝回活動的日志目錄當中。然后,日志文件被再次運用到重建的數據庫中。
?
讓我們看看被數據庫管理器生成的到用戶出口程序的調用的格式。注意,這一信息也可以在用戶出口示例程序的注釋部分找到。
db2uext2 -OS -RL
-RQ -DB -NN
-LP -LN [-AP]
?
其中:
os=操作系統
release=DB2發行版本
request= 'ARCHIVE' 或 'RETRIEVE'
dbname=數據庫名
nodenumber=節點號
logpath=日志文件目錄
logname=日志文件名
logsize=日志文件大小(可選)
startingpage=以4k頁為單位的起始偏移量(可選)
adsmpasswd=ADSM密碼(可選)
?
注意:只有當logpath為裸設備時才使用logsize和startingpage。
?
歸檔或者從磁盤檢索日志文件遵從以下命名規則:
歸檔:歸檔路徑+數據庫名+節點號+日志文件名
檢索:檢索路徑+數據庫名+節點號+日志文件名
?
比如:如果歸檔的路徑為”c:mylogs”,
檢索路徑是“c:mylogs”,
數據庫名是“SAMPLE”,
節點號是 NODE0000,
文件名是 S0000001.LOG,
日志文件將是:
歸檔到 - c:mylogsSAMPLENODE0000S0000001.LOG
檢索自 - c:mylogsSAMPLENODE0000S0000001.LOG
以下描述了用戶出口程序中的邏輯是如何運轉的:
1)? 安裝信號處理程序。
2)? 驗證傳遞的參數個數。
3)? 驗證操作請求。
4)? 開始審計跟蹤(如果有此請求)。
5)? 根據操作需求的不同獲取以下路徑中的一個:
a)? 如果操作需求為歸檔一個文件,將日志文件從日志路徑拷貝到歸檔路徑中。
i) 如果沒有找到日志文件,執行第6點。
?
b)? 如果操作需求是檢索一個文件,將日志文件從檢索路徑拷貝到日志路徑中。
i) 如果沒有找到日志文件,執行第6點。
6) 將錯誤記入日志(如果要求或者有需要的話)。
7)? 結束審計跟蹤(如果有請求)。
8)? 以適當的返回碼退出。
?
手工調用用戶出口程序來歸檔日志文件是可以的,但最好還是使用ARCHIVE LOG命令以便在定義以上參數時不會因為你的原因導致錯誤。在這篇文章的末尾,可以找到關于ARCHIVE LOG命令的鏈接。
?
日志文件術語
?
DB2 中用戶出口程序的基本功能是將日志文件拷貝到活動日志目錄或反之。這里,值得指出一些術語來闡明活動的日志目錄被置于何處以及數據庫日志文件的狀態如何。
?
活動日志目錄:
?
該目錄被置于你的數據庫目錄中。在Windows中,如果在C:中創建了一個叫做SAMPLE的單一數據庫且實例名為db2inst1,則將會出現以下的目錄結構:
?
C:DB2INST1NODE0000SQL000001SQLOGDIR
?
SQL00001是SAMPLE數據庫的數據庫目錄,SQLOGDIR 是活動日志目錄。
?
以下的圖1顯示了Windows操作系統上的活動日志目錄:
PATH o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />SHAPE id=_x0000_i1025 style="WIDTH: 299.25pt; HEIGHT: 180.75pt" type="#_x0000_t75" />/P>
?
圖 1活動日志目錄
日志文件狀態
?
在活動日志目錄中,日志文件可以是活動日志,也可以是聯機歸檔日志。活動日志是那些被 DB2 用于當前事務處理和崩潰恢復的日志。聯機歸檔日志是那些 DB2 UDB 進行常規處理時不再需要,而進行數據庫恢復時可能還會需要的日志。當實現用戶出口程序時,這些聯機歸檔日志將最終以歸檔日志目錄中的副本形式出現。
?
既然 DB2 UDB 中用戶出口程序的目的是將數據庫日志拷貝到歸檔目錄中,你將最終在活動日志目錄(缺省為 SQLOGDIR)中得到重復的日志文件。你可能考慮刪除這些重復的聯機歸檔日志以釋放文件系統空間。在從數據庫目錄中除去這些日志之前,要十分小心地確認它們是否已經將成功地被復制到歸檔目錄中。還必須確保數據庫管理器進行崩潰恢復時不再需要它們。要確定你的活動日志目錄中哪些日志文件不為正常處理所需要,可用通過以下命令檢查數據庫配置:
????????
???? db2 "get db cfg for sample"
?
這條命令的數據庫配置輸出結果將包含第一個活動日志文件,如:
First active log file = S000009.LOG
?
在如上所示的輸出當中,日志文件S000009.LOG是數據庫當前的活動日志。任何編號比該日志文件小的日志文件都被看作聯機歸檔日志。
?
這里有一個例子:
?
在這個場景中,活動日志目錄中有日志文件 S000000.LOG - S000009.LOG,歸檔日志目錄中有 S000000.LOG - S000008.LOG。因為 S000009.LOG 是第一個活動日志文件,所以,可以從活動日志目錄中移走 S000001.LOG - S000008.LOG 以釋放磁盤空間。S000009.LOG 文件必須保留在活動日志目錄中,因為它仍然被當前事務使用。
?
同樣可以通過檢查數據庫歷史文件來查看活動日志目錄中哪些日志文件不再有用。以下命令將列出數據庫備份信息:
?
???? db2 "list history backup all for database sample"
?
以下是該命令的輸出結果的一個例子:
?
List History File for sample
Number of matching file entries = 4
Op Obj Timestamp+Sequence Type Dev Earliest Log Current? Log
-- --- ------------------ ---- --- ------------------------
B D 20030416162026001 F D S0000010.LOGS0000014.LOG
------------------------------------------------------------
Contains 2 tablespace(s):
00001 SYSCATSPACE
00002 USERSPACE1
------------------------------------------------------------
?
在上面的輸出中,最早的日志將表示,需要 S0000010.LOG 及其之后的任何日志。 S00000010.LOG 之前的任何日志可以被安全的刪除。再次提醒,在從活動日志目錄中刪除日志文件之前,驗證在活動日志目錄中存在這些日志文件的拷貝是十分重要的。
?
雖然可以手動的從活動日志目錄中刪除日志文件,刪除聯機歸檔日志文件的安全方法是通過prune logfile命令。該命令可以用來刪除活動歸檔目錄中的日志文件。在下面的示例中,以下命令將刪除日志文件 S000000.LOG - S000008.LOG:
???? db2 "prune logfile prior to S000009.LOG"
?
注意:根據您的恢復策略,可能會出現之前的前滾操作在數據庫上執行的場景。歸檔目錄中的老日志文件可能被同名的新日志文件所覆蓋,從而阻止你使用舊日志文件對數據庫進行時間點恢復。對用戶出口程序的設計程序員來說,考慮類似這樣的情況是很重要的。
?
設置用戶出口
?
在本文中,我們將采用DB2提供的db2uext2.cdisk樣例c程序,它位于你的c目錄當中。在UNIX中,c目錄位于/sqllib/samples。Windows中,這目錄位于Program Files/IBM//samples。
?
在Windows中設置用戶出口
?
修改和編譯用戶出口程序
1.? 創建名為C:mylogs的目錄
2.? 將C:Program filesIBMSQLLIBsamplescdb2uext2.cdisk拷貝到一個工作目錄當中
3.? 對于本示例,用戶出口程序的以下部分應該得以驗證以反映路徑 c:\mylogs\
?
#define ARCHIVE_PATH "c:\mylogs\"
#define RETRIEVE_PATH "c:\mylogs\"
#define AUDIT_ACTIVE 1 /* enable audit trail logging */
#define ERROR_ACTIVE 1 /* enable error trail logging */
#define AUDIT_ERROR_PATH "c:\mylogs\"
???????????????? /* path must end with a slash */
#define AUDIT_ERROR_ATTR "a" /* append to text file */
#define BUFFER_SIZE 32
??? /* # of 4K pages for output buffer */
?
4.? 確定在你的系統中安裝了被支持的C編譯器(比如,Microsoft Visual Studio)而且環境中有該編譯器的路徑。
5.? 通過命令行,將db2uext2.cdisk更名為db2uext2.c并構建:
cl db2uext2.c
一旦程序被編譯,將創建db2uext2.exe和db2uext2.obj文件。
6.? 將可執行文件db2uext2.exe放到/SQLLIB/BIN目錄當中從而使數據庫管理器能夠定位并執行它用以歸檔和檢索日志。
?
為用戶出口創建并準備數據庫
7.? 在 DB2 命令窗口中用 db2sampl 命令創建 SAMPLE 數據庫。這將使你對下面的示例使用樣本表。
db2sampl
8.? 更新數據庫配置文件以便為數據庫打開用戶出口。請注意:只能為一個數據庫分配用戶出口程序,因為 bin 目錄被所有 DB2 實例共享。
db2 "update db cfg for sample using userexit on"
db2stop force
<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋體; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋體; mso-
/P>
posted on 2006-12-08 18:12
MyJavaWorld 閱讀(418)
評論(0) 編輯 收藏