チェンジフィード DDL レプリケーション
このドキュメントでは、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.t1 とtest.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"]
DDL | DDLの動作 | 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 レプリケーションに影響します。これらのバージョンではこの機能を使用することはお勧めしません。