OceanBaseデータベースのスタンバイデータベース遅延機能は、スタンバイデータベースが一定時間遅延してから上流からログを同期し、特定の時点のデータレプリカを維持するために使用されます。
この機能は、以下のシナリオで一般的に使用されます:
人為的な誤操作の防止:プライマリデータベースでテーブルの誤削除やデータの誤更新が発生した場合、遅延しているスタンバイデータベース上の影響を受けていない履歴データレプリカを使用して迅速に復元できます。
時間窓内のデータ保護:設定された遅延時間内にプライマリデータベースで問題が検出された場合、遅延しているスタンバイデータベースから正しいデータをエクスポートできます。
使用制限と注意事項
スタンバイデータベースの遅延を設定する際には、以下の点に注意する必要があります。
注意事項 |
説明 |
|---|---|
| バージョン制限 | V4.4.2バージョンでは、OceanBaseデータベースはV4.4.2 BP2バージョンからスタンバイデータベース遅延機能をサポートしています。 |
| 保護モード要件 | MAXIMUM PERFORMANCE(最大パフォーマンス)モードのスタンバイデータベース(スタンバイテナント)のみで遅延同期を設定できます。 |
| 保護モードの切り替え | ネットワークベースの物理スタンバイデータベースの場合、遅延しているスタンバイデータベースを最大保護モードまたは最大可用モードに切り替えると、遅延設定は自動的に無効になります。最大パフォーマンスモードに戻すと、遅延設定は自動的に復元されます。 最大保護モードまたは最大可用モードのスタンバイデータベースで遅延を設定すると、システムはエラーを返します。ただし、まずスタンバイデータベースに遅延を設定し(かつ強制同期のダウンストリームがそのスタンバイデータベースである場合)、その後プライマリデータベースを最大保護モードまたは最大可用モードに切り替えると、プライマリデータベースのログ同期が停止する可能性があります。 |
| スイッチオーバー制限 | 遅延しているスタンバイデータベースではスイッチオーバーを実行できません。スイッチオーバーを実行するには、まずそのスタンバイデータベースの遅延時間(DELAYパラメータ)を0秒に設定し、日付同期を待機する必要があります。 |
| Flashback制限 | 遅延しているスタンバイデータベースでは、Flashbackを実行して新しいプライマリデータベースに接続することはできません。まず、そのスタンバイデータベースの遅延時間(DELAYパラメータ)を0秒に設定する必要があります。 |
| ロール切り替え後の設定 | スイッチオーバー完了後、スタンバイデータベースの遅延設定は保持されません。再度、そのスタンバイデータベースの遅延時間を設定する必要があります。 |
| Failover | 遅延しているスタンバイデータベースではFailoverを実行できます。ただし、RPO ≈ recover_delay(遅延期間中のログがスタンバイデータベースに取得されていない)を保証する必要があります。 |
| プライマリデータベースのアーカイブログの保持時間 | プライマリデータベースのアーカイブログの保持時間 ≥ recover_delayを保証する必要があります。そうでない場合、ログがクリーンアップされ、データが途絶える可能性があります。 |
| 複数スタンバイデータベース構成 | 各スタンバイデータベースに対して、異なる遅延時間を独立して設定できます。 |
| スタンバイデータベース遅延の基準 | プライマリデータベーストランザクションのコミット時間(SCNタイムスタンプ)を基準とします。 |
| クロック同期 | NTPに依存してプライマリ/スタンバイデータベースのクロック同期を保証します。システムはクロック偏差の補償を行いません。 |
設定の推奨事項
スタンバイデータベースの遅延時間:誤操作の検出時間とRPOのバランスを取るため、30分~2時間に設定することを推奨します。
アーカイブの保持時間:ログがクリーンアップされるのを防ぐため、プライマリデータベースのログアーカイブ保持時間がスタンバイデータベースの遅延時間より長くなるようにする必要があります。
複数スタンバイデータベースの構成:HA(高可用性)とデータ保護の両方を考慮し、リアルタイムスタンバイデータベース1台 + 遅延スタンバイデータベース1台をデプロイすることを推奨します。
スタンバイデータベースの遅延時間の設定
MAXIMUM PERFORMANCE(最大パフォーマンス)モードのスタンバイテナントでは、ビジネスニーズに応じてスタンバイデータベースの遅延時間を設定できます。具体的な操作手順は以下のとおりです:
管理者ユーザーでスタンバイテナント、またはそのスタンバイテナントが属するクラスタの
sysテナントにログインします。説明
MySQLモードの管理者ユーザーは
rootユーザー、Oracleモードの管理者ユーザーはSYSユーザーです。接続例は以下のとおりです。データベースへの接続時には、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -A以下のコマンドを実行して、現在のスタンバイテナントの保護モードを確認します。遅延を設定できるのは
MAXIMUM PERFORMANCE(最大パフォーマンス)モードのスタンバイテナントのみです。スタンバイテナントが存在するクラスタのシステムテナント(
sysテナント)がそのスタンバイテナントの保護モードを確認します。obclient(root@sys)[oceanbase]> SELECT TENANT_NAME, PROTECTION_MODE, PROTECTION_LEVEL FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'standby_tenant';スタンバイテナントが自身のテナントの保護モードを確認します。
MySQLモードOracleモードMySQLモードでは、クエリステートメントは次のとおりです:
obclient(root@standby_tenant)[oceanbase]> SELECT TENANT_NAME, PROTECTION_MODE, PROTECTION_LEVEL FROM oceanbase.DBA_OB_TENANTS;Oracleモードでは、クエリステートメントは次のとおりです:
obclient(sys@standby_tenant)[SYS]> SELECT TENANT_NAME, PROTECTION_MODE, PROTECTION_LEVEL FROM SYS.DBA_OB_TENANTS;
クエリ結果の例は以下のとおりです:
+----------------+---------------------+---------------------+ | TENANT_NAME | PROTECTION_MODE | PROTECTION_LEVEL | +----------------+---------------------+---------------------+ | standby_tenant | MAXIMUM PERFORMANCE | MAXIMUM PERFORMANCE | +----------------+---------------------+---------------------+ 1 row in setクエリ結果に基づき、スタンバイテナントの保護モードが
MAXIMUM PERFORMANCE(最大パフォーマンス)モードであることを確認します。以下のコマンドを実行して、現在のスタンバイテナントのログ復元ソース設定を取得します。
スタンバイテナントが存在するクラスタのシステムテナント(
sysテナント)がそのスタンバイテナントのログ復元ソース情報を確認します。obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE\Gスタンバイテナントが自身のテナントのログ復元ソース情報を確認します。
MySQLモードOracleモードMySQLモードでは、クエリステートメントは次のとおりです:
obclient(root@standby_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE\GOracleモードでは、クエリステートメントは次のとおりです:
obclient(sys@standby_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_LOG_RESTORE_SOURCE\G
クエリ結果の例は以下のとおりです:
*************************** 1. row *************************** TENANT_ID: 1002 ID: 1 TYPE: SERVICE VALUE: IP_LIST=6.xx.xxx.91:2881+2882,USER=rep_user@mysql001,PASSWORD=4E9*************************************,TENANT_ID=1002,CLUSTER_ID=10001,COMPATIBILITY_MODE=MYSQL,IS_ENCRYPTED=true RECOVERY_UNTIL_SCN: 4611686018427387903 RECOVERY_DELAY: 0 1 row in setログ復元ソースの設定を更新し、スタンバイテナント(スタンバイデータベース)の遅延時間を指定します。
ステートメントは次のとおりです:
ALTER SYSTEM SET LOG_RESTORE_SOURCE ='SERVICE=$ip_list USER=$user_name@$tenant_name PASSWORD=$password DELAY=$delay_time' [TENANT = standby_tenant_name];主なパラメータの説明は以下のとおりです:
$ip_list、$user_name、$tenant_name、$password:ログ復元ソースの設定情報です。ここには手順2で取得した情報を入力します。$delay_time:スタンバイテナント(スタンバイデータベース)がログを取得するまでの遅延時間を指定します。数値(単位なし)を指定した場合、デフォルトの単位は秒です。単位を指定することもでき、単位はus(マイクロ秒)、ms(ミリ秒)、m(分)、h(1時間)、d(日)です。このパラメータを指定しない場合、遅延時間はデフォルトで0秒となり、スタンバイデータベースは遅延しません。
前の手順で取得したログ復元ソースの設定に基づき、スタンバイデータベースの遅延時間を30分、すなわち1800秒に設定します。例は以下のとおりです:
スタンバイテナントが存在するクラスタのシステムテナント(
sysテナント)がそのスタンバイテナントの遅延時間を設定します。obclient(root@sys)[oceanbase]> ALTER SYSTEM SET LOG_RESTORE_SOURCE = 'SERVICE=6.xx.xx.91:2881 USER=rep_user@mysql001 PASSWORD=****** DELAY=1800' TENANT = standby_tenant;スタンバイテナントが自身のテナントの遅延時間を設定します。
obclient> ALTER SYSTEM SET LOG_RESTORE_SOURCE = 'SERVICE=6.xx.xx.91:2881 USER=rep_user@mysql001 PASSWORD=****** DELAY=1800';
スタンバイデータベース(スタンバイテナント)の遅延時間を設定した後と設定前を比較します:
遅延時間を長くする場合、スタンバイデータベースは現在の時点でログ同期を停止し、同期停止時間が設定された遅延時間に達すると再開します。
遅延時間を短縮する場合、スタンバイデータベースは直ちにログを追従します。
遅延時間を0にリセットする場合、スタンバイデータベースは現在の時点からフルスピードでログを追従し、可能な限り早く追いつきます。
設定が成功した後、スタンバイデータベースの遅延設定を確認します。表示結果の単位はマイクロ秒です。
スタンバイテナントが存在するクラスタのシステムテナント(
sysテナント)がそのスタンバイテナントの遅延設定を確認します。obclient(root@sys)[oceanbase]> SELECT TENANT_ID, recovery_delay FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE;クエリ結果の例は次のとおりです:
+-----------+----------------+ | TENANT_ID | recovery_delay | +-----------+----------------+ | 1002 | 1800000000 | +-----------+----------------+ 1 row in setスタンバイテナントが自身のテナントの遅延設定を確認する場合
MySQLモードOracleモードMySQLモードでは、クエリステートメントは次のとおりです:
obclient(root@standby_tenant)[oceanbase]> SELECT recovery_delay FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE;Oracleモードでは、クエリステートメントは次のとおりです:
obclient(sys@standby_tenant)[SYS]> SELECT recovery_delay FROM SYS.DBA_OB_LOG_RESTORE_SOURCE;クエリ結果の例は次のとおりです:
+----------------+ | recovery_delay | +----------------+ | 1800000000 | +----------------+ 1 row in set
スタンバイデータベースの遅延状態を確認する
スタンバイデータベースの遅延設定が正常に完了した後、ビューを使用してスタンバイデータベースの遅延状態を確認できます。
スタンバイテナントが存在するクラスタのシステムテナント(
sysテナント)がスタンバイテナントの遅延状態を確認する場合obclient(root@sys)[oceanbase]> SELECT tenant_name, sync_scn, replayable_scn, readable_scn, TIMESTAMPDIFF(SECOND, SCN_TO_TIMESTAMP(sync_scn), NOW()) AS actual_delay_seconds FROM oceanbase.DBA_OB_TENANTS WHERE tenant_role = 'STANDBY';コマンドにおいて、
actual_delay_secondsはsync_scnと現在時刻の差分、すなわち実際の遅延時間であり、単位は秒です。スタンバイテナントが自身のテナントの遅延状態を確認する場合
MySQLモードOracleモードMySQLモードでは、クエリステートメントは次のとおりです:
obclient(root@standby_tenant)[oceanbase]> SELECT tenant_name, sync_scn, replayable_scn, readable_scn, TIMESTAMPDIFF(SECOND, SCN_TO_TIMESTAMP(sync_scn), NOW()) AS actual_delay_seconds FROM oceanbase.DBA_OB_TENANTS;コマンドにおいて、
actual_delay_secondsはsync_scnと現在時刻の差分、すなわち実際の遅延時間であり、単位は秒です。Oracleモードでは、クエリステートメントは次のとおりです:
obclient(sys@standby_tenant)[SYS]> SELECT tenant_name, sync_scn, replayable_scn, readable_scn, TIMESTAMPDIFF(SECOND, SCN_TO_TIMESTAMP(sync_scn), NOW()) AS actual_delay_seconds FROM SYS.DBA_OB_TENANTS;コマンドにおいて、
actual_delay_secondsはsync_scnと現在時刻の差分、すなわち実際の遅延時間を秒単位で表します。クエリ結果の例は以下のとおりです:
+----------------+---------------------+---------------------+---------------------+----------------------+ | tenant_name | sync_scn | replayable_scn | readable_scn | actual_delay_seconds | +----------------+---------------------+---------------------+---------------------+----------------------+ | standby_tenant | 1780553786243403000 | 1780553786243403000 | 1780553786243403000 | 205 | +----------------+---------------------+---------------------+---------------------+----------------------+ 1 row in set
関連ドキュメント
スタンバイデータベースの遅延に関する具体的なアプリケーションについては、スタンバイデータベース遅延の適用事例を参照してください。