背景
obcdcが外部にサービスを提供して以来、プライマリデータベースのデータの同期のみをサポートしてきました。しかし、お客様環境ではobcdcがスタンバイデータベースのデータを消費するニーズがあります。具体的なケースは以下のとおりです:
ローカルデータベースのデータを消費するニーズ:obcdcのデータを消費するアプリケーションとデータベースのプライマリデータベースが地理的に離れている場合、業務上はローカルのスタンバイデータベースから増分トランザクションデータを優先的に消費したいというニーズがあります。
プライマリ/スタンバイ切り替え後のデータ消費能力:obcdcはプライマリデータベースのみを同期でき、1つのobcdcは1つのクラスタのデータのみを同期できます。プライマリデータベースとスタンバイデータベースが異なるクラスタにある場合、またはプライマリ/スタンバイ切り替えが発生した場合、データリンクが切断されます。
obcdcの実行はプライマリデータベースへの影響が小さいものの、一部のお客様は引き続きobcdcを使用してスタンバイデータベースを同期し、プライマリデータベースへの影響を軽減したいと考えています。
上記の問題を解決するため、obcdcはスタンバイデータベースのデータを直接消費する機能を提供します。
機能説明
オンラインモードでは、tb_white_listを設定し、同期対象のテナントの現在のテナント名を同期ホワイトリストに追加する必要があります。オフラインモード(refresh_mode=data_dictおよびarchive_destなどのアーカイブメタ情報が設定されている場合)にはこの制限はありません。
起動ポイントの制限:
起動時、obcdcソーステナントの状態は
NORMALでなければなりません。起動ポイントに対応する時刻において、obcdcソーステナントの状態は
NORMALでなければなりません。テナントの
RESTORE_SCN(ユーザー指定の復元ポイントで、システムテナントでCDB_OB_RESTORE_HISTORYビューを参照して取得できます)以下の起動ポイントはサポートされていません。RECOVERY_UNTIL_SCN(現在のテナントの最大復元ポイントで、DBA_OB_TENANTSビューを参照して取得できます)を超える起動ポイントはサポートされていません。起動ポイントがテナントの
REPLAYABLE_SCN(現在のテナントで再現可能なスナップショットバージョンで、DBA_OB_TENANTSビューを参照して取得できます)を超える場合、テナントのREPLAYABLE_SCNが起動ポイントを上回るまで再試行し、その後に起動が成功します。再試行がタイムアウトするとプロセスは終了します。起動ポイントが
READABLE_SCN(現在のテナントで読み取り可能なスナップショットバージョンで、DBA_OB_TENANTSビューを参照して取得できます)を超える場合、テナントのREADBALE_SCNが起動ポイントを上回るまで再試行し、その後に起動が成功します。再試行がタイムアウトするとプロセスは終了します。辞書モードでは、最新のベースラインの生成時間(
SNAPSHOT_SCN、システムテナントでCDB_OB_DATA_DICTIONARY_IN_LOGビューを参照するか、通常のテナントでDBA_OB_DATA_DICTIONARY_IN_LOGビューを参照して取得します)を取得します。取得したSNAPSHOT_SCNも上記のすべての起動ポイントの制約を満たさなければならず、そうでない場合もプロセスは終了します。起動ポイントがトランザクションの途中に位置する場合、obcdcはそのトランザクションの起動ポイント以前のすべてのclogログを遡って取得する必要があります。そのトランザクションの最初のclogログも上記のすべての制約を満たさなければなりません。
よくある質問
ここでは、obcdcのスタンバイデータベース同期機能に関連するよくある質問を例示します。obcdcの汎用的な問題については、ここでは述べません。
obcdc起動失敗、プロセスが終了する
主要な現象:
obcdcプロセスが終了し、かつobcdcログが回収されていない状態で、obcdc起動成功の重要ログ
init obcdc succが見つからない。以下のいずれかの重要ログが存在する:
起動時点でのclogログ時点がサービス外であることを示す重要ログ
[ADD_TENANT][FAIL][clog_not_SERVE]。起動時点が読み取り不可能であることを示す重要ログ
[ADD_TENANT][FAIL][NOT_READABLE]。データディクショナリの
SNAPSHOT_SCNがサービス範囲外であることを示す重要ログ[ADD_TENANT][DATA_DICT][REFRESH_BASELINE][FAIL][clog_not_SERVE][LOG_AT_DICT_SNAPSHOT]。
問題の原因:obcdcの起動時点が上記機能説明の制約を満たしていない。
解決策:起動時点を調整して制約に適合させるか、またはプライマリデータベースからのデータ同期に切り替える。
obcdc起動成功、しかし一定時間稼働後にプロセスが終了する
主要な現象:
obcdcの初期化が成功している。具体的には、obcdcログが回収されていない状態で、起動成功の重要ログ
init obcdc succが確認できるか、定期的にTLOG.COMMITTERモジュールのHEARTBEATキーワードログをリフレッシュしている様子が確認できる。[MISS_LOG][HANDLE_DONE]ログが存在し、その後に続くretがOB_SUCCESSではない。
問題の原因:起動時点が長時間トランザクションの途中にあるため、obcdcはそのトランザクションを完全にプルバックする必要があります。このトランザクションの前方ログ時点がRESTORE_SCNより小さい場合、obcdcはそのログを取得できず、一定時間の再試行後にプロセスを終了します。
解決策:起動時点をリセット(後退)するか、またはプライマリデータベースからのデータ同期に切り替える。