Question & Answer
Question
db2diag.log にエラー・メッセージなどが出力されたタイミングで資料を取得する方法はありますか?
Answer
db2pdcfg コマンドのオプション -catch <キーワード> db2cos [count=<count>] により、db2diag.log への出力をトリガーに資料収集用スクリプト (db2cos) を実行できます。
設定コマンド:
ここで、<キーワード>に指定できる内容は次の通り。
デフォルトの db2cos では db2pd -inst などわずかな資料しか取得しません。資料収集コマンドを追加する場合は、次の要領で設定します。
[Unix/Linuxの場合]
db2pdcfg -catch <キーワード> db2cos で指定したキーワードが db2diag.log へ出力されたタイミングで、デフォルトでは ~/sqllib/bin/db2cos が実行されます。資料収集コマンドを追加する場合は、まずディレクトリ ~/sqllib/adm に db2cos をコピーの上編集するようにします。(~/sqllib/adm/db2cos が存在する場合、こちらが優先して実行されます)
db2cos 内の「 case "$reason" in 」と書かれた行から「 esac 」と書かれた行の間にある、各キーワードごとのセクション内に追加の資料収集コマンドを記入します。(下記の<>で囲まれた箇所)
db2cos抜粋:
追加した資料収集コマンドがうまく実行されない場合は、~/sqllib/adm/db2cos の冒頭や「 case "$reason" in 」と書かれた行の前など、かならず実行されそうな箇所に追記します。
注意: db2cos の中身を全て消去し、独自の資料収集コマンドに完全に置き換えた場合は、データ・ベースのページ破損やインスタンス・トラップ発生時に自動的に実行される db2cos による資料収集で必要な資料が取得されなくなります。
[Windows の場合]
db2pdcfg -catch <キーワード> db2cos で指定したキーワードが db2diag.log へ出力されたタイミングで、 db2cos.bat が実行されます。
db2cos.bat は、 Db2 インストール・パスの下の BIN フォルダー内(デフォルトでは C:¥Program Files¥IBM¥SQLLIB\BIN)に存在します。
db2cos.bat に資料収集コマンドを追加する場合は、このファイルを直接編集します。(元のファイルは別名保管することをお勧めします)
キーワード検出時に独自の資料収集コマンドを実行する場合は、db2cos.bat 内の「 :: Place your commands here : 」の行の下に追記します。(下記の<>で囲まれた箇所)
db2cos.bat 抜粋:
実行例
Unix/Linux において、db2diag.log に文字列 "Session" を含むメッセージが出力された場合に、Db2 トレースのダンプと、 db2pd -eve 出力が取得されるようにするには、次のように設定します。
db2cos (コールアウト・スクリプト) 出力ファイル
一般的な障害問題に基づく診断情報の収集
DB2 製品資料収集ガイド
設定コマンド:
db2pdcfg -catch diagstr="<キーワード>" db2cos count=<資料収集回数>
確認コマンド:
db2pdcfg -catch status
解除コマンド:
db2pdcfg -catch clear
ここで、<キーワード>に指定できる内容は次の通り。
- sqlcode=<sqlCode>[,<reasonCode>] (sqlCodeとresonCodeの間をカンマで区切ります。例:sqlcode=-911,68)
- ZRC コード(16進数、整数もしくは文字定数。例:0x80100024 か -2146435036 もしくは SQLP_NOTA)
- ADM コード(例:ADM1611)
- MESSAGE 出力の一部(例:diagstr="Hello World")
- ECF コード(16進数、整数もしくは文字定数。例:0x9000001A か -1879048166 もしくは ECF_FILE_DOESNT_EXIST)
- "deadlock" もしくは "locktimeout"
デフォルトの db2cos では db2pd -inst などわずかな資料しか取得しません。資料収集コマンドを追加する場合は、次の要領で設定します。
[Unix/Linuxの場合]
db2pdcfg -catch <キーワード> db2cos で指定したキーワードが db2diag.log へ出力されたタイミングで、デフォルトでは ~/sqllib/bin/db2cos が実行されます。資料収集コマンドを追加する場合は、まずディレクトリ ~/sqllib/adm に db2cos をコピーの上編集するようにします。(~/sqllib/adm/db2cos が存在する場合、こちらが優先して実行されます)
db2cos 内の「 case "$reason" in 」と書かれた行から「 esac 」と書かれた行の間にある、各キーワードごとのセクション内に追加の資料収集コマンドを記入します。(下記の<>で囲まれた箇所)
db2cos抜粋:
case "$reason" in
(省略)
"LOCKTIMEOUT")
<locktimeout 検出時に実行する追加のコマンドをここに追記>
echo "Lock Timeout Caught" >> $logfile
if [ ! -n "$database" ]
then
db2pd -inst >> $db2pd_outfile
else
db2pd -db $database -inst >> $db2pd_outfile
fi
;;
"DEADLOCK")
<deadlock 検出時に実行する追加のコマンドをここに追記>
echo "Lock Deadlock Caught" >> $logfile
if [ ! -n "$database" ]
then
db2pd -inst >> $db2pd_outfile
else
db2pd -db $database -inst >> $db2pd_outfile
fi
;;
"SQLCODE")
<sqlcode 検出時に実行する追加のコマンドをここに追記>
echo "Sqlcode Caught" >> $logfile
eventLog_dump=true
cd $diagpath
if [ ! -n "$database" ]
then
db2pd -inst >> $db2pd_outfile
db2pd -alldbs -customer -sortheapconsumer file=db2pd.sortheap.alldbs.bin >> $logfile
db2pd -allmembers -inst -alldbs -dbptnmem -memsets -mempools >> $db2pd_mem_outfile
db2pd -allmembers -inst -alldbs -dbptnmem -memsets -mempools subpool >> $db2pd_mem_outfile.detailed
else
db2pd -db $database -inst >> $db2pd_outfile
db2pd -db $database -customer -sortheapconsumer file=db2pd.sortheap.$database.bin >> $logfile
db2pd -allmembers -inst -db $database -dbptnmem -memsets -mempools >> $db2pd_mem_outfile
db2pd -allmembers -inst -db $database -dbptnmem -memsets -mempools subpool >> $db2pd_mem_outfile.detailed
fi
;;
(省略)
"ADMCODE")
<ADM コード検出時に実行する追加のコマンドをここに追記>
echo "ADM Code Caught" >> $logfile
if [ ! -n "$database" ]
then
db2pd -inst >> $db2pd_outfile
else
db2pd -db $database -inst >> $db2pd_outfile
fi
;;
"DIAGSTRING")
<diagstr 検出時に実行する追加のコマンドをここに追記>
echo "Diag String Caught" >> $logfile
cd $diagpath
if [ ! -n "$database" ]
then
db2pd -inst >> $db2pd_outfile
db2pd -alldbs -customer -sortheapconsumer file=db2pd.sortheap.alldbs.bin >> $logfile
db2pd -allmembers -inst -alldbs -dbptnmem -memsets -mempools subpool >> $db2pd_mem_outfile
db2pd -allmembers -inst -alldbs -dbptnmem -memsets -mempools subpool >> $db2pd_mem_outfile.detailed
else
db2pd -db $database -inst >> $db2pd_outfile
db2pd -db $database -customer -sortheapconsumer file=db2pd.sortheap.$database.bin >> $logfile
db2pd -allmembers -inst -db $database -dbptnmem -memsets -mempools subpool >> $db2pd_mem_outfile
db2pd -allmembers -inst -db $database -dbptnmem -memsets -mempools subpool >> $db2pd_mem_outfile.detailed
fi
;;
(省略)
*)
echo "Unknown type!" >> $logfile
;;
esac
追加した資料収集コマンドがうまく実行されない場合は、~/sqllib/adm/db2cos の冒頭や「 case "$reason" in 」と書かれた行の前など、かならず実行されそうな箇所に追記します。
注意: db2cos の中身を全て消去し、独自の資料収集コマンドに完全に置き換えた場合は、データ・ベースのページ破損やインスタンス・トラップ発生時に自動的に実行される db2cos による資料収集で必要な資料が取得されなくなります。
[Windows の場合]
db2pdcfg -catch <キーワード> db2cos で指定したキーワードが db2diag.log へ出力されたタイミングで、 db2cos.bat が実行されます。
db2cos.bat は、 Db2 インストール・パスの下の BIN フォルダー内(デフォルトでは C:¥Program Files¥IBM¥SQLLIB\BIN)に存在します。
db2cos.bat に資料収集コマンドを追加する場合は、このファイルを直接編集します。(元のファイルは別名保管することをお勧めします)
キーワード検出時に独自の資料収集コマンドを実行する場合は、db2cos.bat 内の「 :: Place your commands here : 」の行の下に追記します。(下記の<>で囲まれた箇所)
db2cos.bat 抜粋:
:: ##############################################################################
:: ############################ EXECUTION PART #############################
:: ##############################################################################
@rem For now this will only be enable for debug builds
if %DB2_DEBUG%. == TRUE. db2wdbg -p %PID% -minidump -dumpdir %DIAGPATH%
if %DATABASE%. == . goto no_database
db2pd -db %DATABASE% -inst >> %logfile%
goto exit
:no_database
db2pd -inst >> %logfile%
::
:: Place your commands here :
<キーワード検出時に実行する追加のコマンドをここに追記>
:: ##############################################################################
:: ############################ FINISH PART ################################
:: ##############################################################################
実行例
Unix/Linux において、db2diag.log に文字列 "Session" を含むメッセージが出力された場合に、Db2 トレースのダンプと、 db2pd -eve 出力が取得されるようにするには、次のように設定します。
- db2cos のコピー
~/sqllib/bin/db2cos を ~/sqllib/adm/ の下にコピーします。cp ~/sqllib/bin/db2cos ~/sqllib/adm/db2cos chmod 755 ~/sqllib/adm/db2cos
- db2cos の編集
条件分岐 case で、値が "DIAGSTRING" 場合に、次のように追記。
※トレースなどの出力先を変更する場合は、追記コマンド中の$diagpath(=~/sqllib/db2dump)を任意のフル・パスに書き換えます。
編集前:"DIAGSTRING") echo "Diag String Caught" >> $logfile if [ ! -n "$database" ] then db2pd -inst >> $db2pd_outfile else db2pd -db $database -inst >> $db2pd_outfile fi ;;
編集後:"DIAGSTRING") #>>>追記ここから MYTS1=`date +'%Y%m%d_%H%M%S'` db2pd -eve > $diagpath/db2pd_eve_${MYTS1}.out MYTS2=`date +'%Y%m%d_%H%M%S'` db2trc dmp $diagpath/db2trc_${MYTS2}.dmp >> $logfile 2>&1 db2trc off >> $logfile 2>&1 db2trc on -t -l 256m >> $logfile 2>&1 #<<<追記ここまで echo "Diag String Caught" >> $logfile if [ ! -n "$database" ] then db2pd -inst >> $db2pd_outfile else db2pd -db $database -inst >> $db2pd_outfile fi ;;
- Db2 トレース・バッファーの拡張
トレース開始時に指定できるトレース・バッファーの最大サイズは、インスタンス起動時に確保済みのサイズを超えることはできません。
上記では Db2 トレースをバッファー・サイズ 256M を指定して開始するよう db2cos に設定(db2trc on -l 256m)したため、デフォルトのトレース・バッファー 128M を 256MB に拡張しておきます。
設定を反映させるにはインスタンスの再起動が必要です。db2set DB2TRC_DEF_BUFFSIZE=256M db2stop db2start
- Db2 トレースの開始と、トレース・サイズの設定反映の確認
$ db2trc on -l 256m Trace is turned on $ db2trc info Marker : @TRACE@ Trace version : 7.0 Platform : AIX 64BIT Build level : s130918 maxBufferSize : 268435456 bytes (256 MB) auxBufferSize : 0 bytes (0 MB) allocationCount : 1 DB2TRCD pid : 0 Trace destination : <shared memory buffer> numSuspended : 0 Trace starting time : 2018-01-19-06.24.30.485538+540 Buffer size : 268435456 bytes (256 MB) <-トレース・バッファー・サイズを確認 Allow buffer to wrap : yes Mask : *.*.*.*.* Timestamps : disabled PID.TID mask : all Fixed data mask #1 : all Fixed data mask #2 : all Max system errors : infinite Treat this rc as sys err: none Member mask : none Application handle mask : none Application ID mask : none
- db2pdcfg による db2diag.log の監視の設定
ここでは、MESSAGE に "Session" が含まれるエントリー出力時に資料収集するよう次のように設定します。
※ db2pdcfgの設定はインスタンス起動のたびに実行する必要があります。$ db2pdcfg -catch diagstr="Session" db2cos Error Catch #1 Sqlcode: 0 ReasonCode: 0 ADMCode: 0 DiagText: Session <-diagstr=に指定したキーワード ZRC: 0 ECF: 0 Component ID: 0 LockName: Not Set LockType: Not Set Current Count: 0 Max Count: 255 <- count を設定しない場合の最大呼び出し回数 Bitmap: 0x8421 Action: Error code catch flag enabled Action: Execute /home/db2inst1/sqllib/adm/db2cos callout script Action: Produce stack trace in db2diag.log
- 資料収集状況の確認
db2diag.log には、MESSAGE に "Session" が含まれるエントリーが 3 回出力されています。$ db2diag -g msg:=Session 2018-01-19-06.27.15.713486+540 I13338A457 LEVEL: Warning PID : 48890358 TID : 2571 PROC : db2sysc 0 INSTANCE: db2inst1 NODE : 000 HOSTNAME: myhost1 EDUID : 2571 EDUNAME: db2tcpcm 0 FUNCTION: DB2 UDB, fast comm manager, sqkfDynamicResourceMgr::AdjustResources, probe:175 MESSAGE : FCM Automatic/Dynamic Resource Adjustment (Session): 128 successfully allocated. New total is 256 2018-01-19-06.29.24.994574+540 I21421A457 LEVEL: Warning PID : 48890358 TID : 2314 PROC : db2sysc 0 INSTANCE: db2inst1 NODE : 000 HOSTNAME: myhost1 EDUID : 2314 EDUNAME: db2tcpcm 0 FUNCTION: DB2 UDB, fast comm manager, sqkfDynamicResourceMgr::AdjustResources, probe:175 MESSAGE : FCM Automatic/Dynamic Resource Adjustment (Session): 128 successfully allocated. New total is 384 2018-01-19-06.31.34.239392+540 I30186A457 LEVEL: Warning PID : 48890358 TID : 2571 PROC : db2sysc 0 INSTANCE: db2inst1 NODE : 000 HOSTNAME: myhost1 EDUID : 2571 EDUNAME: db2tcpcm 0 FUNCTION: DB2 UDB, fast comm manager, sqkfDynamicResourceMgr::AdjustResources, probe:175 MESSAGE : FCM Automatic/Dynamic Resource Adjustment (Session): 128 successfully allocated. New total is 512
このとき、db2pdcfg -catch のステータスは次のように変化します。$ db2pdcfg -catch status Error Catch #1 Sqlcode: 0 ReasonCode: 0 ADMCode: 0 DiagText: Session ZRC: 0 ECF: 0 Component ID: 0 LockName: Not Set LockType: Not Set Current Count: 3 <- db2cos を 3 回呼び出し済み Max Count: 255 Bitmap: 0x8421 Action: Error code catch flag enabled Action: Execute /home/db2inst1/sqllib/adm/db2cos callout script Action: Produce stack trace in db2diag.log
- 問題再現確認後の設定クリア
$ db2pdcfg -catch clear All error catch flag settings cleared.
- 問題再現確認後のDB2トレースのフォーマット
XXXXXXおよびYYYYYYは適宜実際のタイムスタンプに置き換えます。db2trc flw -t -wc db2trc_YYYYYY.dmp db2trc_YYYYYY.flw db2trc fmt db2trc_YYYYYY.dmp db2trc_.fmt db2trc perfrep db2trc_YYYYYY.dmp db2trc_sort_timeelapsed_YYYYYY.perfrep -sort timeelapsed db2trc perfrep db2trc_YYYYYY.dmp db2trc_sort_timespent_YYYYYY.perfrep -sort timespent
db2cos (コールアウト・スクリプト) 出力ファイル
一般的な障害問題に基づく診断情報の収集
DB2 製品資料収集ガイド
[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m0z0000001he2AAA","label":"DB2 Tools-\u003Edb2pdcfg"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]
Was this topic helpful?
Document Information
Modified date:
06 December 2022
UID
swg22013145