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 とdb-name
tbl-name
両方を指定する必要があります。ignore-tables
: 移行するテーブルのブロック リスト。MySQL のreplicate-ignore-table
に似ています。4 と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. スキーマとテーブルは do-tables 中db-name: "~^forum.*",tbl-name: "messages" と一致します。 |