本記事では、obcdcのよくある質問と注意点について説明します。
起動タイムスタンプが小さすぎないかどうかを判断する方法
obcdcはログのロールバックポイントを設定でき、そのポイントより後にコミットされたログを取得します。このポイントを「起動タイムスタンプ」と呼びます。
注意事項
- obcdcはクラスタレベル(マルチテナント)の同期をサポートしています。クラスタ全体を同期する場合は、すべてのマシンの時計が同期されていることを確認する必要があります。そうでない場合、各テナントのGTS時間に大きな差異が生じ、さらにobcdcがセキュリティポイントに基づいてロールバックし、プロセスが終了する可能性があります。 obcdc 4.x現行バージョンでは、obcdcが単一のテナントのみを同期することを推奨します。
- obcdcは現在、スタンバイテナントを持つクラスタの同期をサポートしていません。
fetching_log_mode=directかつmeta_data_refresh_mode=data_dictの場合にのみ、ログを完全オフラインで消費できます。他のモードの組み合わせでは、OBServerノードにリクエストを送信する必要があります。つまり、cluster_urlまたはrootserver_listを含むOBServerノードへのアクセス設定が必要です。
起動タイムスタンプの制限
obcdcが単一テナントのデータをロールバックする際、ロールバックポイントが小さすぎると、obcdcが起動できない場合があります。具体的な制限は以下の通りです:
単一テナントの同期
fetching_log_mode=integratedの場合アーカイブが無効の場合
ユーザーが指定したobcdcの起動タイムスタンプは、少なくともテナント内のすべてのログストリームの最大
BEGIN_SCNより大きい必要があります。このポイントは、該当するテナントで以下のSQLクエリを実行することで取得できます。SELECT CEIL(MAX(BEGIN_SCN)/1000) AS START_TS_US FROM oceanbase.GV$OB_LOG_STAT;アーカイブが有効の場合
ユーザーが指定したobcdcのロールバックポイントは、少なくとも以下の2つの値のうち小さい方より大きい必要があります。
テナント内のすべてのログストリームの最大
BEGIN_SCNテナントのアーカイブ開始時刻、すなわち
START_SCN。テナントのアーカイブ開始時刻は、該当するテナントで以下のSQLクエリを実行することで取得できます。SELECT CEIL(MAX(START_SCN)/1000) as START_TS_US FROM oceanbase.DBA_OB_ARCHIVELOG;
fetching_log_mode=directの場合、単一テナントの同期のみをサポートしており、obcdcの起動タイムスタンプがアーカイブログの開始時点より大きいことを保証する必要があります。データディクショナリモードを使用する場合、起動タイムがテナントデータディクショナリ内の最小
snapshot_scnより大きいことを保証する必要があります。テナントデータディクショナリ内の最小snapshot_scnは、該当するテナントで以下のSQLクエリを実行することで取得できます。SELECT CEIL(MIN(snapshot_scn)/1000) FROM oceanbase.DBA_OB_DATA_DICTIONARY_IN_LOG;説明
システムテナントで
tenant_idを指定して、oceanbase.CDB_OB_DATA_DICTIONARY_IN_LOGビューを照会することもできます。
複数テナントの同期
クラスタ(複数のテナント)のデータをロールバックする際、ユーザーが指定したobcdcの起動タイムスタンプは、そのタイムスタンプ以上で各テナントが上記の単一テナントの条件を満たしている必要があります。