背景介紹
DB2 有兩種類型的日志文件用於故障診斷。管理通知日志 (instance_name.nfy) 主要供數據庫和系統管理員進行故障診斷,它只用於 Linux 和 Unix操作系統。DB2 診斷日志文件 (db2diag.log) 主要供 IBM 軟件支持機構進行故障診斷。管理通知日志消息也以標准化消息格式記錄到 db2diag 日志文件。
在 IBM DB2 9.7 之前的版本,這兩個日志文件的大小被允許無限制地增長。有時候這些文件由於一直沒有歸檔,而導致其所在文件系統的磁盤空間溢出。這會造成 DB2 不能正常記錄診斷信息,其他應用程序也可能因為磁盤空間滿而運行失敗。更為糟糕的是,如果這些日志和 DB2 其他關鍵數據保存在同一文件系統上,DB2 本身會不能正常工作,帶來不必要的損失。
此外,如果 db2diag.log 一直沒有被刪除,它會包含數年來數據庫操作的大量診斷信息。當客戶系統發生錯誤需要 DB2 支持服務時,該診斷日志文件會通過 FTP 發往 IBM,這將花費客戶很長的時間並延緩了支持人員對該服務消息的響應時間。這對於 24 × 7 運行的生產系統是完全不能容忍的。
上述兩大問題一直是客戶和服務支持人員的痛處。DB2 9.7 引入的新特性 - 輪換診斷日志和管理通知日志可以控制所有輪換日志的總大小,從而解決這些問題,減輕 DBA 的日常工作。
診斷日志文件的兩種形式
診斷日志文件和管理通知日志文件存在的形式相似,這裡以診斷日志文件為例說明其存在的形式。DB2 的診斷日志文件有兩種不同的形式:
單一診斷日志文件
一個活動診斷日志文件,名為 db2diag.log,其大小可以無限增大。DB2 9.7 之前都采用這個形式,這也是 DB2 9.7 的默認行為。每當 diagsize 數據庫管理器配置參數的值為缺省值 0 時,都采用單一診斷日志記錄行為。
輪換診斷日志文件
單一活動日志文件(名為 db2diag.N.log,其中 N是從 0 開始持續增大的文件名數字索引)。在 diagpath 配置參數定義的位置可以找到一系列診斷日志文件。每個文件都將增長到有限的大小,達到該限制值時,系統將關閉該日志文件,然後創建並打開一個新的日志文件進行日志記錄,新日志文件將具有增大後的文件名索引(db2diag.N+1.log)。每當 diagsize 數據庫管理器配置參數設為非零值時,都采用輪換日志記錄行為。
你可以通過設置 DIAGSIZE數據庫管理器配置參數來選擇采用上述哪種日志文件形式。
如何使用輪換日志
啟用輪換日志
更新數據庫管理器配置參數 DIAGSIZE 為非 0 值,DB2 重新啟動時切換到輪換日志記錄行為,使用命令如下:
db2 update dbm cfg using DIASIZE 1024
DIAGSIZE 的單位是兆字節,缺省值為 0,最小值為 2,最大值不能超過磁盤的可用空間,否則會報 SQL5130N 的錯誤消息。
當啟動輪換日志記錄行為後,其表現如下:
使用一系列診斷日志文件,如 db2diag.9.log, db2diag.10.log … . db2diag.18.log,文件總數目不超過 10,當第 10 個文件的大小達到限制後,將刪除最舊的文件並創建新文件。
使用一系列管理通知日志文件,如 <instance>.0.nfy, <instance>.1.nfy ...,<instance>.9.log,文件總數目不超過 10
消息始終被記錄到索引號最大的輪換日志文件 db2diag. 最大的 n.log 和 <instance>. 最大的 n.nfy。
除此之外,DIAGSIZE 配置參數將控制所有輪換診斷日志文件和輪換管理通知文件的總大小:
Linux 和 Unix 操作系統,輪換診斷日志文件 db2diag.n.log 的總大小不能超過 DIAGSIZE 配置參數的 90%,輪換管理通知日志文件 <instance>.n.nfy 的總大小不超過 DIAGSIZE 配置參數的 10%。例如 DIAGSIZE 設置為 1024,那麼全部 db2diag.n.log 文件總大小不超過 921.6MB,全部 <instance>.n.nfy 的總大小不超過 102.4MB。
Windows 操作系統上,DIAGSIZE 的整個值都分配給輪換診斷日志文件。
每個日志文件的大小由分配給每類日志文件的空間總量除以 10 確定。
輪換日志文件從來不會充滿 diagpath 所定義的目錄,這是因為 DB2 的“Early Totaling”機制。當創建一個新的日志文件時,DB2 會檢查可用的磁盤空間。當沒有足夠的磁盤空間創建新日志文件並且至少存在兩個輪換日志文件時,DB2 會刪除最老的日志文件,即使輪換日志文件數目未達到 10,這樣 DB2 就會得到些許空間創建新的日志文件。
圖 1. 輪換日志的示意性圖例(3 個輪換日志文件)
查看原圖(大圖)
這裡是啟用輪換日志的一個例子,默認情況下 DIAGSIZE 為 0,我們在其 DIAGPATH 定義的路徑目錄 db2dump 內只看到一個 db2diag.log 和 db2hia.nfy(db2 實例名為 db2hia)。
sapsu2:db2hia 4% ls -lrt
total 22168
-rw-r----- 1 db2hia dbhiaadm 6291312 Oct 20 00:24 db2eventlog.000
-rw-rw-rw- 1 db2hia dbhiaadm 2967 Oct 20 00:24 db2hia.nfy
drwxrwxrwx 2 db2hia dbhiaadm 4096 Oct 25 13:47 events
drwxrwxr-t 2 db2hia dbhiaadm 4096 Oct 27 17:40 stmmlog
-rw-rw-rw- 1 db2hia dbhiaadm 5036089 Oct 27 17:40 db2diag.log
然後,我們發出如下命令
sapsu2:db2hia 5% db2 update dbm cfg using DIAGSIZE 2
DB20000I The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.
重啟 DB2 實例後,在 db2dump 目錄中新生成了兩個文件,db2diag.0.log 和 db2hia.0.nfy。
sapsu2:db2hia 9% ls -lrt
total 30392
drwxrwxrwx 2 db2hia dbhiaadm 4096 Oct 25 13:47 events
drwxrwxr-t 2 db2hia dbhiaadm 4096 Oct 27 17:40 stmmlog
-rw-r----- 1 db2hia dbhiaadm 6291312 Oct 29 02:47 db2eventlog.000
-rw-rw-rw- 1 db2hia dbhiaadm 3148 Oct 29 02:47 db2hia.nfy
-rw-rw-rw- 1 db2hia dbhiaadm 5043787 Oct 29 02:47 db2diag.log
-rw-rw-rw- 1 db2hia dbhiaadm 12190 Oct 29 02:47 db2diag.0.log
-rw-rw-rw- 1 db2hia dbhiaadm 863 Oct 29 02:47 db2hia.0.nfy
過一段時間後,DB2 會陸續關閉舊的診斷日志文件,創建新的診斷日志文件。
sapsu2:hiaadm 4% ls -lrt
total 25472
drwxrwxrwx 2 db2hia dbhiaadm 4096 Oct 25 13:47 events
drwxrwxr-t 2 db2hia dbhiaadm 4096 Oct 27 17:40 stmmlog
-rw-rw-rw- 1 db2hia dbhiaadm 3148 Oct 29 02:47 db2hia.nfy
-rw-rw-rw- 1 db2hia dbhiaadm 5043787 Oct 29 02:47 db2diag.log
-rw-r----- 1 db2hia dbhiaadm 6291312 Oct 29 03:38 db2eventlog.000
-rw-rw-rw- 1 db2hia dbhiaadm 2775 Oct 29 03:39 db2hia.0.nfy
-rw-rw-rw- 1 db2hia dbhiaadm 172957 Oct 29 03:47 db2diag.6.log
-rw-rw-rw- 1 db2hia dbhiaadm 172957 Oct 29 03:47 db2diag.7.log
-rw-rw-rw- 1 db2hia dbhiaadm 172957 Oct 29 03:47 db2diag.8.log
-rw-rw-rw- 1 db2hia dbhiaadm 172957 Oct 29 03:47 db2diag.9.log
-rw-rw-rw- 1 db2hia dbhiaadm 172957 Oct 29 03:47 db2diag.10.log
-rw-rw-rw- 1 db2hia dbhiaadm 172957 Oct 29 03:47 db2diag.11.log
-rw-rw-rw- 1 db2hia dbhiaadm 172383 Oct 29 03:52 db2diag.12.log
-rw-rw-rw- 1 db2hia dbhiaadm 172362 Oct 29 04:00 db2diag.13.log
-rw-rw-rw- 1 db2hia dbhiaadm 172391 Oct 29 04:00 db2diag.14.log
-rw-rw-rw- 1 db2hia dbhiaadm 85909 Oct 29 04:19 db2diag.15.log
禁用輪換日志
如果要回到采用老的日志記錄方式,將 DIAGSIZE 設置為 0 並重啟 DB2 實例。在我們的例子中:
sapsu2:db2hia 5% db2 update dbm cfg using DIAGSIZE 0
DB20000I The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.
支持輪換日志的 DB2 工具
DB2 工具 db2diag、table UDF PD_GET_DIAG_HIST 和 db2support 都支持輪換日志。
通過 db2diag 工具讀取和過濾 db2 診斷文件信息。當 DIAGSIZE 不為零時,db2diag 命令會讀取所有輪換診斷日志文件,輸出格式在用戶看來沒有任何改變。
通過 table UDF PD_GET_DIAG_HIST 讀取和過濾 db2 診斷文件信息。當 DIAGSIZE 不為 0 時,該 UDF 在返回結果時會考慮所有輪換診斷日志文件。
db2support 工具也支持輪換日志記錄行為。
最佳實踐
DB2 9.7 在文檔中推薦將 DIAGSIZE 設置為大於 50MB 的數值,但不超過 DIAGPATH 所指定目錄中可用空間的 80%。但在實際生產系統中,個人建議通過觀察每周 db2diag.log 的增長速度決定 DIAGSIZE 的數值。例如據一般性統計,SAP 客戶系統的 db2diag.log 每星期增長 2 到 4MB,為避免診斷信息丟失,推薦將 DIAGSIZE 設為 1024MB(1GB)。這允許 DB2 創建至多 10 個 10MB 的管理通知日志文件和至多 10 個 90MB 的診斷日志文件,這將能涵蓋處於高壓力下數據庫產生很多的警告 / 錯誤信息的情況。
總結
本文主要介紹了 DB2 9.7 輪換日志特性。希望通過本文讀者能夠了解這種新的日志記錄形式所帶來的好處,DB2 輪換日志的工作原理和使用方式,以及在實際生產系統中的最佳實踐。