テーブル フィルター

TiDB 移行ツールは、デフォルトですべてのデータベースで動作しますが、多くの場合、サブセットのみが必要です。たとえば、 foo*bar*の形式のスキーマのみを操作し、それ以外は何も操作したくないとします。

TiDB 4.0 以降、すべての TiDB 移行ツールは共通のフィルター構文を共有してサブセットを定義しています。このドキュメントでは、テーブル フィルタ機能の使用方法について説明します。

使用法

CLI

複数の-fつまたは--filterのコマンド ライン パラメーターを使用して、テーブル フィルターをツールに適用できます。各フィルターはdb.tableの形式で、各部分はワイルドカードにすることができます ( 次のセクションで詳しく説明します)。以下に使用例を示します。

  • ブラジル :

    ./br backup full -f 'foo*.*' -f 'bar*.*' -s 'local:///tmp/backup'
    ./br restore full -f 'foo*.*' -f 'bar*.*' -s 'local:///tmp/backup'
  • Dumpling :

    ./dumpling -f 'foo*.*' -f 'bar*.*' -P 3306 -o /tmp/data/
  • TiDB Lightning :

    ./tidb-lightning -f 'foo*.*' -f 'bar*.*' -d /tmp/data/ --backend tidb

TOML 構成ファイル

TOML ファイルのテーブル フィルターは文字列の配列として指定されます。以下に使用例を示します。

  • TiDB Lightning:

    [mydumper] filter = ['foo*.*', 'bar*.*']
  • TiCDC :

    [filter] rules = ['foo*.*', 'bar*.*'] [[sink.dispatchers]] matcher = ['db1.*', 'db2.*', 'db3.*'] dispatcher = 'ts'

構文

プレーンなテーブル名

各テーブル フィルター ルールは、ドット ( . ) で区切られた「スキーマ パターン」と「テーブル パターン」で構成されます。完全修飾名がルールに一致するテーブルが受け入れられます。

db1.tbl1 db2.tbl2 db3.tbl3

プレーンな名前は、次のような有効な識別子文字のみで構成する必要があります。

  • 数字 ( 09 )
  • 文字 ( azAZ )
  • $
  • _
  • 非 ASCII 文字 (U+0080 から U+10FFFF)

他のすべての ASCII 文字は予約されています。次のセクションで説明するように、一部の句読点には特別な意味があります。

ワイルドカード

名前の各部分は、 fnmatch(3)で説明されているワイルドカード記号にすることができます。

  • * — 0 個以上の文字に一致
  • ? — 1 文字に一致
  • [a-z]"a""z" の間の 1 文字に一致します。
  • [!a-z]"a" から "z" を除く 1 文字に一致します。
db[0-9].tbl[0-9a-f][0-9a-f] data.* *.backup_*

ここでの「文字」は、次のような Unicode コード ポイントを意味します。

  • U+00E9 (é) は 1 文字です。
  • U+0065 U+0301 (é) は 2 文字です。
  • U+1F926 U+1F3FF U+200D U+2640 U+FE0F (🤦🏿‍♀️)は5文字です。

ファイルのインポート

ファイルをフィルタ ルールとしてインポートするには、ルールの先頭に@を含めてファイル名を指定します。テーブル フィルター パーサーは、インポートされたファイルの各行を追加のフィルター ルールとして扱います。

たとえば、ファイルconfig/filter.txtに次の内容があるとします。

employees.* *.WorkOrder

次の 2 つの呼び出しは同等です。

./dumpling -f '@config/filter.txt' ./dumpling -f 'employees.*' -f '*.WorkOrder'

フィルター ファイルは、別のファイルをさらにインポートすることはできません。

コメントと空行

フィルター ファイル内では、すべての行の先頭と末尾の空白が削除されます。また、空行(空文字列)は無視されます。

先頭の#はコメントを示し、無視されます。行頭にない#は、構文エラーと見なされます。

# this line is a comment db.table # but this part is not comment and may cause error

除外

ルールの先頭にある!は、テーブルを処理対象から除外するために使用された後のパターンを意味します。これにより、フィルタが効果的にブロック リストに変わります。

*.* #^ note: must add the *.* to include all tables first !*.Password !employees.salaries

エスケープ文字

特殊文字を識別子文字に変えるには、その前にバックスラッシュ\を付けます。

db\.with\.dots.*

簡素化と将来の互換性のために、次のシーケンスは禁止されています。

  • 空白をトリミングした後の行末の\ (末尾の文字どおりの空白に一致させるには[ ]を使用)。
  • \の後に任意の ASCII 英数字 ( [0-9a-zA-Z] ) が続きます。特に、 \0\r\n\tなどの C ライクなエスケープ シーケンスは、現在のところ意味がありません。

引用識別子

\の他に、特殊文字も"または`を使用して引用することで抑制できます。

"db.with.dots"."tbl\1" `db.with.dots`.`tbl\2`

引用符は、それ自体を 2 倍にすることにより、識別子内に含めることができます。

"foo""bar".`foo``bar` # equivalent to: foo\"bar.foo\`bar

引用符で囲まれた識別子は、複数行にまたがることはできません。

識別子を部分的に引用することは無効です:

"this is "invalid*.*

正規表現

非常に複雑なルールが必要な場合は、各パターンを/で区切られた正規表現として記述できます。

/^db\d{2,}$/./^tbl\d{2,}$/

これらの正規表現は方言を行くを使用します。正規表現に一致する部分文字列が識別子に含まれている場合、パターンは一致します。たとえば、 /b/db01に一致します。

ノート:

正規表現のすべての/は、 […]内を含めて\/としてエスケープする必要があります。エスケープされていない/\Q…\Eの間に配置することはできません。

複数のルール

テーブル名がフィルタ リスト内のどのルールにも一致しない場合、デフォルトの動作では、そのような一致しないテーブルは無視されます。

ブロック リストを作成するには、明示的な*.*を最初のルールとして使用する必要があります。そうしないと、すべてのテーブルが除外されます。

# every table will be filtered out ./dumpling -f '!*.Password' # only the "Password" table is filtered out, the rest are included. ./dumpling -f '*.*' -f '!*.Password'

フィルタ リストでは、テーブル名が複数のパターンに一致する場合、最後の一致が結果を決定します。例えば:

# rule 1 employees.* # rule 2 !*.dep* # rule 3 *.departments

フィルタリングされた結果は次のとおりです。

テーブル名ルール 1ルール 2ルール 3結果
無関係なテーブルデフォルト (拒否)
従業員.従業員ルール 1 (受け入れる)
employees.dept_empルール 2 (拒否)
従業員.部門ルール 3 (受け入れる)
他の部門ルール 3 (受け入れる)

ノート:

TiDB ツールでは、システム スキーマは常にデフォルト設定で除外されます。システム スキーマは次のとおりです。

  • INFORMATION_SCHEMA
  • PERFORMANCE_SCHEMA
  • METRICS_SCHEMA
  • INSPECTION_SCHEMA
  • mysql
  • sys