DB2 UDB中用戶出口程序是如何工作的?
?
采用用戶出口程序與DB2 UDB共同工作背后的基本思想是提供一種歸檔和檢索數(shù)據(jù)庫(kù)日志文件的方法以實(shí)現(xiàn)日志冗余處理并從易失性介質(zhì)上轉(zhuǎn)儲(chǔ)出來(lái)。重要的,值得注意的是,根據(jù)你的特殊需求,在用戶出口程序當(dāng)中,除了能實(shí)現(xiàn)歸檔和檢索日志之外,你還可以實(shí)現(xiàn)其他的操作。
?
如果一個(gè)數(shù)據(jù)庫(kù)需要采用歸檔日志文件來(lái)進(jìn)行恢復(fù),在DB2 UDB中實(shí)行用戶出口程序策略將不能恢復(fù)100%的事務(wù)。用戶出口程序只是一種通過(guò)拷貝已經(jīng)存在的日志文件到一個(gè)安全的地方來(lái)為其提供更多保護(hù)的方法。它是數(shù)據(jù)完整性策略中的一部分,而且是重要的一部分。
?
編譯了用戶出口程序之后,可執(zhí)行程序db2uext2被放置在數(shù)據(jù)庫(kù)管理器可以找到的目錄當(dāng)中。在UNIX?中,這個(gè)目錄是/sqllib/adm;在Windows?中,是Program FilesIBMSQLLIBBIN。
?
除非數(shù)據(jù)庫(kù)管理器知道用戶出口程序是可用的,不然它不會(huì)調(diào)用db2uext2。讓數(shù)據(jù)庫(kù)管理器知道db2uext2可以被調(diào)用的唯一方法是將數(shù)據(jù)庫(kù)配置參數(shù)userexit設(shè)置為on。一旦這個(gè)參數(shù)被設(shè)定好而且DB2實(shí)例被重復(fù)利用了,數(shù)據(jù)庫(kù)管理器將每五分鐘調(diào)用一次用戶出口程序來(lái)檢查那些可以被歸檔到程序相關(guān)的歸檔目錄的日志文件。
?
如果數(shù)據(jù)庫(kù)的恢復(fù)是必要的,在前滾操作期間,數(shù)據(jù)庫(kù)管理器將調(diào)用db2uext2把歸檔日志文件拷貝回活動(dòng)的日志目錄當(dāng)中。然后,日志文件被再次運(yùn)用到重建的數(shù)據(jù)庫(kù)中。
?
讓我們看看被數(shù)據(jù)庫(kù)管理器生成的到用戶出口程序的調(diào)用的格式。注意,這一信息也可以在用戶出口示例程序的注釋部分找到。
db2uext2 -OS -RL
-RQ -DB -NN
-LP -LN [-AP]
?
其中:
os=操作系統(tǒng)
release=DB2發(fā)行版本
request= 'ARCHIVE' 或 'RETRIEVE'
dbname=數(shù)據(jù)庫(kù)名
nodenumber=節(jié)點(diǎn)號(hào)
logpath=日志文件目錄
logname=日志文件名
logsize=日志文件大小(可選)
startingpage=以4k頁(yè)為單位的起始偏移量(可選)
adsmpasswd=ADSM密碼(可選)
?
注意:只有當(dāng)logpath為裸設(shè)備時(shí)才使用logsize和startingpage。
?
歸檔或者從磁盤檢索日志文件遵從以下命名規(guī)則:
歸檔:歸檔路徑+數(shù)據(jù)庫(kù)名+節(jié)點(diǎn)號(hào)+日志文件名
檢索:檢索路徑+數(shù)據(jù)庫(kù)名+節(jié)點(diǎn)號(hào)+日志文件名
?
比如:如果歸檔的路徑為”c:mylogs”,
檢索路徑是“c:mylogs”,
數(shù)據(jù)庫(kù)名是“SAMPLE”,
節(jié)點(diǎn)號(hào)是 NODE0000,
文件名是 S0000001.LOG,
日志文件將是:
歸檔到 - c:mylogsSAMPLENODE0000S0000001.LOG
檢索自 - c:mylogsSAMPLENODE0000S0000001.LOG
以下描述了用戶出口程序中的邏輯是如何運(yùn)轉(zhuǎn)的:
1)? 安裝信號(hào)處理程序。
2)? 驗(yàn)證傳遞的參數(shù)個(gè)數(shù)。
3)? 驗(yàn)證操作請(qǐng)求。
4)? 開(kāi)始審計(jì)跟蹤(如果有此請(qǐng)求)。
5)? 根據(jù)操作需求的不同獲取以下路徑中的一個(gè):
a)? 如果操作需求為歸檔一個(gè)文件,將日志文件從日志路徑拷貝到歸檔路徑中。
i) 如果沒(méi)有找到日志文件,執(zhí)行第6點(diǎn)。
?
b)? 如果操作需求是檢索一個(gè)文件,將日志文件從檢索路徑拷貝到日志路徑中。
i) 如果沒(méi)有找到日志文件,執(zhí)行第6點(diǎn)。
6) 將錯(cuò)誤記入日志(如果要求或者有需要的話)。
7)? 結(jié)束審計(jì)跟蹤(如果有請(qǐng)求)。
8)? 以適當(dāng)?shù)姆祷卮a退出。
?
手工調(diào)用用戶出口程序來(lái)歸檔日志文件是可以的,但最好還是使用ARCHIVE LOG命令以便在定義以上參數(shù)時(shí)不會(huì)因?yàn)槟愕脑驅(qū)е洛e(cuò)誤。在這篇文章的末尾,可以找到關(guān)于ARCHIVE LOG命令的鏈接。
?
日志文件術(shù)語(yǔ)
?
DB2 中用戶出口程序的基本功能是將日志文件拷貝到活動(dòng)日志目錄或反之。這里,值得指出一些術(shù)語(yǔ)來(lái)闡明活動(dòng)的日志目錄被置于何處以及數(shù)據(jù)庫(kù)日志文件的狀態(tài)如何。
?
活動(dòng)日志目錄:
?
該目錄被置于你的數(shù)據(jù)庫(kù)目錄中。在Windows中,如果在C:中創(chuàng)建了一個(gè)叫做SAMPLE的單一數(shù)據(jù)庫(kù)且實(shí)例名為db2inst1,則將會(huì)出現(xiàn)以下的目錄結(jié)構(gòu):
?
C:DB2INST1NODE0000SQL000001SQLOGDIR
?
SQL00001是SAMPLE數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)目錄,SQLOGDIR 是活動(dòng)日志目錄。
?
以下的圖1顯示了Windows操作系統(tǒng)上的活動(dòng)日志目錄:
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活動(dòng)日志目錄
日志文件狀態(tài)
?
在活動(dòng)日志目錄中,日志文件可以是活動(dòng)日志,也可以是聯(lián)機(jī)歸檔日志。活動(dòng)日志是那些被 DB2 用于當(dāng)前事務(wù)處理和崩潰恢復(fù)的日志。聯(lián)機(jī)歸檔日志是那些 DB2 UDB 進(jìn)行常規(guī)處理時(shí)不再需要,而進(jìn)行數(shù)據(jù)庫(kù)恢復(fù)時(shí)可能還會(huì)需要的日志。當(dāng)實(shí)現(xiàn)用戶出口程序時(shí),這些聯(lián)機(jī)歸檔日志將最終以歸檔日志目錄中的副本形式出現(xiàn)。
?
既然 DB2 UDB 中用戶出口程序的目的是將數(shù)據(jù)庫(kù)日志拷貝到歸檔目錄中,你將最終在活動(dòng)日志目錄(缺省為 SQLOGDIR)中得到重復(fù)的日志文件。你可能考慮刪除這些重復(fù)的聯(lián)機(jī)歸檔日志以釋放文件系統(tǒng)空間。在從數(shù)據(jù)庫(kù)目錄中除去這些日志之前,要十分小心地確認(rèn)它們是否已經(jīng)將成功地被復(fù)制到歸檔目錄中。還必須確保數(shù)據(jù)庫(kù)管理器進(jìn)行崩潰恢復(fù)時(shí)不再需要它們。要確定你的活動(dòng)日志目錄中哪些日志文件不為正常處理所需要,可用通過(guò)以下命令檢查數(shù)據(jù)庫(kù)配置:
????????
???? db2 "get db cfg for sample"
?
這條命令的數(shù)據(jù)庫(kù)配置輸出結(jié)果將包含第一個(gè)活動(dòng)日志文件,如:
First active log file = S000009.LOG
?
在如上所示的輸出當(dāng)中,日志文件S000009.LOG是數(shù)據(jù)庫(kù)當(dāng)前的活動(dòng)日志。任何編號(hào)比該日志文件小的日志文件都被看作聯(lián)機(jī)歸檔日志。
?
這里有一個(gè)例子:
?
在這個(gè)場(chǎng)景中,活動(dòng)日志目錄中有日志文件 S000000.LOG - S000009.LOG,歸檔日志目錄中有 S000000.LOG - S000008.LOG。因?yàn)?S000009.LOG 是第一個(gè)活動(dòng)日志文件,所以,可以從活動(dòng)日志目錄中移走 S000001.LOG - S000008.LOG 以釋放磁盤空間。S000009.LOG 文件必須保留在活動(dòng)日志目錄中,因?yàn)樗匀槐划?dāng)前事務(wù)使用。
?
同樣可以通過(guò)檢查數(shù)據(jù)庫(kù)歷史文件來(lái)查看活動(dòng)日志目錄中哪些日志文件不再有用。以下命令將列出數(shù)據(jù)庫(kù)備份信息:
?
???? db2 "list history backup all for database sample"
?
以下是該命令的輸出結(jié)果的一個(gè)例子:
?
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 之前的任何日志可以被安全的刪除。再次提醒,在從活動(dòng)日志目錄中刪除日志文件之前,驗(yàn)證在活動(dòng)日志目錄中存在這些日志文件的拷貝是十分重要的。
?
雖然可以手動(dòng)的從活動(dòng)日志目錄中刪除日志文件,刪除聯(lián)機(jī)歸檔日志文件的安全方法是通過(guò)prune logfile命令。該命令可以用來(lái)刪除活動(dòng)歸檔目錄中的日志文件。在下面的示例中,以下命令將刪除日志文件 S000000.LOG - S000008.LOG:
???? db2 "prune logfile prior to S000009.LOG"
?
注意:根據(jù)您的恢復(fù)策略,可能會(huì)出現(xiàn)之前的前滾操作在數(shù)據(jù)庫(kù)上執(zhí)行的場(chǎng)景。歸檔目錄中的老日志文件可能被同名的新日志文件所覆蓋,從而阻止你使用舊日志文件對(duì)數(shù)據(jù)庫(kù)進(jìn)行時(shí)間點(diǎn)恢復(fù)。對(duì)用戶出口程序的設(shè)計(jì)程序員來(lái)說(shuō),考慮類似這樣的情況是很重要的。
?
設(shè)置用戶出口
?
在本文中,我們將采用DB2提供的db2uext2.cdisk樣例c程序,它位于你的c目錄當(dāng)中。在UNIX中,c目錄位于/sqllib/samples。Windows中,這目錄位于Program Files/IBM//samples。
?
在Windows中設(shè)置用戶出口
?
修改和編譯用戶出口程序
1.? 創(chuàng)建名為C:mylogs的目錄
2.? 將C:Program filesIBMSQLLIBsamplescdb2uext2.cdisk拷貝到一個(gè)工作目錄當(dāng)中
3.? 對(duì)于本示例,用戶出口程序的以下部分應(yīng)該得以驗(yàn)證以反映路徑 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.? 確定在你的系統(tǒng)中安裝了被支持的C編譯器(比如,Microsoft Visual Studio)而且環(huán)境中有該編譯器的路徑。
5.? 通過(guò)命令行,將db2uext2.cdisk更名為db2uext2.c并構(gòu)建:
cl db2uext2.c
一旦程序被編譯,將創(chuàng)建db2uext2.exe和db2uext2.obj文件。
6.? 將可執(zhí)行文件db2uext2.exe放到/SQLLIB/BIN目錄當(dāng)中從而使數(shù)據(jù)庫(kù)管理器能夠定位并執(zhí)行它用以歸檔和檢索日志。
?
為用戶出口創(chuàng)建并準(zhǔn)備數(shù)據(jù)庫(kù)
7.? 在 DB2 命令窗口中用 db2sampl 命令創(chuàng)建 SAMPLE 數(shù)據(jù)庫(kù)。這將使你對(duì)下面的示例使用樣本表。
db2sampl
8.? 更新數(shù)據(jù)庫(kù)配置文件以便為數(shù)據(jù)庫(kù)打開(kāi)用戶出口。請(qǐng)注意:只能為一個(gè)數(shù)據(jù)庫(kù)分配用戶出口程序,因?yàn)?bin 目錄被所有 DB2 實(shí)例共享。
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 閱讀(424)
評(píng)論(0) 編輯 收藏