TiDB データ移行のブロック リストと許可リスト
TiDB Data Migration (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と同様に、テーブルのリストの移行を許可します。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 には適用されません。
a 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と一致します。 |