2009-12-01 使用db2diag過濾DB2診斷日誌

germany006發表於2015-07-03

要分析一個37MB的診斷日誌檔案,由於該資料庫的USEREXIT有問題,診斷日誌中記錄了大量資料庫日誌歸檔失敗的錯誤資訊,可讀性很差。透過使用db2diag命令的 -gv 選項,可以過濾掉日誌中的一些重複資訊和無關資訊,而使用 -g 選項又可以篩選其中的有用資訊,詳見下例。
這個診斷日誌檔案是從生產環境中取來的,70萬行,直接檢視眼睛都看花了~~~

db2inst1@suse-db:~/test> ls -lht db2diag-db1-new.log
-rw-rw-rw- 1 root root 37M 2009-11-30 09:44 db2diag-db1-new.log
db2inst1@suse-db:~/test> wc -l db2diag-db1-new.log
703600 db2diag-db1-new.log

[@more@]其中,絕大部分內容都是資料庫日誌歸檔失敗的錯誤資訊:

2009-11-24-20.59.48.743143+480 I76549337G369 LEVEL: Warning
PID : 9970 TID : 3086087872 PROC : db2logmgr (DDN)
INSTANCE: db2inst NODE : 000
FUNCTION: DB2 UDB, data protection, sqlpgRetryFailedArchive, probe:4780
MESSAGE : Still unable to archive log file 1624 due to rc 24 for LOGARCHMETH1
using method 4 and target .

2009-11-24-21.00.09.767137+480 E76549707G310 LEVEL: Error (OS)
PID : 9970 TID : 3086087872 PROC : db2logmgr (DDN)
INSTANCE: db2inst NODE : 000
FUNCTION: DB2 UDB, oper system services, sqloexec2, probe:2
CALLED : OS, -, unspecified_system_function OSERR: EINTR (4)

2009-11-24-21.00.09.767658+480 E76550018G482 LEVEL: Error
PID : 9970 TID : 3086087872 PROC : db2logmgr (DDN)
INSTANCE: db2inst NODE : 000
FUNCTION: DB2 UDB, data protection, sqlpgInvokeUserexit, probe:1140
MESSAGE : ADM1832E DB2 was unable to find the user exit program when archiving
log file "S0001624.LOG" from
"/mnt/data/db2inst/NODE0000/SQL00001/SQLOGDIR/" for database "DDN".
The error code was "24".

2009-11-24-21.00.09.768624+480 I76550501G384 LEVEL: Error
PID : 9970 TID : 3086087872 PROC : db2logmgr (DDN)
INSTANCE: db2inst NODE : 000
FUNCTION: DB2 UDB, data protection, sqlpgArchiveLogFile, probe:3160
MESSAGE : Failed to archive log file S0001624.LOG to USEREXIT from
/mnt/data/db2inst/NODE0000/SQL00001/SQLOGDIR/ with rc = 24.


2009-11-24-23.16.09.623814+480 I77155724G308 LEVEL: Error
PID : 9970 TID : 3086087872 PROC : db2logmgr (DDN)
INSTANCE: db2inst NODE : 000
FUNCTION: DB2 UDB, data protection, sqlpgArchivePendingLogs, probe:1500
MESSAGE : Log archive failed with rc 24 for LOGARCHMETH1.

下面使用虛擬機器上的DB2 Express-C V9.7的db2diag將這些資訊過濾掉:

db2inst1@suse-db:~/test> db2ls

Install Path Level Fix Pack Special Install Number Install Date Installer UID
---------------------------------------------------------------------------------------------------------------------
/opt/ibm/db2/V9.7 9.7.0.0 0 Mon Oct 5 00:36:24 2009 CST 0
db2inst1@suse-db:~/test> db2diag -gv proc='db2logmgr (DDN)' db2diag-db1-new.log > /tmp/db2diag-db1-new-temp01.log
db2inst1@suse-db:~/test> wc -l /tmp/db2diag-db1-new-temp01.log
121004 /tmp/db2diag-db1-new-temp01.log

注意,條件中等號右邊的內容如果有空格,需要用單引號或雙引號引起來,並且應嚴格區分大小寫。如果想不區分大小寫,應使用 -gvi 選項。

db2inst1@suse-db:~/test> db2diag -help | grep gv
-gv - case-sensitive invert matching
-gvi , -giv - case-insensitive invert matching

可以看到,過濾後的日誌檔案只剩下12萬行。當然,這樣可能會丟失db2logmgr程式相關的一些有用資訊。如果力求精確,可以在 = 左邊加上 ^ 或 : ,表示以等號右側內容開頭或包含等號右側內容,然後用MESSAGE、FUNCTION等欄位進行匹配即可。例如:

