Db2: db2diag.log の取得には　PD_GET_DIAG_HISTが使用できます。

## db2diag.log の取得には　PD_GET_DIAG_HISTが使用できます。



たとえば　[IBM Db2 Warehouse on Cloud](https://www.ibm.com/cloud/db2-warehouse-on-cloud)  のような　fully-managedのDb2 システムでは　管理者でもDb2 診断 (db2diag) ログ・ファイルなどを参照するのが難しいですよね。　そんな時は　PD_GET_DIAG_HIST 表関数が使用できます。　

PD_GET_DIAG_HIST 表関数は十分な権限を持ったユーザーを使用してDb2 データベースに接続して使用します。

今回は　Db2 WoC (Warehouse on Cloud)のコンソールでdb2diag.logの内容を入手してみましょう。

(参考) PD_GET_DIAG_HIST 表関数 ..  https://www.ibm.com/docs/ja/db2/11.5?topic=mrv-pd-get-diag-hist-return-records-from-facility

-----------------------------------------------

本手順はIBM Db2 Warehouse on Cloud (Db2 ｖ11.5.5)で確認しています。
これらの技術を自身の環境に適用する際には、自己の責任において十分な検証と確認を実施いただくことをお奨めいたします。

-----------------------------------------------

### 例1 特定の期間の状況を取得する

例えば　次のSQLを使用すると2021-06-15に記録されたレコードの 時刻や重大度、発生したメンバーID 、コンポーネントを取得できます。

(ポイント！)　PD_GET_DIAG_HISTの最後の引数に-2(すべてのアクティブ・データベース・メンバー)を指定することで　メンバー別に分割されたログファイルを気にすることなく参照できます。　特定のメンバーを参照したい時は　ここにINTEGERで指定します。

```SQL
select 
	TIMESTAMP							-- メッセージが作成された時刻。
	, LEVEL								-- レコードの重大度レベル
	, MEMBER							-- データベース・メンバーID
	, PRODUCT							-- メッセージを作成したプロダクトの名前。
	, COMPONENT							-- メッセージを作成したコンポーネントの名前。
FROM TABLE (PD_GET_DIAG_HIST(
      'MAIN'								-- facility : MAIN .. 一般診断ログ
      , 'ALL'								-- rectype : ALL .. すべてのレコード・タイプ 
      , NULL								
      -- impact : NULL .. すべてのレコード
      , timestamp('2021-06-15-00.00.00')	-- start_time
      , timestamp('2021-06-16-00.00.00')	-- end_time
      ,-2))									-- member -2 .. すべてのアクティブ・データベース・メンバー
order by TIMESTAMP 
;
```

Db2 WoC (Warehouse on Cloud)のコンソールの"SQLの実行"を開いて 上↑のSQLを入力し、"すべて実行"をClickします。

![No04_PD_GET_DIAG_HIST_Sum1_202106171.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855502/1eff8482-bb73-7aa9-fb1c-c4834d6fde3b.jpeg)



"読み込まれたすべてのレコードを表示"を選択すると　状況が取得できています。

![No04_PD_GET_DIAG_HIST_Sum2_20210616.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855502/6477ca02-a7cd-3bd0-5813-298c90b76b26.jpeg)


### 例2 フォーマット済みのdb2diag.logレコードを取得する

おなじみの形式のdb2diag.logのレコードはFULLRECで取得できます。SQLの例は次です。

```SQL
select FULLREC						-- FULLREC レコード全体のフォーマット済みテキスト・バージョン
  FROM TABLE (PD_GET_DIAG_HIST(
  	'MAIN'
  	,'ALL'
  	, NULL
  	,timestamp('2021-06-15-09.24.38')
  	,timestamp('2021-06-15-09.24.39')
  	,-2))
order by TIMESTAMP 
;
```

同様に　Db2 WoC (Warehouse on Cloud)のコンソールの"SQLの実行"を開いて 上↑のSQLを入力し、"すべて実行"をClickします。

![No04_PD_GET_DIAG_HIST_Dtl1_20210616.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855502/f03e2706-49d2-36ee-1afa-3af1707687bf.jpeg)


"CSV形式でエクスポート"すると　ファイルがDownloadされ　次のようなおなじみの形式が得られます。

```
FULLREC
"2021-06-15-09.24.38.268775+000 I26454118E2699        LEVEL: Warning
PID     : 36421                TID : 140134819829504 PROC : db2fmp (
INSTANCE: db2inst1             NODE : 005
HOSTNAME: dashmpp-head-0
FUNCTION: DB2 UDB, oper system services, SqloURLResponseS3::SqloURLResponseS3_Parse, probe:20
MESSAGE : ZRC=0x870F01E1=-2029059615=SQLO_URL_UNKNOWN_HEADER
          ""An unrecognized header is detected in the URL response""
DATA #1 : Codepath, 8 bytes
3:5:43
DATA #3 : Hexdump, 19 bytes
(省略)
",
"2021-06-15-09.24.38.285891+000 I26456818E2054        LEVEL: Error
PID     : 36421                TID : 140134819829504 PROC : db2fmp (
INSTANCE: db2inst1             NODE : 005
HOSTNAME: dashmpp-head-0
FUNCTION: DB2 UDB, oper system services, SqloURLRequestS3::Submit, probe:20
(省略)
",
```



## まとめ

- PD_GET_DIAG_HIST 表関数は十分な権限を持ったユーザーを使用してDb2 データベースに接続して使用します。
- [IBM Db2 Warehouse on Cloud](https://www.ibm.com/cloud/db2-warehouse-on-cloud)  のような　fully-managedのDb2 システムでも　PD_GET_DIAG_HIST 表関数を使用してdb2diag.logが参照できます。
- PD_GET_DIAG_HIST 表関数は　SQLで書くので 必要なレコードのみが取得できます。
- PD_GET_DIAG_HISTの最後の引数に-2(すべてのアクティブ・データベース・メンバー)を指定することで　メンバー別に分割されたログファイルを気にすることなく　参照することが可能です。