IBM Support

[Db2] db2diag.log に出力されたメッセージをトリガーに資料を取得する方法

Question & Answer


Question

db2diag.log にエラー・メッセージなどが出力されたタイミングで資料を取得する方法はありますか?

Answer

db2pdcfg コマンドのオプション -catch <キーワード> db2cos [count=<count>] により、db2diag.log への出力をトリガーに資料収集用スクリプト (db2cos) を実行できます。

設定コマンド:
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 出力が取得されるようにするには、次のように設定します。
 
  1. db2cos のコピー
    ~/sqllib/bin/db2cos を ~/sqllib/adm/ の下にコピーします。
    cp ~/sqllib/bin/db2cos ~/sqllib/adm/db2cos
    chmod 755 ~/sqllib/adm/db2cos
  2. 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
    ;;
  3. Db2 トレース・バッファーの拡張
    トレース開始時に指定できるトレース・バッファーの最大サイズは、インスタンス起動時に確保済みのサイズを超えることはできません。
    上記では Db2 トレースをバッファー・サイズ 256M を指定して開始するよう db2cos に設定(db2trc on -l 256m)したため、デフォルトのトレース・バッファー 128M を 256MB に拡張しておきます。
    設定を反映させるにはインスタンスの再起動が必要です。
    db2set DB2TRC_DEF_BUFFSIZE=256M
    db2stop
    db2start
  4. 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
  5. 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
    
  6. 資料収集状況の確認
    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
  7. 問題再現確認後の設定クリア
    $ db2pdcfg -catch clear
    All error catch flag settings cleared.
  8. 問題再現確認後の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"}]

Document Information

Modified date:
06 December 2022

UID

swg22013145