db2inst1@suse-db:~/test> db2diag -gv message^='Still unable to archive' db2diag-db1-new.log > /tmp/db2diag-db1-new-temp11.log
db2inst1@suse-db:~/test> wc -l /tmp/db2diag-db1-new-temp11.log
624375 /tmp/db2diag-db1-new-temp11.log
db2inst1@suse-db:~/test> db2diag -gv function:=sqloexec2 /tmp/db2diag-db1-new-temp11.log > /tmp/db2diag-db1-new-temp12.log
db2inst1@suse-db:~/test> wc -l /tmp/db2diag-db1-new-temp12.log
501945 /tmp/db2diag-db1-new-temp12.log
db2inst1@suse-db:~/test> db2diag -gv message:=ADM1832E /tmp/db2diag-db1-new-temp12.log > /tmp/db2diag-db1-new-temp13.log
db2inst1@suse-db:~/test> wc -l /tmp/db2diag-db1-new-temp13.log
318345 /tmp/db2diag-db1-new-temp13.log
db2inst1@suse-db:~/test> db2diag -gv message^='Failed to archive' /tmp/db2diag-db1-new-temp13.log > /tmp/db2diag-db1-new-temp14.log
db2inst1@suse-db:~/test> wc -l /tmp/db2diag-db1-new-temp14.log
175545 /tmp/db2diag-db1-new-temp14.log
db2inst1@suse-db:~/test> db2diag -gv message^='Log archive failed' /tmp/db2diag-db1-new-temp14.log > /tmp/db2diag-db1-new-temp15.log
db2inst1@suse-db:~/test> wc -l /tmp/db2diag-db1-new-temp15.log
121049 /tmp/db2diag-db1-new-temp15.log

本例中沒有使用上述方法,只是用PROC欄位進行了過濾。接下來,用同樣的方法,繼續以PID、PROC等欄位進行一系列過濾:

db2inst1@suse-db:~/test> db2diag -gv pid=9844 /tmp/db2diag-db1-new-temp01.log > /tmp/db2diag-db1-new-temp02.log
db2inst1@suse-db:~/test> wc -l /tmp/db2diag-db1-new-temp02.log
67116 /tmp/db2diag-db1-new-temp02.log
db2inst1@suse-db:~/test> db2diag -gv pid=9845 /tmp/db2diag-db1-new-temp02.log > /tmp/db2diag-db1-new-temp03.log
db2inst1@suse-db:~/test> wc -l /tmp/db2diag-db1-new-temp03.log
13484 /tmp/db2diag-db1-new-temp03.log
db2inst1@suse-db:~/test> db2diag -gv proc=db2hmon /tmp/db2diag-db1-new-temp03.log > /tmp/db2diag-db1-new-temp04.log
db2inst1@suse-db:~/test> wc -l /tmp/db2diag-db1-new-temp04.log
12374 /tmp/db2diag-db1-new-temp04.log
db2inst1@suse-db:~/test> db2diag -gv pid=5686 /tmp/db2diag-db1-new-temp04.log > /tmp/db2diag-db1-new-temp05.log
db2inst1@suse-db:~/test> db2diag -gv pid=5687 /tmp/db2diag-db1-new-temp05.log > /tmp/db2diag-db1-new-temp06.log
db2inst1@suse-db:~/test> wc -l /tmp/db2diag-db1-new-temp06.log
11814 /tmp/db2diag-db1-new-temp06.log
db2inst1@suse-db:~/test> cp /tmp/db2diag-db1-new-temp06.log ./db2diag-db1-new_1.log

處理後的日誌檔案db2diag-db1-new_1.log只有1萬多行,根據其內容分析問題就比較方便了。此時,如果只想檢視其中的部分日誌資訊,可以使用 -g 選項進行篩選,它和 -gi 的用法與 -gv 和 -gvi 類似。

db2inst1@suse-db:~/test> db2diag -help | grep '-g' | grep -v gv
-filter , -g - case-sensitive search for a list of field-pattern pairs
-gi - case-insensitive search for a list of field-pattern pairs

例如,檢視等級為嚴重的資訊:

db2diag -g level=Severe db2diag-db1-new_1.log | more

又如,檢視db2sys產生的等級為嚴重的日誌資訊:

db2diag -g level=Severe,proc=db2sysc db2diag-db1-new_1.log | more

如果想同時檢視同一欄位兩種不同內容的資訊,就需要使用一些欄位特有的專用選項,如檢視等級為嚴重和錯誤的日誌資訊:

db2diag -level 'Severe,Error' db2diag-db1-new_1.log | more

db2diag還有很多其它功能和用法,可透過 db2diag -help 檢視。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28371090/viewspace-1721208/,如需轉載,請註明出處,否則將追究法律責任。

相關文章