チェンジフィード DDL レプリケーション

ran-huang
qiancai
hongyunyan
CharlesCheung96

このドキュメントでは、TiCDC での DDL レプリケーションのルールと特殊なケースについて説明します。

DDL 許可リスト

現在、TiCDC は許可リストを使用して、DDL ステートメントをレプリケートするかどうかを決定します。許可リスト内の DDL ステートメントのみがダウンストリームにレプリケートされます。許可リストにない DDL ステートメントはレプリケートされません。

TiCDC でサポートされている DDL ステートメントの許可リストは次のとおりです。

  • データベースを作成する
  • データベースを削除
  • テーブルを作成する
  • ドロップテーブル
  • 列を追加
  • ドロップ列
  • インデックスの作成 / インデックスの追加
  • インデックスを削除
  • テーブルを切り捨てる
  • 列を変更する
  • テーブル名の変更
  • 列のデフォルト値を変更する
  • テーブルコメントの変更
  • インデックス名の変更
  • パーティションを追加
  • パーティションを削除する
  • パーティションを切り捨てる
  • ビューを作成
  • ドロップビュー
  • テーブル文字セットを変更する
  • データベースの文字セットを変更する
  • テーブルを回復する
  • 主キーを追加する
  • 主キーを削除する
  • 自動 ID をリベースする
  • テーブルインデックスの可視性を変更する
  • 交換パーティション
  • パーティションを再編成する
  • テーブルTTLを変更する
  • テーブルを変更してTTLを削除

DDLレプリケーションの考慮事項

ADD INDEXおよびCREATE INDEX DDL の非同期実行

ダウンストリームが TiDB の場合、TiCDC はADD INDEXおよびCREATE INDEX DDL 操作を非同期で実行し、変更フィード レプリケーションの待機レイテンシーへの影響を最小限に抑えます。つまり、 ADD INDEXおよびCREATE INDEX DDL をダウンストリーム TiDB に複製して実行した後、TiCDC は DDL 実行の完了を待たずにすぐに戻ります。これにより、後続の DML 実行がブロックされることが回避されます。

ダウンストリームでADD INDEXまたはCREATE INDEX DDL 操作を実行中に、TiCDC が同じテーブルの次の DDL 操作を実行すると、この DDL 操作がqueueing状態で長時間ブロックされる可能性があります。これにより、TiCDC がこの DDL 操作を繰り返し実行することになり、再試行に時間がかかりすぎると、レプリケーション タスクが失敗する可能性があります。v8.1.2 以降では、TiCDC がダウンストリーム データベースのSUPER権限を持っている場合、定期的にADMIN SHOW DDL JOBS実行して、非同期で実行された DDL タスクのステータスを確認します。TiCDC は、レプリケーションを続行する前に、インデックス作成が完了するまで待機します。これにより、レプリケーションのレイテンシーが長くなる可能性がありますが、レプリケーション タスクの失敗を回避できます。

注記:

  • 特定のダウンストリーム DML の実行がレプリケーションが完了していないインデックスに依存している場合、これらの DML の実行が遅くなり、TiCDC レプリケーションのレイテンシーに影響する可能性があります。
  • DDL をダウンストリームにレプリケートする前に、TiCDC ノードがクラッシュした場合、またはダウンストリームが他の書き込み操作を実行している場合、DDL レプリケーションが失敗する可能性は非常に低くなります。ダウンストリームをチェックして、それが発生するかどうかを確認できます。

テーブル名の変更に関する DDL レプリケーションの考慮事項

レプリケーション プロセス中に一部のコンテキストが不足しているため、TiCDC ではRENAME TABLE DDL のレプリケーションにいくつかの制約があります。

DDL ステートメントで単一のテーブルの名前を変更する

DDL ステートメントが単一のテーブルの名前を変更する場合、TiCDC は古いテーブル名がフィルター ルールと一致する場合にのみ DDL ステートメントを複製します。次に例を示します。

changefeed の構成ファイルが次のようになっていると仮定します。

[filter] rules = ['test.t*']

TiCDC はこのタイプの DDL を次のように処理します。

DDL複製するかどうか取り扱い理由
RENAME TABLE test.t1 TO test.t2複製するtest.t1フィルタルールに一致します
RENAME TABLE test.t1 TO ignore.t1複製するtest.t1フィルタルールに一致します
RENAME TABLE ignore.t1 TO ignore.t2無視するignore.t1フィルタルールに一致しません
RENAME TABLE test.n1 TO test.t1エラーを報告してレプリケーションを終了する古いテーブル名test.n1フィルタ ルールに一致しませんが、新しいテーブル名test.t1フィルタ ルールに一致します。この操作は不正です。この場合、エラー メッセージを参照して対処してください。
RENAME TABLE ignore.t1 TO test.t1エラーを報告してレプリケーションを終了する上記と同じ理由です。

