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"
単純なシナリオでは、スキーマとテーブルの一致にワイルドカードを使用することをお勧めします。ただし、次のバージョンの違いに注意してください。
DM v1.0.5 以降のバージョンの場合、ブロック リストと許可リストはワイルドカードマッチサポートしますが、ワイルドカード式で指定できるのは
*だけであり、最後に*を配置する必要があります。v1.0.5 より前の DM バージョンでは、ブロック リストと許可リストは正規表現の一致のみをサポートします。
パラメータの説明
do-dbs: MySQL のreplicate-do-dbと同様に、スキーマのリストの移行を許可します。ignore-dbs: 移行するスキーマのブロック リスト。MySQL のreplicate-ignore-dbに似ています。do-tables: MySQL のreplicate-do-tableと同様に、テーブルのリストの移行を許可します。db-nameとtbl-nameの両方を指定する必要があります。ignore-tables: 移行するテーブルのブロック リスト。MySQL のreplicate-ignore-tableに似ています。db-nameとtbl-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 は、ステートメントの
USEセクションで明示的に指定されたデータベース名によってのみ DDL ステートメントを決定します。 DM は、最初に DDL ステートメントのデータベース名セクションに基づいてステートメントを決定します。 DDL ステートメントにそのようなセクションが含まれていない場合、DM はUSEセクションによってステートメントを判別します。判別する SQL ステートメントがUSE test_db_2; CREATE TABLE test_db_1.test_table (c1 INT PRIMARY KEY)であるとします。replicate-do-db=test_db_1は MySQL で構成され、do-dbs: ["test_db_1"]は DM で構成されます。次に、このルールは 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. スキーマとテーブルは db-name: "~^forum.*",tbl-name: "messages" of do-tablesと一致します。 |