TiDB データ移行のブロックリストと許可リスト
TiDB データ移行 (DM) を使用してデータを移行する場合、ブロック リストと許可リストを構成して、一部のデータベースまたは一部のテーブルのすべての操作をフィルター処理したり、一部の操作のみを移行したりできます。
ブロックリストと許可リストを設定する
タスク構成ファイルに次の構成を追加します。
block-allow-list: # Use black-white-list if the DM version is earlier than or equal to v2.0.0-beta.2.
rule-1:
do-dbs: ["test*"] # Starting with characters other than "~" indicates that it is a wildcard;
# v1.0.5 or later versions support the regular expression rules.
do-tables:
- db-name: "test[123]" # Matches test1, test2, and test3.
tbl-name: "t[1-5]" # Matches t1, t2, t3, t4, and t5.
- db-name: "test"
tbl-name: "t"
rule-2:
do-dbs: ["~^test.*"] # Starting with "~" indicates that it is a regular expression.
ignore-dbs: ["mysql"]
do-tables:
- db-name: "~^test.*"
tbl-name: "~^t.*"
- db-name: "test"
tbl-name: "t*"
ignore-tables:
- db-name: "test"
tbl-name: "log"
シンプルなシナリオでは、スキーマとテーブルのマッチングにワイルドカードを使用することをお勧めします。ただし、以下のバージョンの違いにご注意ください。
*[]含むワイルドカードがサポートされています。ワイルドカードマッチでは*記号は1?だけ使用でき、末尾になければなりません。例えば、tbl-name: "t*"の場合、"t*"tで始まるすべてのテーブルを表します。詳細はワイルドカードマッチング参照してください。正規表現は
~文字で始まる必要があります。
パラメータの説明
do-dbs: MySQL のreplicate-do-dbと同様に、移行するスキーマのリストを許可します。ignore-dbs: 移行するスキーマのブロック リスト (MySQL のreplicate-ignore-dbに類似)。do-tables: 移行するテーブルのリストを許可します(MySQLのreplicate-do-tableに相当)。4とtbl-namedb-nameを指定する必要があります。ignore-tables: 移行対象テーブルのブロックリスト(MySQLのreplicate-ignore-tableに相当)。4とtbl-namedb-nameを指定する必要があります。
上記のパラメータの値が~文字で始まる場合、その値の以降の文字は正規表現として扱われます。このパラメータは、スキーマ名またはテーブル名を一致させるために使用できます。
フィルタリングプロセス
do-dbsとignore-dbsに対応するフィルタリング ルールは、MySQL のデータベースレベルのレプリケーションとバイナリログオプションの評価と同様です。do-tablesとignore-tablesに対応するフィルタリング ルールは、MySQL のテーブルレベルのレプリケーションオプションの評価と同様です。
注記:
DM と MySQL では、ブロック リストと許可リストのフィルタリング ルールが次の点で異なります。
- MySQLでは、
replicate-wild-do-tableとreplicate-wild-ignore-tableワイルドカード文字をサポートしています。DMでは、一部のパラメータ値は~で始まる正規表現を直接サポートしています。- DMは現在、
ROW形式のバイナリログのみをサポートしており、STATEMENT形式とMIXED形式のバイナリログはサポートしていません。そのため、DMのフィルタリングルールはMySQLのROW形式のフィルタリングルールに対応しています。- MySQLは、DDL文の
USEのセクションに明示的に指定されたデータベース名のみに基づいてDDL文を判別します。DMは、まずDDL文のデータベース名セクションに基づいて文を判別します。DDL文にそのようなセクションが含まれていない場合、DMはUSE番目のセクションに基づいて文を判別します。判別対象のSQL文がUSE test_db_2; CREATE TABLE test_db_1.test_table (c1 INT PRIMARY KEY)で、MySQLにreplicate-do-db=test_db_1が設定され、DMにdo-dbs: ["test_db_1"]設定されているとします。この場合、このルールはDMにのみ適用され、MySQLには適用されません。
testテーブルのフィルタリング プロセスt次のとおりです。
スキーマレベルでフィルターします。
do-dbs空でない場合は、do-dbsに一致するスキーマが存在するかどうかを確認します。- はいの場合は、テーブルレベルでフィルタリングを続行します。
- そうでない場合は、
test。t。
do-dbsが空でignore-dbs空でない場合は、ignore-dbsに一致するスキーマが存在するかどうかを確認します。- はいの場合は、フィルター
test。t。 - そうでない場合は、テーブルレベルでフィルタリングを続行します。
- はいの場合は、フィルター
do-dbsとignore-dbs両方が空の場合は、テーブルレベルでフィルタリングを続行します。
テーブルレベルでフィルターします。
do-tables空でない場合は、do-tablesに一致するテーブルが存在するかどうかを確認します。- はいの場合は、
test.t移行します。 - そうでない場合は、
test。t。
- はいの場合は、
ignore-tables空でない場合は、ignore-tablesに一致するテーブルが存在するかどうかを確認します。- はいの場合は、フィルター
test。t。 - そうでない場合は、
test。t。 を移行します。
- はいの場合は、フィルター
do-tablesとignore-tables両方が空の場合は、test。t。
注記:
スキーマ
testフィルタリングする必要があるかどうかを確認するには、スキーマ レベルでフィルタリングするだけで済みます。
使用例
アップストリーム MySQL インスタンスに次のテーブルが含まれていると仮定します。
`logs`.`messages_2016`
`logs`.`messages_2017`
`logs`.`messages_2018`
`forum`.`users`
`forum`.`messages`
`forum_backup_2016`.`messages`
`forum_backup_2017`.`messages`
`forum_backup_2018`.`messages`
構成は次のとおりです。
block-allow-list: # Use black-white-list if the DM version is earlier than or equal to v2.0.0-beta.2.
bw-rule:
do-dbs: ["forum_backup_2018", "forum"]
ignore-dbs: ["~^forum_backup_"]
do-tables:
- db-name: "logs"
tbl-name: "~_2018$"
- db-name: "~^forum.*"
tbl-name: "messages"
ignore-tables:
- db-name: "~.*"
tbl-name: "^messages.*"
bw-ruleルールを適用した後:
| テーブル | フィルタリングするかどうか | なぜフィルタリングするのか |
|---|---|---|
logs messages_2016 | はい | スキーマlogsいずれのdo-dbsにも一致しません。 |
logs messages_2017 | はい | スキーマlogsいずれのdo-dbsにも一致しません。 |
logs messages_2018 | はい | スキーマlogsいずれのdo-dbsにも一致しません。 |
forum_backup_2016 messages | はい | スキーマforum_backup_2016いずれのdo-dbsにも一致しません。 |
forum_backup_2017 messages | はい | スキーマforum_backup_2017いずれのdo-dbsにも一致しません。 |
forum users | はい | forum do-dbsと一致し、テーブル レベルでフィルタリングを続行します。2. スキーマとテーブルが do-tablesとignore-tablesいずれにも一致せず、 do-tables空ではありません。 |
forum messages | いいえ | forum do-dbsと一致し、テーブル レベルでフィルタリングを続行します。2. 表 messages do-tablesのdb-name: "~^forum.*",tbl-name: "messages"にあります。 |
forum_backup_2018 messages | いいえ | forum_backup_2018 do-dbsと一致し、テーブル レベルでフィルタリングを続行します。2. スキーマとテーブルは do-tables中db-name: "~^forum.*",tbl-name: "messages"一致します。 |