テーブルフィルター
TiDB 移行ツールは、デフォルトではすべてのデータベースで動作しますが、多くの場合、サブセットのみが必要になります。たとえば、 foo*
とbar*
形式のスキーマのみを操作し、他のスキーマは操作しないという場合です。
TiDB 4.0 以降、すべての TiDB 移行ツールはサブセットを定義するための共通のフィルター構文を共有しています。このドキュメントでは、テーブル フィルター機能の使用方法について説明します。
使用法
コマンドライン
テーブル フィルターは、複数の-f
または--filter
コマンド ライン パラメーターを使用してツールに適用できます。各フィルターはdb.table
の形式であり、各部分はワイルドカードにすることができます ( 次のセクションでさらに詳しく説明します)。次に使用例を示します。
Dumpling :
tiup dumpling -f 'foo*.*' -f 'bar*.*' -P 3306 -o /tmp/data/
- tiup tidb-lightning -f 'foo*.*' -f 'bar*.*' -d /tmp/data/ --backend tidb
TOML設定ファイル
TOML ファイル内のテーブル フィルターは文字列の配列として指定されます。以下に使用例を示します。
TiDB Lightning:
[mydumper] filter = ['foo*.*', 'bar*.*']
構文
プレーンテーブル名
各テーブル フィルタ ルールは、ドット ( .
) で区切られた「スキーマ パターン」と「テーブル パターン」で構成されます。完全修飾名がルールに一致するテーブルが受け入れられます。
db1.tbl1
db2.tbl2
db3.tbl3
プレーン名は、次のように有効な識別子文字のみで構成する必要があります。
- 数字(
0
~9
) - 文字 (
a
からz
、A
からZ
) $
_
- 非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 つの呼び出しは同等です。
tiup dumpling -f '@config/filter.txt'
tiup 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`
引用符は、それ自体を二重にすることで識別子内に含めることができます。
"foo""bar".`foo``bar`
# equivalent to:
foo\"bar.foo\`bar
引用符で囲まれた識別子は複数行にまたがることはできません。
識別子を部分的に引用することは無効です。
"this is "invalid*.*
正規表現
非常に複雑なルールが必要な場合は、各パターンを/
で区切られた正規表現として記述できます。
/^db\d{2,}$/./^tbl\d{2,}$/
これらの正規表現は囲碁方言を使用します。識別子に正規表現に一致する部分文字列が含まれている場合、パターンは一致します。たとえば、 /b/
db01
と一致します。
注記:
正規表現内のすべての
/
、[…]
内も含め、\/
としてエスケープする必要があります。\Q…\E
の間にエスケープされていない/
を配置することはできません。
複数のルール
注記:
このセクションはTiDB Cloudには適用されません。現在、 TiDB Cloud は1 つのテーブル フィルター ルールのみをサポートしています。
テーブル名がフィルター リスト内のどのルールとも一致しない場合は、デフォルトの動作では、そのような一致しないテーブルは無視されます。
ブロック リストを作成するには、最初のルールとして明示的に*.*
使用する必要があります。そうしないと、すべてのテーブルが除外されます。
# every table will be filtered out
tiup dumpling -f '!*.Password'
# only the "Password" table is filtered out, the rest are included.
tiup dumpling -f '*.*' -f '!*.Password'
フィルター リストでは、テーブル名が複数のパターンに一致する場合、最後の一致によって結果が決まります。例:
# rule 1
employees.*
# rule 2
!*.dep*
# rule 3
*.departments
フィルタリングされた結果は次のとおりです。
テーブル名 | ルール1 | ルール2 | ルール3 | 結果 |
---|---|---|---|---|
無関係な表 | デフォルト(拒否) | |||
従業員。従業員 | ✓ | ルール1(受け入れる) | ||
従業員.部門 | ✓ | ✓ | ルール2(拒否) | |
従業員.部門 | ✓ | ✓ | ✓ | ルール3(受け入れる) |
それ以外の場合 | ✓ | ✓ | ルール3(受け入れる) |
注記:
TiDB ツールでは、システム スキーマはデフォルト構成では常に除外されます。システム スキーマは次のとおりです。
INFORMATION_SCHEMA
PERFORMANCE_SCHEMA
METRICS_SCHEMA
INSPECTION_SCHEMA
mysql
sys