IBM Support

[Db2] ロック名が示す行のデータを表示する方法

How To


Summary

ロック待機やロック・タイムアウトなどで行ロックが問題になるとき、その行データの確認が必要になることがあります。
この文書はロック・イベント・モニターや db2pd などのモニターから得られたロック名から、その行のデータを確認する方法を案内します。

Objective

行ロック名は、その表の表スペース ID (TABLESPACE_ID)、オブジェクト ID (OBJECT_ID) とレコード ID (RID) から生成されます。
MON_FORMAT_LOCK_NAME を使用すると、行ロック名から表名およびデータ・パーティション ID (DATA_PARTITION_ID)、ページ ID (PAGEID)、行 ID (ROWID) を確認できます。レコード ID (RID) は以下の式によって生成されるため、ユーザー定義関数を作成してロック名から行の特定を簡易化します。
RID = 2^48 * DATA_PARTITION_ID + 2^16 * PAGEID + ROWID

Steps

事前準備 (データベースにつき一度のみ実行)
  1. 以下のようなテキストファイル gen_rid.sql を用意します。
    gen_rid.sql
    CREATE OR REPLACE FUNCTION GEN_RID(DATA_PARTITION_ID INTEGER, PAGEID  BIGINT, ROWID INTEGER)
      RETURNS BIGINT
      SPECIFIC GEN_RID
      RETURN DATA_PARTITION_ID * POWER(BIGINT(2),48) + PAGEID * POWER(BIGINT(2),16) + ROWID;
  2. gen_rid.sql を使用して GEN_RID スカラー関数を作成します。
    db2 connect to <db_name>
    db2 -tvf gen_rid.sql
行ロック名から行データを確認する方法
現在取得されているロック名からそのロックされている行の内容を表示する方法は以下の通りです。
  1. MON_FORMAT_LOCK_NAME 表関数を使用してロック名から表名、パーティション番号、ページID、行ID を判別します。
    db2 "SELECT * FROM TABLE(MON_FORMAT_LOCK_NAME('<ロック名>')) as t" 
    $ db2 "select * from table(MON_FORMAT_LOCK_NAME('06000500080000000000000052')) as t"
    
    NAME                 2
    -------------------- --------------------
    LOCK_OBJECT_TYPE     ROW
    ROWID                8
    DATA_PARTITION_ID    0
    PAGEID               0
    TBSP_NAME            TS1
    TABSCHEMA            DB2INST1
    TABNAME              T1
    
      7 record(s) selected.
  2. 得られた値からその RID を指定して該当行のデータを表示します。
    db2 "SELECT * FROM <TABSCHEMA>.<TABNAME> where RID(<TABSCHEMA>.<TABNAME>) = GEN_RID(<DATA_PARTITION_ID>,<PAGEID>,<ROWID>) with UR"
    $ db2 "SELECT * FROM DB2INST1.T1 where RID(DB2INST1.T1) = GEN_RID(0,0,8) with UR"
    
    C1          C2
    ----------- ------------ 
              5 AAA
    
      1 record(s) selected.
    
運用上の考慮点
  • ロック名を確認した時点からデータが更新されていないと保証できない場合、事後に確認したデータは意味がない可能性があります。
関連情報
MON_FORMAT_LOCK_NAME 表関数
[Db2] パスポート・アドバンテージによく寄せられる質問

お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

Document Location

Worldwide

[{"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":"a8m500000008PmMAAU","label":"Performance-\u003ELocks"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
24 May 2024

UID

ibm17154931