DB2數據庫的日志文件管理
DB2的日志模式
1.1循環日志
當循環日志生效時,事務數據將通過循環的方式寫入主要日志文件。當存儲於某個日志文件中的所有記錄都不再需要用於恢復時,該日志文件將被重用,並且可以在以后再次成為活動日志文件。這意味着在循環日志模式中,日志文件的內容最終將被新日志條目重寫。由於日志文件的內容被重寫覆蓋了,因此我們只能將數據庫恢復到最后一次完整的數據庫備份。不能使用循環日志執行時間點(point-in-time)恢復。
1.2 歸檔日志
在歸檔日志模式中,redo log條目將寫入主要日志文件。但是,與循環日志不同,這些日志文件永遠都不可重用。當存儲於某個日志文件中的所有記錄都不再需要用於恢復時,該日志文件將被標記為非活動而不是可重用。這意味着它的內容永遠都不會被覆蓋。當第一個主要日志文件變滿時,系統將分配一個新的日志文件,這樣主要日志文件的配置數量(LOGPRIMARY數據庫參數)將一直可用。
與單個事務相關的所有條目必須在活動日志空間中保持一致。如果長時間運行的事務所需要的日志空間大於主要日志文件可以提供的空間,則可能會分配並使用次要日志文件。在歸檔日志模式中,通過結合使用數據庫備份映像和日志文件,我們可以將數據庫恢復到具體的時間點。有關此流程的詳細描述請參見下文。
設置了歸檔模式后,數據庫將支持前滾恢復。此時,系統中將會存在三種類型的日志文件:
活動日志:該日志包含尚未提交或回滾的事務單元的相關信息,以及已提交但尚未寫入數據庫文件的事務的信息。
聯機存檔日志:活動日志中所有改動對正常處理已不需要,即該日志中所記錄的事務都已提交並寫入數據庫文件時,該活動日志轉換為聯機存檔日志。稱之為聯機,是由於它們與活動日志存放在同一個目錄下。
脫機存檔日志:將聯機存檔日志從活動日志目錄下Copy到另外的地方存檔,就稱為脫機存檔日志。這些日志可能在數據庫前滾恢復的時候仍然需要。
(所謂聯機歸檔日志,就是歸檔日志文件和活動日志文件同在一個目錄下;而離線歸檔日志,則是歸檔日志與活動日志分開存放)
日志模式修改:https://www.cnblogs.com/net2012/archive/2013/02/04/2891502.html
管理數據庫日志的工作可以手工完成(即將聯機存檔日志手工拷貝到某個archive目錄),也可由編寫USEREXIT程序自動維護。
既然 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.LOG S0000014.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對所有平台都提供了相應的USEREXIT示例程序,而且非常易於修改和使用,所以IBM建議用戶使用USEREXIT程序來管理日志文件。
使用USEREXIT程序的方法
要使用User exit program自動化log文件的archiving和retrieval過程:
1. 設置database cfg參數logarchmeth1 為USEREXIT
connect to sample
update db cfg using logarchmeth1 USEREXIT
connect reset
2. 創建user exit programs。該程序必須是一個名為db2uext2的可執行文件。DB2在各種平台上都提供了User Exit的示例程序,用戶可以通過直接修改該樣本文件來實現自己的user exit程序。
在UNIX(R) based的系統中,該程序存放在sqllib/samples/c目錄下.
There are four sample user exit programs for UNIX based systems:
• db2uext2.ctsm
This sample uses Tivoli(R) Storage Manager to archive and retrieve database log files.
• db2uext2.ctape
This sample uses tape media to archive and retrieve database log files .
• db2uext2.cdisk
This sample uses the operating system COPY command and disk media to archive and retrieve database log files.
• db2uxt2.cxbsa
This sample works with the XBSA Draft 0.8 published by the X/Open group. It can be used to archive and retrieve database log files. This sample is only supported on AIX.
• 在Windows(R) 系統中,該文件存放在sqllib/samples/c目錄下。
There are two sample user exit programs for Windows operating systems:
• db2uext2.ctsm
This sample uses Tivoli Storage Manager to archive and retrieve database log files.
• db2uext2.cdisk
This sample uses the operating system COPY command and disk media to archive and retrieve database log files.
3. 配置該示例程序,指定要將日志文件Archive到哪個系統目錄中(在windows平台下,程序中默認為c:\mylogs)。
#define ARCHIVE_PATH "c:\\mylogs\\"
#define RETRIEVE_PATH "c:\\mylogs\\"
#define AUDIT_ERROR_PATH "c:\\mylogs\\"
4. 編譯該C文件
cl db2uext2.c
5. 拷貝db2uext2.exe到/SQLLIB/BIN目錄下
6. 在db2cmd中鍵入archive log for db sample user db2admin using duan1980命令強制執行log日志歸檔任務。查看c:\mylogs目錄下有無日志文件歸檔,驗證是否成功。