DDL ステートメントで複数のテーブルの名前を変更する

DDL ステートメントで複数のテーブルの名前を変更する場合、TiCDC は、古いデータベース名古いテーブル名、および新しいデータベース名がすべてフィルター ルールに一致する場合にのみ、DDL ステートメントを複製します。

また、TiCDC はテーブル名を入れ替えるRENAME TABLE DDL をサポートしていません。以下は例です。

changefeed の構成ファイルが次のようになっていると仮定します。

[filter] rules = ['test.t*']

TiCDC はこのタイプの DDL を次のように処理します。

DDL複製するかどうか取り扱い理由
RENAME TABLE test.t1 TO test.t2, test.t3 TO test.t4複製するすべてのデータベース名とテーブル名はフィルター ルールと一致します。
RENAME TABLE test.t1 TO test.ignore1, test.t3 TO test.ignore2複製する古いデータベース名、古いテーブル名、および新しいデータベース名は、フィルター ルールと一致します。
RENAME TABLE test.t1 TO ignore.t1, test.t2 TO test.t22;エラーを報告する新しいデータベース名ignoreフィルター ルールと一致しません。
RENAME TABLE test.t1 TO test.t4, test.t3 TO test.t1, test.t4 TO test.t3;エラーを報告するRENAME TABLE DDL は 1 つの DDL ステートメント内でtest.t1test.t3の名前を入れ替えますが、TiCDC はこれを正しく処理できません。この場合、エラー メッセージを参照して処理してください。

DDL ステートメントの考慮事項

アップストリームでクロスデータベース DDL ステートメント ( CREATE TABLE db1.t1 LIKE t2など) を実行する場合は、関連するすべてのデータベース名を DDL ステートメント ( CREATE TABLE db1.t1 LIKE db2.t2など) で明示的に指定することをお勧めします。そうしないと、データベース名情報が不足しているため、ダウンストリームでクロスデータベース DDL ステートメントが正しく実行されない可能性があります。

イベント フィルタ ルールを使用して DDL イベントをフィルタする場合の注意事項

フィルターされた DDL ステートメントにテーブルの作成または削除が含まれる場合、TiCDC は DML ステートメントのレプリケーション動作に影響を与えずに DDL ステートメントのみをフィルターします。次に例を示します。

changefeed の構成ファイルが次のようになっていると仮定します。

[filter] rules = ['test.t*'] matcher = ["test.t1"] # This filter rule applies only to the t1 table in the test database. ignore-event = ["create table", "drop table", "truncate table", "rename table"]
DDLDDLの動作DMLの動作説明
CREATE TABLE test.t1 (id INT, name VARCHAR(50));無視する複製するtest.t1イベント フィルタ ルールに一致するため、 CREATE TABLEイベントは無視されます。DML イベントのレプリケーションは影響を受けません。
CREATE TABLE test.t2 (id INT, name VARCHAR(50));複製する複製するtest.t2イベント フィルタ ルールと一致しません。
CREATE TABLE test.ignore (id INT, name VARCHAR(50));無視する無視するtest.ignoreイベント フィルター ルールに一致するため、DDL イベントと DML イベントの両方が無視されます。
DROP TABLE test.t1;無視する
  • test.t1イベント フィルタ ルールに一致するため、 DROP TABLEイベントは無視されます。テーブルが削除されたため、TiCDC はt1の DML イベントを複製しなくなります。
    TRUNCATE TABLE test.t1;無視する複製するtest.t1イベント フィルタ ルールに一致するため、 TRUNCATE TABLEイベントは無視されます。DML イベントのレプリケーションは影響を受けません。
    RENAME TABLE test.t1 TO test.t2;無視する複製するtest.t1イベント フィルタ ルールに一致するため、 RENAME TABLEイベントは無視されます。DML イベントのレプリケーションは影響を受けません。
    RENAME TABLE test.t1 TO test.ignore;無視する無視するtest.t1イベント フィルター ルールに一致するため、 RENAME TABLEイベントは無視されます。4 test.ignoreイベント フィルター ルールに一致するため、DDL イベントと DML イベントの両方が無視されます。

    注記:

    • データをデータベースにレプリケートする場合は、イベント フィルターを使用して DDL イベントを慎重にフィルター処理します。レプリケーション中に上流と下流のデータベース スキーマが一貫していることを確認してください。そうでない場合、TiCDC はエラーを報告したり、未定義のレプリケーション動作を引き起こしたりする可能性があります。
    • v6.5.8、v7.1.4、v7.5.1 より前のバージョンでは、イベント フィルターを使用してテーブルの作成または削除を含む DDL イベントをフィルターすると、DML レプリケーションに影響します。これらのバージョンではこの機能を使用することはお勧めしません。

    このページは役に立ちましたか?