この記事では、物理復旧が失敗した場合の問題のトラブルシューティングと特定方法について説明します。
物理復旧機能は、データバックアップおよびログアーカイブ機能に強く依存しています。つまり、物理復旧を開始する前に、少なくとも1つの利用可能なバックアップセットが存在し、かつログアーカイブが連続していることを保証する必要があります。
注意
- OceanBaseデータベースは現在、低バージョンのバックアップデータを同一バージョンまたはそれ以上のバージョンに復元することのみをサポートしており、V3.xまたはV2.xバージョンのバックアップデータをV4.xバージョンに復元することはサポートされていません。
- OceanBaseデータベースV4.1.0では、OceanBaseデータベースV4.1.0以前のバージョンのデータを復元することはできません。例えば、OceanBaseデータベースV4.0.xバージョンのバックアップデータをOceanBaseデータベースV4.1.0バージョンに復元することはできません。
このドキュメントでは、OceanBaseデータベースのインストールディレクトリを/home/admin/oceanbaseとして説明します。ドキュメント内で言及されているログの実際の保存パスは、実際の環境に基づいてください。
課題1:復旧コマンドの実行に失敗
ALTER SYSTEM RESTORE ステートメントを実行して物理的復旧を開始する際に、コマンドの実行が失敗した場合は、以下の手順でトラブルシューティングを行うことができます。
rootユーザーでクラスタのsysテナントにログインします。以下のステートメントを実行し、エラー報告されたエラーコードを確認します。
SELECT * FROM oceanbase.DBA_OB_ROOTSERVICE_EVENT_HISTORY WHERE module='physical_restore';クエリ結果では、特に以下の情報に注目してください:
resultに対応する値、つまりエラー報告されたエラーコードです。RS_SVR_IPの値、つまりRoot Serviceが配置されているマシンのIPアドレスです。
前のステップで取得した
RS_SVR_IPを使用して、Root Serviceが配置されているマシンにログインし、rootservice.logログファイルを検索して、エラー発生箇所を確認します。Root Serviceが配置されているマシンにログインします。
ログファイルが保存されているディレクトリに移動します。
cd /home/admin/oceanbase/log以下のコマンドを実行し、クエリで取得したエラーコードに基づいてログを検索し、エラー発生箇所を特定します。
上記のステップで取得した
result情報のエラーコードが-4016である場合を例に、コマンドは以下のとおりです。grep "ob_restore_util" rootservice.log | grep "ret=\-4016"注意
rootservice.logファイル内でgrepで関連ログが見つからない場合は、rootservice.logファイルが切り替わった可能性があります。その場合は、grep "ob_restore_util" rootservice.log.* | grep "ret=\-4016"コマンドを実行してください。また、一般的なコマンド実行失敗のエラーメッセージは
-4018 no enough log for restore.です。この問題は通常、ユーザーがALTER SYSTEM RESTOREステートメントを実行する際に指定した復旧終了点が正しくないために発生します。そのため、その復旧終了点より前に利用可能なバックアップセットやログアーカイブが存在するかどうかを確認する必要があります。つまり、選択した復旧終了点が復旧可能な範囲内にない可能性があります。復旧可能な範囲の詳細については、物理的復旧関連パラメータの紹介 の timestampとscnの選定制約 を参照してください。
検索したログのエラー情報を取得した後、技術サポート担当者に連絡して、問題の解決を依頼します。
質問2:テナントの復旧状態が常にRESTORE_WAIT_LS状態に留まる
ALTER SYSTEM RESTORE ステートメントを実行して物理的復旧を開始した後、CDB_OB_RESTORE_PROGRESS ビューを確認すると、復旧タスクの状態が常に RESTORING 状態にあることがわかります。
次の方法でさらに調査を進めることができます。
rootユーザーでクラスタのsysテナントにログインします。次のコマンドを実行して、復旧タスクの具体的な状態を照会します。
SELECT * FROM oceanbase.DBA_OB_ROOTSERVICE_EVENT_HISTORY WHERE event LIKE 'change_restore_status' AND value1 = $job_id;ここで、
$job_idは復旧タスクのID、つまりCDB_OB_RESTORE_PROGRESSビュー内のjob_idの値です。クエリ結果に基づいて、
statusの最後の値がRESTORE_WAIT_LSの場合は、次のステップを実行し、復旧対象のテナントのログストリームレプリカの復旧状態を確認する必要があります。statusの最後の値がRESTORE_WAIT_LS以外の場合は、このドキュメントの 質問3:Schemaフラッシュの問題 を参照して、さらに調査を進めてください。次のステートメントを実行して、復旧対象のテナントのログストリームレプリカの復旧状態を確認します。
SELECT ls_id,svr_ip,svr_port,role,restore_status,zone FROM oceanbase.__all_virtual_ls_meta_table WHERE tenant_id = xxxx;たとえば、クエリ例は次のとおりです:
+-------+----------------+----------+------+----------------+------+ | ls_id | svr_ip | svr_port | role | restore_status | zone | +-------+----------------+----------+------+----------------+------+ | 1 | 100.xx.xx.xx | 5003 | 1 | 0 | z1 | | 1001 | 100.xx.xx.xx | 5003 | 1 | 0 | z1 | | 1002 | 100.xx.xx.xx | 5003 | 1 | 6 | z1 | +-------+----------------+----------+------+----------------+------+ 3 rows in setクエリ結果では、主に以下の列の情報に注目します:
role:レプリカの役割。1は外部メディアからデータを復旧するリーダーレプリカを表し、2はリーダーレプリカから復旧データを取得するフォロワーレプリカを表します。restore_status:ログストリームレプリカの復旧状態。0はログストリームレプリカが正常に復旧されたことを表します。
クエリで得られたログストリームレプリカの
restore_status値が6または8の場合、6または8状態のログストリームは主にログとダンプの復旧を行うため、この段階ではログの復旧問題を優先的に考慮します。注意
V4.1.0バージョン以降、OceanBaseデータベースはすべての復旧ログが同時に進むポリシーに従っています。ログストリームが
6または8より前の状態に滞っている場合、他のログストリームの状態も6で動かない可能性があります。次のコマンドを実行して、ログがアーカイブディレクトリからターゲットテナントに復旧されたかどうかを確認します。
SELECT count(1) FROM oceanbase.GV$OB_LOG_STAT WHERE tenant_id = xxxx AND end_scn < (SELECT recovery_until_scn FROM oceanbase.DBA_OB_TENANTS WHERE tenant_id = xxxx);ステートメント内:
end_scn:最大消費可能なポイントを表します。recovery_until_scn:テナントの復旧終了点を表します。
クエリ結果が空でない場合、ログがアーカイブディレクトリからターゲットテナントに復旧されていないことを意味します。引き続き
GV$OB_LOG_STATビュー内のend_scnの値を監視してください。end_scnが引き続き進んでいる場合は、待機を続けてください。長時間進まない場合は、技術サポートに連絡して次の処理を行ってください。説明
ログをアーカイブディレクトリからテナントに復旧するプロセス全体には、かなりの時間がかかる場合があります。このプロセスの持続時間は、復旧対象のログ量、アーカイブメディアの読み取り性能、およびOceanBaseデータベースの負荷などの要因によって異なります。
クエリ結果が空の場合、
end_scnの値がrecovery_until_scnの値以上であることを意味し、ログがアーカイブディレクトリからテナントに復旧されたことを示します。ログが再生されたかどうかをさらに確認する必要があります。ログが再生されたかどうかを確認します。
まず、仮想テーブル
__all_virtual_replay_statを確認して、再生待ちのタスクがあるかどうかを確認します。SELECT * FROM oceanbase.__all_virtual_replay_stat WHERE tenant_id = xxxx;クエリ結果では、主に以下の列の値に注目します:
pending_cnt:再生待ちのタスク数を表します。この値がゼロでない場合、再生待ちのタスクがあることを意味します。unsubmitted_log_scn:再生されていない再生ポイントを表します。
次に、ビュー
DBA_OB_TENANTSを確認して、recovery_until_scnの値を取得します。SELECT recovery_until_scn FROM oceanbase.DBA_OB_TENANTS WHERE tenant_id = xxxx;2回のクエリ結果に基づいて、
pending_cntの値が0であり、かつunsubmitted_log_scnの値がrecovery_until_scnの値より大きい場合、ログの再生が完了したことを意味します。ログストリーム1が復旧されたかどうかをさらに確認する必要があります。そうでない場合、いずれかの条件が満たされていない限り、再生は完了していないことを意味します。引き続き
unsubmitted_log_scnが進んでいるかどうかを監視してください。長時間経ってもunsubmitted_log_scnが進まない場合は、技術サポートに連絡して次の処理を行ってください。ログストリーム1が復旧されたかどうかを確認します。
SELECT * FROM oceanbase.CDB_OB_LS WHERE tenant_id = xxxx;クエリ結果では、
sync_scnとrecovery_until_scnの値を比較します。ログストリーム1のsync_scnの値がrecovery_until_scnと等しい場合、ログストリーム1の復旧が完了したことを意味します。そうでない場合、ログストリーム1の復旧は完了しておらず、技術サポートに連絡して次の処理を行ってください。ログの復旧プロセス全体が完了したことを確認した上で、
restore_statusの値が依然として6または8の場合は、技術サポートに連絡して次の処理を行ってください。
質問3:スキーマのリフレッシュに関する問題
ALTER SYSTEM RESTORE ステートメントを実行して物理復旧を開始した後、質問2:テナントの復旧状態が常にRESTORE_WAIT_LS状態に停止している の方法でビュー DBA_OB_ROOTSERVICE_EVENT_HISTORY を調査したところ、復旧待機中のテナントに残存するレコードが存在し、そのテナントの復旧状態は RESTORE_WAIT_LS 状態ではなく他の状態に停止していることが判明しました。これは、復旧待機中のテナントのスキーマがリフレッシュされておらず、システムがテナントの状態をNormalに変更することに失敗している可能性があります。
以下の方法で調査処理を行うことができます:
rootユーザーでクラスタのsysテナントにログインします。ビュー
GV$OB_SERVER_SCHEMA_INFOを照会し、スキーマのリフレッシュ進捗を確認します。SELECT * FROM oceanbase.GV$OB_SERVER_SCHEMA_INFO WHERE tenant_id=xxxx;クエリ例は以下のとおりです:
+----------------+----------+-----------+--------------------------+-------------------------+--------------+-------------+----------------------------+ | SVR_IP | SVR_PORT | TENANT_ID | REFRESHED_SCHEMA_VERSION | RECEIVED_SCHEMA_VERSION | SCHEMA_COUNT | SCHEMA_SIZE | MIN_SSTABLE_SCHEMA_VERSION | +----------------+----------+-----------+--------------------------+-------------------------+--------------+-------------+----------------------------+ | xx.xx.xx.5 | 4000 | 1002 | 1 | 1 | 4 | 1086 | -1 | | xx.xx.xx.9 | 4002 | 1002 | 1 | 1 | 4 | 1086 | -1 | | xx.xx.xx.9 | 4001 | 1002 | 1 | 1 | 4 | 1086 | -1 | | xx.xx.xx.5 | 4005 | 1002 | 1 | 1 | 4 | 1086 | -1 | | xx.xx.xx.11 | 4004 | 1002 | 1 | 1 | 4 | 1086 | -1 | | xx.xx.xx.11 | 4003 | 1002 | 1 | 1 | 4 | 1086 | -1 | +----------------+----------+-----------+--------------------------+-------------------------+--------------+-------------+----------------------------+ 6 rows in setスキーマのリフレッシュが成功するためには、以下の条件を満たす必要があります:
REFRESHED_SCHEMA_VERSION=RECEIVED_SCHEMA_VERSIONREFRESHED_SCHEMA_VERSIONの値が8より大きいREFRESHED_SCHEMA_VERSION/8の値が整数である
上記のいずれかの条件を満たしていない場合、スキーマがリフレッシュされていないことを意味し、ログを検索してさらに調査する必要があります。
前のステップで取得したビューの情報に基づき、スキーマがリフレッシュされていないマシンを任意に選択してログインし、ログを検索します。
ログが保存されているディレクトリに移動します。
cd /home/admin/oceanbase/log関連情報を取得するためにログを検索します。
ログを検索する際は、スレッド名で直接検索するだけで済みます。スキーマのリフレッシュはバックグラウンドスレッドであるため、システムは継続的に再試行します。そのため、最新のログを確認するだけで十分です。
grep "SerScheQueue" observer.log検索したログの例は以下のとおりです:
observer.log.20220811114045:[2022-08-11 11:39:54.382533] WARN [RPC.OBRPC] rpc_call (ob_rpc_proxy.ipp:361) [192069][SerScheQueue0][T0][YFA00BA2D905-0005E5DEE6A2294E-0-0] [lt=8] execute rpc fail(ret=-4012, dst="11.xx.xx.9:4001") observer.log.20220811114045:[2022-08-11 11:39:54.382552] WARN log_user_error_and_warn (ob_rpc_proxy.cpp:315) [192069][SerScheQueue0][T0][YFA00BA2D905-0005E5DEE6A2294E-0-0] [lt=20]検索したログに基づいて、対応するtrace情報と実行失敗したマシンの情報を見つけます。例えば、例のtrace情報は
YFA00BA2D905-0005E5DEE6A2294E-0-0で、実行失敗したマシンのIPアドレスはxx.xx.xx.9です。
実行失敗したマシンにログインし、取得したtrace情報に基づいてログが保存されているディレクトリに移動した後、さらにログを検索してエラー情報を確認します。
grep "YFA00BA2D905-0005E5DEE6A2294E-0-0" observer.log注意
observer.log内でgrepしても関連ログが見つからない場合、observer.logファイルが切り替わっている可能性があります。grep "YFA00BA2D905-0005E5DEE6A2294E-0-0" observer.log.*を実行してください。ログエラー情報を取得した後、技術サポート担当者に連絡して処理を依頼します。
質問4:ビューに表示される復元タスクのステータスがFAILEDになる
ALTER SYSTEM RESTORE ステートメントを実行して物理的復元を開始した後、ビュー CDB_OB_RESTORE_HISTORY を確認すると、復元タスクのステータスが FAILED であることがわかります。
以下の手順でトラブルシューティングを行うことができます:
rootユーザーでクラスタのsysテナントにログインします。再度ビュー
CDB_OB_RESTORE_HISTORYを照会し、comment列の情報を取得します。SELECT * FROM oceanbase.CDB_OB_RESTORE_HISTORY WHERE TENANT_ID=xxxx;comment列には、復元タスクに関連するいくつかの情報が表示されており、OBServerノードのIPアドレス、ログストリームID、エラー発生モジュールの種類、および対応するtrace_idが含まれます。ビュー
CDB_OB_RESTORE_HISTORYの詳細については、CDB_OB_RESTORE_HISTORYを参照してください。取得したエラーコード情報と
trace_idを使用して、該当するログを検索します。comment情報に記載されているマシンにログインします。ログが保存されているディレクトリに移動します。
cd /home/admin/oceanbase/log以下のコマンドを実行して、復元タスクの失敗時点付近のログを検索します。
タスクを実行しているマシンのタイプがOBServerノード(
comment情報に(server)と表示されている場合)の場合、以下のコマンドを実行して、復元タスクの失敗時点付近のログを検索します。grep "trace_id" observer.log | grep "WARN\|ERROR"ここで、
trace_idはcomment列のtrace_id情報に置き換える必要があります。注意
observer.logファイル内で関連ログをgrepで検索できない場合は、observer.logファイルが切り替わっている可能性があります。grep "trace_id" observer.log.* | grep "WARN\|ERROR"と入力してみてください。タスクを実行しているマシンのタイプがROOT Service(
comment情報に(rootservice)と表示されている場合)の場合、以下のコマンドを実行して、復元タスクの失敗時点付近のログを検索します。grep "ob_restore_scheduler" rootservice.log | grep "WARN\|ERROR"注意
rootservice.logファイル内で関連ログをgrepで検索できない場合は、rootservice.logファイルが切り替わっている可能性があります。grep "ob_restore_scheduler" rootservice.log.* | grep "WARN\|ERROR"と入力してみてください。
ログエラー情報を取得したら、技術サポート担当者に連絡して、問題の解決を依頼します。