上次整理了下DB2資料庫日誌的一些概念(DB2日誌(1)基礎知識),但在生產環境中如何管理和防止歸檔日誌及防止災難時的日誌丟失其實是比較麻煩的,因為當DB2資料庫設為歸檔模式(即LOGRETAIN=ON)時,資料庫就不會自動刪除和迴圈利用.這會造成活動紀錄目錄下的記錄檔越來越多,而歸檔和清除日誌在DB2中個人感覺並不那麼方便.還好DB2提供了相關的USEREXIT程式(又名使用者出口程式)可以使我們管理記錄檔並有了擴充功能的可能性.在這一點上DB2明顯要比Oracle開放些.
實現
1.首先將USEREXIT介面開啟,讓資料庫支援USEREXIT程式
--查看目前狀態(Windows環境下)
db2 get db cfg for XCLDB2 |find /I "userexit"
--開啟userexit
db2 update db cfg for XCLDB2 using userexit on
--查看目前狀態(Windows環境下)
db2 get db cfg for XCLDB2 |find /I "userexit"
2. 去DB2安裝目錄下找到例子程式
Unix下: sqllib/samples/c
Windows下: C:\Program Files\IBM\SQLLIB\samples\c
例子檔案:
Db2uext2.cadsm — 對 Tivoli Storage Manager 的支援,也稱為 ADSM
Db2uext2.cdisk — 對磁碟的支援
Db2uext2.ctape — 對本地磁帶的支援,僅可用於 UNIX 系統
Db2uext2.cxbsa — 對 XBSA Draft 0.8 客戶機的支援
這些樣本程式中的每個都只需要稍作修改(如 buffer_size 、 audit_log_activation 、 audit_log_path 、 error_log_activation 和 error_log_path )
除了上面這些,還可以用db2uext2.ctsm來實現.它是新的替代版.
3.以Windows環境為例示範如何編譯擴充.
3.1 用Visual Studio建立一個屬性為空白項目的控制台應用程式工程.注意,工程名為"Db2uext2",
工程目錄為"c:\DB2C"
3.2 將 Db2uext2.cdisk 複製到 C:\DB2C\db2uext2 目錄下,將其更名為Db2uext2.c.
然後在Visual Studio工程中將檔案匯入.
匯入成功後開啟檔案. 尋找並替換 "c:\\mylogs\\" 為自己所要的目錄如 "c:\\xcllogs\\"
其實主要是更改的這幾個參數,具體含義在C程式的代碼注釋中很詳細:
#define ARCHIVE_PATH "c:\\xcllogs\\"
#define RETRIEVE_PATH "c:\\xcllogs\\"
#define AUDIT_ACTIVE 1 /* enable audit trail logging */
#define ERROR_ACTIVE 1 /* enable error trail logging */
#define AUDIT_ERROR_PATH "c:\\xcllogs\\" /* 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 */
3.3將編譯好的Reselse版本的db2uext2.exe檔案放在DB2管理程式能找到的目錄下.
編譯後的db2uext2.exe檔案存放目錄:
Windows下:
C:\Program Files\IBM\SQLLIB\BIN
Unix下:
/sqllib/adm
3.4 測試擴充程式是否生效
3.4.1 在DB2 CLP下手工強制歸檔一份日誌
db2 archive log for db XCLDB2
3.4.2 應當可以在"C:\xcllogs\XCLDB2\NODE0000"目錄下查到新產生的日誌
C:\>tree C:\xcllogs
卷 WINXP 的檔案夾 PATH 列表
卷序號為 88F1-6579
C:\XCLLOGS
└─XCLDB2
└─NODE0000
c:\>dir C:\xcllogs\XCLDB2\NODE0000
上面舉的是Windows下的,在Unix下時,一定要注意,需先mkdir目錄並授權(如777),
並chown -R 目錄給DB2的使用者.
引申:
上面只是舉了個最簡單的例子,但如果把這個例子擴充下.甚至可以通過記錄檔的同步
或非同步複製到異機或遠程儲存來實現資料庫的容災.
簡單的說一個主備資料庫同步的實現方法 :
1. 首先在備份資料庫伺服器上,用主庫的備份恢複出一個完整的DB2資料庫.
這個備份伺服器硬體什麼的可以不一致,就是檔案系統劃分不一樣時,需要用重新導向恢複來產生備庫.
2. 將備份伺服器的活動紀錄目錄,設為主程式庫伺服器有讀寫權限.
3. 參考上面的例子,實現一個擴充.用於將日誌傳一份至備份伺服器的活動紀錄目錄.
4. 在備份伺服器上弄一個定時作業,定時前滾 "db2 rollforward to end of logs"
哈哈,這樣兩邊就同步了.
這個擴充還可以加上自動定期整理日誌的功能.也可以利用Db2uext2.ctape做些磁帶庫方面的擴充.
總之,看個人的創意了. 推薦閱讀:
DB2資料庫效能調整和最佳化(第1、2版) PDF
DB2資料庫效能最佳化介紹