GH-ost/PT-oscを使用するデータベースからの移行
本番シナリオでは、DDL実行中のテーブルロックにより、データベースからの読み取りまたはデータベースへの書き込みがある程度ブロックされる可能性があります。したがって、オンラインDDLツールは、読み取りと書き込みへの影響を最小限に抑えるためにDDLを実行するためによく使用されます。一般的なDDLツールは幽霊とpt-oscです。
DMを使用してMySQLからTiDBにデータを移行する場合、online-ddlをエンベールして、DMとgh-ostまたはpt-oscのコラボレーションを可能にすることができます。 online-ddlを有効にする方法と、このオプションを有効にした後のワークフローの詳細については、 gh-ostまたはpt-oscを使用した連続レプリケーションを参照してください。このドキュメントでは、DMツールとオンラインDDLツールのコラボレーションの詳細に焦点を当てています。
オンラインDDLツールを使用したDMの作業の詳細
このセクションでは、online-schema-changeを実装する際のオンラインDDLツール幽霊およびpt-oscを使用したDMの動作の詳細について説明します。
online-schema-change:gh-ost
gh-ostがonline-schema-changeを実装すると、次の3種類のテーブルが作成されます。
- gho:DDLを適用するために使用されます。データが完全に複製され、ghoテーブルがoriginテーブルと一致している場合、originテーブルは名前変更によって置き換えられます。
- ghc:online-schema-changeに関連する情報を格納するために使用されます。
- del:オリジンテーブルの名前を変更して作成されます。
移行の過程で、DMは上記のテーブルを3つのカテゴリに分類します。
- ghostTable:
\_\*\_gho
\_\*\_del
:\_\*\_ghc
- realTable:online-ddlを実行するオリジンテーブル。
gh-ostで主に使用されるSQLステートメントとそれに対応するDMの操作は次のとおりです。
_ghc
のテーブルを作成します。Create /* gh-ost */ table `test`.`_test4_ghc` ( id bigint auto_increment, last_update timestamp not null DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, hint varchar(64) charset ascii not null, value varchar(4096) charset ascii not null, primary key(id), unique key hint_uidx(hint) ) auto_increment=256 ;DMは
_test4_ghc
のテーブルを作成しません。_gho
のテーブルを作成します。Create /* gh-ost */ table `test`.`_test4_gho` like `test`.`test4` ;DMは
_test4_gho
のテーブルを作成しません。 DMは、ghost_schema
、およびghost_table
ofserver_id
dm_worker
、ダウンストリームのdm_meta.{task_name}\_onlineddl
レコードを削除し、メモリ内の関連情報をクリアします。DELETE FROM dm_meta.{task_name}_onlineddl WHERE id = {server_id} and ghost_schema = {ghost_schema} and ghost_table = {ghost_table};_gho
のテーブルで実行する必要のあるDDLを適用します。Alter /* gh-ost */ table `test`.`_test4_gho` add column cl1 varchar(20) not null ;DMは
_test4_gho
のDDL操作を実行しません。このDDLをdm_meta.{task_name}\_onlineddl
とメモリに記録します。REPLACE INTO dm_meta.{task_name}_onlineddl (id, ghost_schema , ghost_table , ddls) VALUES (......);_ghc
のテーブルにデータを書き込み、元のテーブルのデータを_gho
のテーブルに複製します。Insert /* gh-ost */ into `test`.`_test4_ghc` values (......); Insert /* gh-ost `test`.`test4` */ ignore into `test`.`_test4_gho` (`id`, `date`, `account_id`, `conversion_price`, `ocpc_matched_conversions`, `ad_cost`, `cl2`) (select `id`, `date`, `account_id`, `conversion_price`, `ocpc_matched_conversions`, `ad_cost`, `cl2` from `test`.`test4` force index (`PRIMARY`) where (((`id` > _binary'1') or ((`id` = _binary'1'))) and ((`id` < _binary'2') or ((`id` = _binary'2')))) lock in share mode ) ;DMは、 realtable用ではないDMLステートメントを実行しません。
移行が完了すると、元のテーブルと
_gho
のテーブルの両方の名前が変更され、オンラインDDL操作が完了します。Rename /* gh-ost */ table `test`.`test4` to `test`.`_test4_del`, `test`.`_test4_gho` to `test`.`test4`;DMは、次の2つの操作を実行します。
DMは、上記の
rename
つの操作を2つのSQLステートメントに分割します。rename test.test4 to test._test4_del; rename test._test4_gho to test.test4;DMは
rename to _test4_del
を実行しません。rename ghost_table to origin table
を実行する場合、DMは次の手順を実行します。- 手順3でメモリに記録されたDDLを読み取ります
ghost_table
とghost_schema
をorigin_table
とそれに対応するスキーマに置き換えます- 置き換えられたDDLを実行します
alter table test._test4_gho add column cl1 varchar(20) not null; -- Replaced with: alter table test.test4 add column cl1 varchar(20) not null;
ノート:
gh-ostの特定のSQLステートメントは、実行で使用されるパラメーターによって異なります。このドキュメントには、主要なSQLステートメントのみが記載されています。詳細については、 gh-ostドキュメントを参照してください。
online-schema-change:pt
pt-oscがonline-schema-changeを実装すると、次の2種類のテーブルが作成されます。
new
:DDLを適用するために使用されます。データが完全に複製され、new
のテーブルが元のテーブルと一致している場合、元のテーブルは名前の変更によって置き換えられます。old
:オリジンテーブルの名前を変更して作成されます。pt_osc\_\*\_upd
種類のトリガーpt_osc\_\*\_del
pt_osc\_\*\_ins
。 pt_oscのプロセスでは、オリジンテーブルによって生成された新しいデータがトリガーによってnew
に複製されます。
移行の過程で、DMは上記のテーブルを3つのカテゴリに分類します。
- ghostTable:
\_\*\_new
- trashTable:
\_\*\_old
- realTable:online-ddlを実行するオリジンテーブル。
pt-oscで主に使用されるSQLステートメントとそれに対応するDMの操作は次のとおりです。
_new
のテーブルを作成します。CREATE TABLE `test`.`_test4_new` ( id int(11) NOT NULL AUTO_INCREMENT, date date DEFAULT NULL, account_id bigint(20) DEFAULT NULL, conversion_price decimal(20,3) DEFAULT NULL, ocpc_matched_conversions bigint(20) DEFAULT NULL, ad_cost decimal(20,3) DEFAULT NULL,cl2 varchar(20) COLLATE utf8mb4_bin NOT NULL,cl1 varchar(20) COLLATE utf8mb4_bin NOT NULL,PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ;DMは
_test4_new
のテーブルを作成しません。 DMは、ghost_schema
、およびghost_table
ofserver_id
dm_worker
、ダウンストリームのdm_meta.{task_name}\_onlineddl
レコードを削除し、メモリ内の関連情報をクリアします。DELETE FROM dm_meta.{task_name}_onlineddl WHERE id = {server_id} and ghost_schema = {ghost_schema} and ghost_table = {ghost_table};_new
のテーブルでDDLを実行します。ALTER TABLE `test`.`_test4_new` add column c3 int;DMは
_test4_new
のDDL操作を実行しません。代わりに、このDDLをdm_meta.{task_name}\_onlineddl
とメモリに記録します。REPLACE INTO dm_meta.{task_name}_onlineddl (id, ghost_schema , ghost_table , ddls) VALUES (......);データ移行に使用される3つのトリガーを作成します。
CREATE TRIGGER `pt_osc_test_test4_del` AFTER DELETE ON `test`.`test4` ...... ; CREATE TRIGGER `pt_osc_test_test4_upd` AFTER UPDATE ON `test`.`test4` ...... ; CREATE TRIGGER `pt_osc_test_test4_ins` AFTER INSERT ON `test`.`test4` ...... ;DMは、TiDBでサポートされていないトリガー操作を実行しません。
元のテーブルデータを
_new
のテーブルに複製します。INSERT LOW_PRIORITY IGNORE INTO `test`.`_test4_new` (`id`, `date`, `account_id`, `conversion_price`, `ocpc_matched_conversions`, `ad_cost`, `cl2`, `cl1`) SELECT `id`, `date`, `account_id`, `conversion_price`, `ocpc_matched_conversions`, `ad_cost`, `cl2`, `cl1` FROM `test`.`test4` LOCK IN SHARE MODE /*pt-online-schema-change 3227 copy table*/DMは、 realtable用ではないDMLステートメントを実行しません。
データ移行が完了すると、元のテーブルと
_new
のテーブルの名前が変更され、オンラインDDL操作が完了します。RENAME TABLE `test`.`test4` TO `test`.`_test4_old`, `test`.`_test4_new` TO `test`.`test4`DMは、次の2つの操作を実行します。
DMは、上記の
rename
つの操作を2つのSQLステートメントに分割します。rename test.test4 to test._test4_old; rename test._test4_new to test.test4;DMは
rename to _test4_old
を実行しません。rename ghost_table to origin table
を実行する場合、DMは次の手順を実行します。- 手順2でメモリに記録されたDDLを読み取ります
ghost_table
とghost_schema
をorigin_table
とそれに対応するスキーマに置き換えます- 置き換えられたDDLを実行します
ALTER TABLE `test`.`_test4_new` add column c3 int; -- Replaced with: ALTER TABLE `test`.`test4` add column c3 int;
オンラインDDL操作の
_old
のテーブルと3つのトリガーを削除します。DROP TABLE IF EXISTS `test`.`_test4_old`; DROP TRIGGER IF EXISTS `pt_osc_test_test4_del` AFTER DELETE ON `test`.`test4` ...... ; DROP TRIGGER IF EXISTS `pt_osc_test_test4_upd` AFTER UPDATE ON `test`.`test4` ...... ; DROP TRIGGER IF EXISTS `pt_osc_test_test4_ins` AFTER INSERT ON `test`.`test4` ...... ;DMは
_test4_old
とトリガーを削除しません。
ノート:
pt-oscの特定のSQLステートメントは、実行で使用されるパラメーターによって異なります。このドキュメントには、主要なSQLステートメントのみが記載されています。詳細については、 pt-oscドキュメントを参照してください。