主な機能
このドキュメントでは、TiDBデータ移行(DM)によって提供されるデータ移行機能について説明し、適切なパラメーター構成を紹介します。
異なるDMバージョンの場合、テーブルルーティング、ブロックおよび許可リスト、およびbinlogイベントフィルター機能のスキーマ名またはテーブル名の異なる一致ルールに注意してください。
- DM v1.0.5以降のバージョンでは、上記のすべての機能がワイルドカード一致をサポートします。 DMのすべてのバージョンで、ワイルドカード式には
*
を1つしか含めることができず、最後に*
を配置する必要があることに注意してください。 - v1.0.5より前のバージョンのDMの場合、テーブルルーティングとbinlogイベントフィルターはワイルドカードをサポートしますが、
[...]
および[!...]
式はサポートしません。ブロック&許可リストは正規表現のみをサポートします。
単純なシナリオでの照合には、ワイルドカードを使用することをお勧めします。
テーブルルーティング
テーブルルーティング機能により、DMはアップストリームのMySQLまたはMariaDBインスタンスの特定のテーブルをダウンストリームの指定されたテーブルに移行できます。
ノート:
- 1つのテーブルに複数の異なるルーティングルールを設定することはサポートされていません。
- スキーマの一致ルールは個別に構成する必要があります。これは、 パラメータ設定つのうち
rule-2
に示すように、CREATE/DROP SCHEMA xx
を移行するために使用されます。
パラメータ設定
routes:
rule-1:
schema-pattern: "test_*"
table-pattern: "t_*"
target-schema: "test"
target-table: "t"
rule-2:
schema-pattern: "test_*"
target-schema: "test"
パラメータの説明
DMは、 テーブルセレクターによって提供されるschema-pattern
/ table-pattern
ルールに一致するアップストリームのMySQLまたはMariaDBインスタンステーブルをダウンストリームのtarget-schema
に移行しtarget-table
。
使用例
このセクションでは、さまざまなシナリオでの使用例を示します。
シャーディングされたスキーマとテーブルをマージする
シャーディングされたスキーマとテーブルのシナリオで、 test_{1,2,3...}
を移行するとします。 test
への2つのアップストリームMySQLインスタンスのt_{1,2,3...}
のテーブル。ダウンストリームTiDBインスタンスのt
テーブル。
アップストリームインスタンスをダウンストリームに移行するにはtest
。 t
、次のルーティングルールを作成する必要があります。
rule-1
は、schema-pattern: "test_*"
とtable-pattern: "t_*"
に一致するテーブルのDMLまたはDDLステートメントをダウンストリームtest
に移行するために使用されます。t
。rule-2
は、CREATE/DROP SCHEMA xx
などのschema-pattern: "test_*"
に一致するスキーマのDDLステートメントを移行するために使用されます。
ノート:
- ダウンストリーム
schema: test
がすでに存在し、削除しない場合は、rule-2
を省略できます。- ダウンストリーム
schema: test
が存在せず、rule-1
だけが構成されている場合、移行中にschema test doesn't exist
エラーが報告されます。
rule-1:
schema-pattern: "test_*"
table-pattern: "t_*"
target-schema: "test"
target-table: "t"
rule-2:
schema-pattern: "test_*"
target-schema: "test"
シャーディングされたスキーマをマージする
シャーディングされたスキーマのシナリオで、 test_{1,2,3...}
を移行するとします。 test
への2つのアップストリームMySQLインスタンスのt_{1,2,3...}
のテーブル。ダウンストリームTiDBインスタンスのt_{1,2,3...}
のテーブル。
アップストリームスキーマをダウンストリームtest
に移行するには。 t_[1,2,3]
、必要なルーティングルールは1つだけです。
rule-1:
schema-pattern: "test_*"
target-schema: "test"
正しくないテーブルルーティング
次の2つのルーティングルールが構成されていると仮定しtest_1_bak
。 t_1_bak
はrule-1
とrule-2
の両方に一致します。テーブルルーティング構成が数の制限に違反しているため、エラーが報告されます。
rule-1:
schema-pattern: "test_*"
table-pattern: "t_*"
target-schema: "test"
target-table: "t"
rule-2:
schema-pattern: "test_1_bak"
table-pattern: "t_1_bak"
target-schema: "test"
target-table: "t_bak"
テーブルリストをブロックして許可する
アップストリームデータベースインスタンステーブルのブロックおよび許可リストフィルタリングルールは、MySQLレプリケーションルール-db /テーブルに似ています。これは、一部のデータベースまたは一部のテーブルのすべての操作をフィルタリングまたは移行するためにのみ使用できます。
パラメータ設定
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"
パラメータの説明
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
形式のbinlogのみをサポートしており、STATEMENT
またはMIXED
形式のbinlogはサポートしていません。したがって、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には適用されません。
フィルタリングプロセスは次のとおりです。
スキーマレベルでのフィルター:
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" 。 |
Binlogイベントフィルター
Binlogイベントフィルターは、ブロックおよび許可リストのフィルタリングルールよりもきめ細かいフィルタリングルールです。 INSERT
やTRUNCATE TABLE
などのステートメントを使用して、移行またはフィルターで除外する必要があるschema/table
のbinlogイベントを指定できます。
ノート:
- 同じテーブルが複数のルールに一致する場合、これらのルールが順番に適用され、ブロックリストが許可リストよりも優先されます。これは、
Ignore
とDo
の両方のルールがテーブルに適用される場合、Ignore
のルールが有効になることを意味します。- DM v2.0.2以降では、ソース構成ファイルでbinlogイベントフィルターを構成できます。詳細については、 アップストリームデータベースConfiguration / コンフィグレーションファイルを参照してください。
パラメータ設定
filters:
rule-1:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["truncate table", "drop table"]
sql-pattern: ["^DROP\\s+PROCEDURE", "^CREATE\\s+PROCEDURE"]
action: Ignore
パラメータの説明
schema-pattern
/table-pattern
:schema-pattern
に一致するアップストリームMySQLまたはMariaDBインスタンステーブルのtable-pattern
イベントまたはDDL SQLステートメントは、以下のルールによってフィルタリングされます。events
:binlogイベント配列。次の表から1つ以上のEvent
を選択することしかできません。イベント タイプ 説明 all
以下のすべてのイベントが含まれます all dml
以下のすべてのDMLイベントが含まれます all ddl
以下のすべてのDDLイベントが含まれます none
以下のイベントは含まれていません none ddl
以下のDDLイベントは含まれていません none dml
以下のDMLイベントは含まれていません insert
DML INSERT
のDMLイベントupdate
DML UPDATE
のDMLイベントdelete
DML DELETE
のDMLイベントcreate database
DDL CREATE DATABASE
のDDLイベントdrop database
DDL DROP DATABASE
のDDLイベントcreate table
DDL CREATE TABLE
のDDLイベントcreate index
DDL CREATE INDEX
のDDLイベントdrop table
DDL DROP TABLE
のDDLイベントtruncate table
DDL TRUNCATE TABLE
のDDLイベントrename table
DDL RENAME TABLE
のDDLイベントdrop index
DDL DROP INDEX
のDDLイベントalter table
DDL ALTER TABLE
のDDLイベントsql-pattern
:指定されたDDLSQLステートメントをフィルタリングするために使用されます。マッチングルールは、正規表現の使用をサポートしています。たとえば、"^DROP\\s+PROCEDURE"
。action
:文字Ignore
Do
。以下のルールに基づいて、フィルタリングするかどうかを判断します。 2つのルールのいずれかが満たされると、binlogがフィルタリングされます。それ以外の場合、binlogはフィルタリングされません。Do
:許可リスト。 binlogは、次の2つの条件のいずれかでフィルタリングされます。- イベントのタイプは、ルールの
event
リストに含まれていません。 - イベントのSQLステートメントは、ルールの
sql-pattern
と一致することはできません。
- イベントのタイプは、ルールの
Ignore
:ブロックリスト。 binlogは、次の2つの条件のいずれかでフィルタリングされます。- イベントのタイプは、ルールの
event
リストにあります。 - イベントのSQLステートメントは、ルールの
sql-pattern
つと一致させることができます。
- イベントのタイプは、ルールの
使用例
このセクションでは、シャーディング(シャーディングされたスキーマとテーブル)のシナリオでの使用例を示します。
すべてのシャーディング削除操作をフィルタリングする
すべての削除操作を除外するには、次の2つのフィルタリングルールを構成します。
filter-table-rule
は、drop table
truncate table
およびdelete statement
の操作を除外しtest_*
。t_*
パターン。filter-schema-rule
は、test_*
のパターンに一致するすべてのスキーマのdrop database
の操作を除外します。
filters:
filter-table-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["truncate table", "drop table", "delete"]
action: Ignore
filter-schema-rule:
schema-pattern: "test_*"
events: ["drop database"]
action: Ignore
シャーディングDMLステートメントのみを移行する
シャーディングDMLステートメントのみを移行するには、次の2つのフィルタリングルールを構成します。
do-table-rule
は、insert
に一致するすべてのテーブルのcreate table
、およびupdate
test_*
のみを移行しdelete
。t_*
パターン。do-schema-rule
は、test_*
パターンに一致するすべてのスキーマのcreate database
ステートメントのみを移行します。
ノート:
create database/table
ステートメントがマイグレーションされる理由は、スキーマとテーブルが作成された後にのみDMLステートメントをマイグレーションできるためです。
filters:
do-table-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
events: ["create table", "all dml"]
action: Do
do-schema-rule:
schema-pattern: "test_*"
events: ["create database"]
action: Do
TiDBがサポートしていないSQLステートメントを除外します
TiDBがサポートしていないPROCEDURE
のステートメントを除外するには、次のfilter-procedure-rule
を構成します。
filters:
filter-procedure-rule:
schema-pattern: "test_*"
table-pattern: "t_*"
sql-pattern: ["^DROP\\s+PROCEDURE", "^CREATE\\s+PROCEDURE"]
action: Ignore
filter-procedure-rule
は、 test_*
に一致するすべてのテーブルの^CREATE\\s+PROCEDURE
および^DROP\\s+PROCEDURE
ステートメントを除外します。 t_*
パターン。
TiDBパーサーがサポートしていないSQLステートメントを除外します
table
パーサーがサポートしていないSQLステートメントの場合、DMはそれらを解析してschema
情報を取得できません。したがって、グローバルフィルタリングルールを使用する必要があります: schema-pattern: "*"
。
ノート:
移行する必要のあるデータが除外されないようにするには、グローバルフィルタリングルールをできるだけ厳密に構成する必要があります。
(一部のバージョンの)TiDBパーサーがサポートしていないPARTITION
のステートメントをフィルターで除外するには、次のフィルター規則を構成します。
filters:
filter-partition-rule:
schema-pattern: "*"
sql-pattern: ["ALTER\\s+TABLE[\\s\\S]*ADD\\s+PARTITION", "ALTER\\s+TABLE[\\s\\S]*DROP\\s+PARTITION"]
action: Ignore
オンラインDDLツール
MySQLエコシステムでは、gh-ostやpt-oscなどのツールが広く使用されています。 DMは、不要な中間データの移行を回避するために、これらのツールのサポートを提供します。
制限
- DMはgh-ostとpt-oscのみをサポートします。
online-ddl
が有効になっている場合、インクリメンタルレプリケーションに対応するチェックポイントはオンラインDDL実行のプロセスにあるべきではありません。たとえば、アップストリームオンラインDDL操作がbinlogのposition-A
で開始し、position-B
で終了する場合、増分レプリケーションの開始点はposition-A
より前またはposition-B
より後である必要があります。そうしないと、エラーが発生します。詳しくはFAQをご覧ください。
パラメータ設定
- v2.0.5 and later
- earlier than v2.0.5
v2.0.5以降のバージョンでは、 task
の構成ファイルのonline-ddl
の構成アイテムを使用する必要があります。
- アップストリームのMySQL/MariaDBが(同時に)gh-ostまたはpt-oscツールを使用する場合は、タスク構成ファイルで
online-ddl
からtrue
に設定します。
online-ddl: true
ノート:
v2.0.5以降、
online-ddl-scheme
は非推奨になっているため、online-ddl-scheme
ではなくonline-ddl
を使用する必要があります。つまり、設定online-ddl: true
はonline-ddl-scheme
を上書きし、設定online-ddl-scheme: "pt"
またはonline-ddl-scheme: "gh-ost"
はonline-ddl: true
に変換されます。
v2.0.5(v2.0.5を含まない)より前では、 task
構成ファイルのonline-ddl-scheme
構成項目を使用する必要があります。
- アップストリームのMySQL/MariaDBがgh-ostツールを使用する場合は、タスク構成ファイルで設定します。
online-ddl-scheme: "gh-ost"
- アップストリームのMySQL/MariaDBがptツールを使用する場合は、タスク構成ファイルで設定します。
online-ddl-scheme: "pt"
シャードマージ
DMは、アップストリームのMySQL / MariaDBシャードテーブルのDMLデータとDDLデータのマージ、およびマージされたデータのダウンストリームTiDBテーブルへの移行をサポートしています。
制限
現在、シャードマージ機能は限られたシナリオでのみサポートされています。詳細については、 ペシミスティックモードでのDDL使用制限のシャーディングとオプティミスティックモードでのDDL使用制限のシャーディングを参照してください。
パラメータ設定
タスク構成ファイルでshard-mode
からpessimistic
を設定します。
shard-mode: "pessimistic" # The shard merge mode. Optional modes are ""/"pessimistic"/"optimistic". The "" mode is used by default which means sharding DDL merge is disabled. If the task is a shard merge task, set it to the "pessimistic" mode. After getting a deep understanding of the principles and restrictions of the "optimistic" mode, you can set it to the "optimistic" mode.
シャーディングDDLロックを手動で処理する
いくつかの異常なシナリオでは、 シャーディングDDLロックを手動で処理するにする必要があります。