本記事では、日常的なメンテナンスにおいて、プライマリ/スタンバイテナントのログ同期および再生状態を確認する方法について説明します。
手順1:保護モードとテナントレベルのショットノブ(SCN)を確認する
OceanBaseデータベースV4.4.2バージョンでは、V4.4.2 BP1バージョンから最大保護モードと最大可用モードがサポートされています。プライマリ/スタンバイテナントにおいて、各テナントの保護モードと保護レベルは独立しており、強同期を行うスタンバイテナントのみがプライマリテナントと同じ保護モードと保護レベルを維持します。その他の非同期または弱同期を行うスタンバイテナントの保護モードと保護レベルは常にMAXIMUM PERFORMANCEに設定されます。
DBA_OB_TENANTSビューを使用して、テナントの保護モードを照会できます。さらに、DBA_OB_TENANTSビューのテナントレベルSCN(SYNC_SCN、REPLAYABLE_SCN、READABLE_SCNなどのフィールド)は、テナントデータの同期状況と可用性状態の重要な指標を提供し、運用保守担当者がプライマリ/スタンバイの同期進捗を監視し、同期問題を診断するための重要な根拠となります。
プライマリテナント上で保護モードとテナントレベルのショットノブ(SCN)を確認できます。
プライマリテナントが存在するクラスタの
sysテナントで、以下のステートメントを実行します。obclient(root@sys)[(none)]> SELECT tenant_id, tenant_name, tenant_role, protection_mode, protection_level, sync_scn, replayable_scn, readable_scn FROM oceanbase.DBA_OB_TENANTS WHERE tenant_type = 'USER';プライマリテナントで、以下のステートメントを実行します。
MySQLモード:
obclient(root@mysql001)[(none)]> SELECT tenant_role, protection_mode, protection_level, sync_scn, replayable_scn, readable_scn FROM oceanbase.DBA_OB_TENANTS;Oracleモード:
obclient(sys@oracle001)[SYS]> SELECT tenant_role, protection_mode, protection_level, sync_scn, replayable_scn, readable_scn FROM SYS.DBA_OB_TENANTS;
ここで:
protection_mode:現在のテナントの保護モード。値にはMAXIMUM PERFORMANCE(最大パフォーマンス)、MAXIMUM PROTECTION(最大保護)、MAXIMUM AVAILABILITY(最大可用)などが含まれます。protection_level:現在のテナントの保護レベル。値にはMAXIMUM PERFORMANCE(最大パフォーマンス)、MAXIMUM PROTECTION(最大保護)、MAXIMUM AVAILABILITY(最大可用)、RESYNCHRONIZATION(ログ追従状態)などが含まれます。sync_scn:グローバル同期ショットノブ。テナント内のすべてのログストリームの中で最小のsync_scn、すなわちすべてのリーダーレプリカのend_scn(ログストリームが過半数に達した最後のログのタイムスタンプ)の最小値です。この時点以前のすべてのログがスタンバイテナントに同期されていることを示します。replayable_scn:グローバル再生可能ショットノブ。物理スタンバイデータベースの場合、この時点以前のすべてのログがスタンバイテナントで再生可能であることを示します。readable_scn:グローバル読み取り可能ショットノブ。テナント内のすべてのログストリームの中で最小のreadable_scn、すなわちすべてのログストリームの過半数が再生したショットノブの最小値です。この時点以前のすべてのデータがスタンバイテナントで読み取り可能であることを示します。
手順2:各ログストリームの同期モードを確認する
ログストリームの同期モードは、プライマリ/スタンバイテナント間のログ同期方式を決定します。強同期モードでは、プライマリテナントからスタンバイテナントへログがプッシュされます。非同期または弱同期モードでは、スタンバイテナントからプライマリテナントへログがプルされます。
プライマリテナントで GV$OB_LOG_STAT ビューを使用して、各ログストリームの同期モードを確認します。
プライマリテナントが存在するクラスタの
sysテナントで、次のステートメントを実行します:obclient(root@sys)[(none)]> SELECT tenant_id, ls_id, role, sync_mode FROM oceanbase.GV$OB_LOG_STAT WHERE tenant_id = xxx AND role = 'LEADER';プライマリテナントで、次のステートメントを実行します。
MySQLモード:
obclient(root@mysql001)[(none)]> SELECT ls_id, role, sync_mode FROM oceanbase.GV$OB_LOG_STAT WHERE role = 'LEADER';Oracleモード:
obclient(sys@oracle001)[SYS]> SELECT ls_id, role, sync_mode FROM SYS.GV$OB_LOG_STAT WHERE role = 'LEADER';
ここで、sync_mode の取り得る値は以下のとおりです:
SYNC:強力同期モードを表します。ASYNC:非同期同期モードを表します。PRE_ASYNC:強力同期モードから非同期同期モードへの切り替え中を表します。
ステップ3:ログストリームの転送状態を確認する(強力同期モードの場合のみ)
プライマリテナントが強力同期モードにある場合(つまり GV$OB_LOG_STAT ビューで sync_mode = SYNC の場合)、プライマリテナントで GV$OB_LS_LOG_TRANSPORT_STAT ビューを使用して、プライマリテナントの各ログストリームからスタンバイテナントへのログプッシュの転送状態を確認します。
注意
V4.4.2バージョンでは、V4.4.2 BP2バージョンから GV$OB_LS_LOG_TRANSPORT_STAT ビューがサポートされています。
プライマリテナントが存在するクラスタの
sysテナントで、次のステートメントを実行します。obclient(root@sys)[(none)]> SELECT tenant_id, ls_id, end_scn, last_sent_scn, standby_end_scn, standby_addr FROM oceanbase.GV$OB_LS_LOG_TRANSPORT_STAT WHERE tenant_id = xxx AND role = 'LEADER' AND enabled = 1;プライマリテナントで、次のステートメントを実行します。
MySQLモード:
obclient(root@mysql001)[(none)]> SELECT ls_id, end_scn, last_sent_scn, standby_end_scn, standby_addr FROM oceanbase.GV$OB_LS_LOG_TRANSPORT_STAT WHERE role = 'LEADER' AND enabled = 1;Oracleモード:
obclient(sys@oracle001)[SYS]> SELECT ls_id, end_scn, last_sent_scn, standby_end_scn, standby_addr FROM SYS.GV$OB_LS_LOG_TRANSPORT_STAT WHERE role = 'LEADER' AND enabled = 1;
ここで:
end_scn:プライマリテナントのログストリームの現在の最大SCNを表します。last_sent_scn:プライマリテナントがスタンバイテナントに最後に送信したログのSCNを表します。standby_end_scn:スタンバイテナントが現在受信し確認済みのログの最大SCNを表します。standby_addr:スタンバイテナント上の該当ログストリームのリーダーのアドレス情報を表します。
ステップ4:ログ受信状態の確認
プライマリ/スタンバイ同期中、スタンバイテナントでGV$OB_LS_LOG_RESTORE_STATUSビューをクエリすることで、ログ受信が正常かどうかを確認します。
スタンバイテナントが存在するクラスタの
sysテナントで、以下のステートメントを実行します。obclient(root@sys)[(none)]> SELECT tenant_id, ls_id, sync_lsn, sync_scn, sync_status, err_code FROM oceanbase.V$OB_LS_LOG_RESTORE_STATUS WHERE tenant_id = xxx;スタンバイテナントで、以下のステートメントを実行します。
MySQLモード:
obclient(root@mysql001)[(none)]> SELECT ls_id, sync_lsn, sync_scn, sync_status, err_code FROM oceanbase.V$OB_LS_LOG_RESTORE_STATUS;Oracleモード:
obclient(sys@oracle001)[SYS]> SELECT ls_id, sync_lsn, sync_scn, sync_status, err_code FROM SYS.V$OB_LS_LOG_RESTORE_STATUS;
ここで:
sync_lsn:スタンバイデータベースの最大連続多数派のポイント/最大消費可能ポイント(LSN)。スタンバイテナント上の該当ログストリームで連続して受信・確認されたログの物理的位置を表します。sync_scn:スタンバイデータベースの最大連続多数派のポイント/最大消費可能ポイント(SCN)。「sync_lsn」と対応し、スタンバイテナント上の該当ログストリームで連続して受信・確認されたログの論理的な時点を表します。sync_status:ログストリームの復元状態。err_code:エラーコード情報。
ステップ5:ログ再生状態の確認
プライマリ/スタンバイ同期中、スタンバイテナントでGV$OB_LS_LOG_REPLAY_STATビューをクエリすることで、ログ再生が正常かどうかを確認します。
注意
V4.4.2バージョンでは、V4.4.2 BP2バージョンから GV$OB_LS_LOG_REPLAY_STAT ビューがサポートされています。
スタンバイテナントが存在するクラスタの
sysテナントで、以下のステートメントを実行します。obclient(root@sys)[(none)]> SELECT tenant_id, ls_id, end_lsn - unsubmitted_lsn AS submit_lag, pending_cnt FROM oceanbase.GV$OB_LS_LOG_REPLAY_STAT WHERE tenant_id = xxx AND role = 'FOLLOWER';スタンバイテナントで、以下のステートメントを実行します。
MySQLモード:
obclient(root@mysql001)[(none)]> SELECT ls_id, end_lsn - unsubmitted_lsn AS submit_lag, pending_cnt FROM oceanbase.GV$OB_LS_LOG_REPLAY_STAT WHERE role = 'FOLLOWER';Oracleモード:
obclient(sys@oracle001)[SYS]> SELECT ls_id, end_lsn - unsubmitted_lsn AS submit_lag, pending_cnt FROM SYS.GV$OB_LS_LOG_REPLAY_STAT WHERE role = 'FOLLOWER';
ここで:
end_lsn:Palfが永続化したポイントで、このポイントより前のすべてのログの再生処理が完了していることを示します。unsubmitted_lsn:再生キューに次にコミットされるログのLSNを表し、ログ再生の未処理キューの開始位置です。submit_lag:end_lsn - unsubmitted_lsnの値で、再生キューにコミット待ちのログセグメントの長さを示します。この差が長時間変わらない場合、再生が停止している可能性があります。pending_cnt:再生を待機しているタスクの数で、再生処理の積み上がり状況を反映しています。