本番環境では、DDLの実行時間が長く、実行プロセスが可視化されていないことがよくあります。この問題を解決するため、OceanBaseデータベースV4.1ではDDLのリアルタイム実行進捗監視機能が導入され、DDLの実行進捗情報がGV$SESSION_LONGOPSビューに表示されるようになりました。詳細については、GV$SESSION_LONGOPSを参照してください。
本記事では、DDL実行プロセスの監視方法と一般的な問題の診断方法について説明します。インデックス作成、主キー追加、列削除の3つの典型的なシナリオを通じて、GV$SESSION_LONGOPSの監視機能を説明します。インデックス作成は単独のDDLタスク、主キー追加は親子関係のDDLタスク、列削除も親子関係ですが、非ソート方式でデータ補完を行います。
監視プロセスでは、2つのセッションを作成する必要があります。1つはDDL操作を実行するために使用し、もう1つはGV$SESSION_LONGOPSビューをクエリするために使用します。両方のセッションは通常テナントとしてシステムにログインします。
以下のステートメントを使用してGV$SESSION_LONGOPSビューのフィールドを確認できます:
SELECT * FROM oceanbase.gv$session_longops\G
インデックス作成の監視
インデックス作成操作では、主にインデックスデータの補完段階で時間がかかります。特定の環境下では、インデックス作成プロセスが同時実行トランザクションの影響を受ける可能性があります。以下では、トランザクション終了待ち段階とデータ補完段階の進捗監視について説明します。
トランザクション終了待ち段階
*************************** 1. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF63AE10FBBB-0-0
OPNAME: create index
TARGET: __idx_500005_i1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 7
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 2, STATUS: WAIT TRANS END, PENDING_TX_ID: 76
トランザクション終了待ち段階では、MESSAGEフィールドにWAIT TRANS END状態が表示され、最初の終了していないトランザクションのIDが表示されます(例:PENDING_TX_ID: 76)。詳細なトランザクション情報は、__all_virtual_trans_statテーブルの対応するtrans_idをクエリすることで取得できます。
トランザクション補完段階
*************************** 1. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF60F182F228-0-0
OPNAME: create index
TARGET: __idx_500008_i1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 38
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 6, STATUS: REPLICA BUILD, ROW_SCANNED: 10000000, ROW_SORTED: 19771966, ROW_INSERTED: 0
データ補完段階では、MESSAGEフィールドに以下の重要な情報が含まれます:
- TENANT_ID: テナント識別子
- TASK_ID: DDLタスク識別子
- STATUS: 現在の実行状態。
REPLICA BUILDはデータ補完段階にあることを示します。 - ROW_SCANNED: プライマリテーブルでスキャンされたデータ行数
- ROW_SORTED: ソート処理された行数
- ROW_INSERTED: インデックステーブルに書き込まれた行数
ソート処理では複数回のマージ操作が必要になる場合があるため、ROW_SORTEDの値は通常ROW_SCANNEDやROW_INSERTEDよりも大きくなります。
カラムストアバージョンの特性
カラムストアバージョンが導入された後、データ補完の監視は変更されました。システムはカラムストアテーブルと行ストアテーブルを区別し、カラムストアバージョン以前のテーブルおよび行と列が混在するテーブルはすべて行ストアテーブルと見なされます。
データ補完プロセスの違い:
- 行ストアテーブル:データは一時ファイルに書き込まれた後、直接マクロブロックに書き込まれます。
- カラムストアテーブル:データは一時ファイルに書き込まれた後、さらにカラムストアSSテーブルに書き込まれます。総行数はcolumn_group_cnt * row_countです。
データ補完段階のMESSAGE情報例:
- 行ストアテーブル:
TENANT_ID: 1004, TASK_ID: 4514, STATUS: REPLICA BUILD, ROW_SCANNED: 779, ROW_SORTED: 0, ROW_INSERTED: 0 - カラムストアテーブル:
TENANT_ID: 1004, TASK_ID: 6064, STATUS: REPLICA BUILD, ROW_SCANNED: 100000, ROW_SORTED: 200000, ROW_INSERTED_TMP_FILE: 100000, ROW_INSERTED_SSTABLE: 500000 out of 500000 done
主キーの追加を監視する
主キーの追加操作はインデックスの構築とは異なり、主キーを追加するデータの補完段階では、GV$SESSION_LONGOPSに2つのレコードが表示されます。1つのレコードは主表上のインデックス補完を示し、もう1つのレコードは主表自体の変更を示します。各フィールドの意味はインデックス構築プロセスと同様です。
*************************** 1. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF60F182F22F-0-0
OPNAME: create index
TARGET: __idx_500030_i1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 6
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 8, STATUS: REPLICA BUILD, ROW_SCANNED: 5518389, ROW_SORTED: 0, ROW_INSERTED: 0
*************************** 2. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF60F182F22F-0-0
OPNAME: add primary key
TARGET: t1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 63
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 7, STATUS: COPY DEPENDENT OBJECTS, CHILD TASK IDS: [ 8 ]
列削除の観測
*************************** 1. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF60F182F240-0-0
OPNAME: drop column
TARGET: t1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 26
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 13, STATUS: COPY DEPENDENT OBJECTS, CHILD TASK IDS: [ 14 ]
*************************** 2. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF60F182F240-0-0
OPNAME: create index
TARGET: __idx_500076_i1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 8
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 14, STATUS: REPLICA BUILD, ROW_SCANNED: 10000000, ROW_SORTED: 213098, ROW_INSERTED: 0
列削除操作におけるデータ補完はソート段階を含まないため、MESSAGEフィールドにはROW_SCANNEDとROW_INSERTEDの情報のみが含まれます。同様の操作には、中間位置に非生成列を追加する場合などがあります。