テーブルフィルター
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
) z
Z
a
A
$
_
- 非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(受け入れる) |
else.部門 | ✓ | ✓ | ルール3(受け入れる) |
注記:
TiDBツールでは、システムスキーマはデフォルト設定では常に除外されます。システムスキーマは以下のとおりです。
INFORMATION_SCHEMA
PERFORMANCE_SCHEMA
METRICS_SCHEMA
INSPECTION_SCHEMA
mysql
sys