はじめに

Verticaで冗長化構成にしている場合、障害等でノードが停止し再起動すると、以下のような順番で停止したノードのステータスが遷移します。本稿では、障害からの復旧時、リカバリの状況を確認する方法を解説します。
※ノードが停止中に反映できなかったデータをコピーするため、一般的に「RECOVERING」の状態が最も時間がかかります。


[ステータスについて]
ステータス説明
DOWNノードは停止中の状態です。ノードを再起動した場合、Spreadデーモンを再起動します。また、ディスク上のカタログを読み込み、カタログで指定されたデータファイルをチェックします。
INITIALIZINGノードは初期化中の状態です。Verticaのクラスタに参加し、未実行のカタログイベントをチェックして再実行します。
RECOVERINGノードはリカバリ中の状態です。リカバリが必要なテーブル一覧を作成し、テーブルのリカバリを実行します。
READYノードは起動準備が完了した状態です。
UPノードは起動した状態です。すべてのデータベース上の処理に参加して、実行します。

リカバリ状況の確認

【1】停止しているノードを起動します。以下の実行例では、ノード1が停止しています。

【2】ノードのステータスを確認します。ノード1のステータスが「INITIALIZING」に遷移しました。

【3】ノードのステータスが「DOWN」または「INITIALIZING」の場合は、tailコマンドを「startup.log」に実行することで、リカバリの進捗状況を確認できます。「startup.log」は、リカバリが実行されているノードで確認してください。

※後述の「TABLE_RECOVERY_STATUS」、「TABLE_RECOVERIES」、「PROJECTION_RECOVERIES」システムテーブルは、ノードのステータスが「DOWN」または「INITIALIZING」の場合は進捗状況を確認できません。

【4】ノードのステータスを確認します。ノード1のステータスが「RECOVERING」に遷移しました。

【5】ノードのステータスが「RECOVERING」に遷移した場合は、システムテーブルを使用して、進捗状況を確認します。

【5】-①リカバリのサマリを確認する場合は、次のSQLを実行します。

SELECT * FROM TABLE_RECOVERY_STATUS;
[TABLE_RECOVERY_STATUS]
項目名説明
NODE_NAMEノード名
NODE_RECOVERY_START_TIME開始時刻
RECOVER_EPOCHリカバリ対象のエポック
RECOVERING_TABLE_NAME現在リカバリを実行中のテーブル名
TABLES_REMAINノード上でリカバリが必要な残りのテーブル数
※リカバリが進行すると、この数は減少していく
IS_RUNNING現在リカバリを実行中かどうか


[実行例]

【5】-②テーブルのリカバリを確認する場合は、次のSQLを実行します。

SELECT * FROM TABLE_RECOVERIES;
[TABLE_RECOVERIES]
項目名説明
NODE_NAMEノード名
TABLE_OIDテーブルのOID
TABLE_NAMEテーブル名
STATUSテーブルのステータス、値は以下のいずれか。リカバリが開始前のテーブルはNULLが出力される。
・RECOVERED:リカバリ完了
・RECOVERING:リカバリ中
・ERROR_RETRY:リカバリ失敗
PHASEリカバリのフェーズ、値は以下のいずれか。
・Historical:「DOWN」または「INITIALIZING」ステータス時に見逃した可能性のある履歴データをコピーする。 (ロック=未発生)
・Historical Dirty:リカバリが開始された後で、コミットされたDMLトランザクションを全てリカバリしなおす。(ロック=未発生)
・Current Replay Delete:リカバリ中に発生した削除トランザクションを全て再生する。(ロック="T"発生)
・Aggregate Projections:アグリゲートプロジェクションをリカバリする。(ロック="T"発生)
THREAD_IDリカバリを実行したスレッドID
START_TIME開始時刻
END_TIME完了時刻
RECOVER_PRIORITYリカバリを実行するテーブルの優先度
RECOVER_ERRORリカバリが失敗した場合のエラー内容
IS_HISTORICAL「t」の場合は、現在のプロセスのリカバリ情報が含まれる。


[実行例]

【5】-③プロジェクションのリカバリを確認する場合は、次のSQLを実行します。

SELECT * FROM PROJECTION_RECOVERIES;
[PROJECTION_RECOVERIES]
項目名説明
NODE_NAMEノード名
PROJECTION_IDプロジェクションID
PROJECTION_NAMEプロジェクション名
TRANSACTION_IDトランザクションID
STATEMENT_ID現在実行中のステートメントID。NULLは、現在ステートメントが実行されていないことを示す。
TRANSACTION_IDとSTATEMENT_IDの組み合わせで、セッション内のステートメントを一意に識別できる。
METHODVerticaが選択したリカバリ方法。値は以下のいずれか。
・incremental
・incremental-replay-delete
・split
・recovery-by-container
STATUSプロジェクションのリカバリ状況。値は以下のいずれか。
・queued
・running
・finished
・ignored
・error-retry
・error-fatal
PROGRESSリカバリ・タスクが完了している割合([0~100]の範囲)。タスクが完了後の値は、NULLを出力する。
DETAILリカバリ計画のタイプによって値は異なり、以下のいずれか。完了後、NULLが出力される。
・General recovery plans:計画(スキャン、ソート、書込み)の進捗状況(%)
・Recovery-by-container plans:「CopyStorage:総バイト数/コピーされたバイト数」
・Replay delete plans:「Delete:Replay deleteの合計数/Replay deleteされた数」
START_TIME開始時刻
END_TIME完了時刻
RUNTIME_PRIORITYリソースプール内で処理を実行するために、割り当てるリソース(CPU、I/O)のサイズを示す。値は以下のいずれか。
・HIGH
・MEDIUM
・LOW


[実行例]

【6】ノードのステータスを確認します。ノード1のステータスが「UP」に遷移しました。
※「READY」は、基本的に時間がかからずに終了します。

参考情報

TABLE_RECOVERY_STATUS
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/SystemTables/MONITOR/TABLE_RECOVERY_STATUS.htm

TABLE_RECOVERIES
https://www.vertica.com/docs/9.2.x/HTML/index.htm#Authoring/SQLReferenceManual/SystemTables/MONITOR/TABLE_RECOVERIES.htm

PROJECTION_RECOVERIES
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/SystemTables/MONITOR/PROJECTION_RECOVERIES.htm

検証バージョンについて

この記事の内容はVertica 9.2で確認しています。

更新履歴

2019/12/11 table_recovery_status.tables_remainの説明修正
2019/04/25 本記事を公開