重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

移行するテーブルのテーブルスキーマを管理する

このドキュメントでは、 dmctlを使用して移行中にDMでテーブルのスキーマを管理する方法について説明します。

実装の原則

DMを使用してテーブルを移行する場合、DMはテーブルスキーマに対して次の操作を実行します。

  • 完全なエクスポートとインポートの場合、DMは現在の時刻のアップストリームテーブルスキーマをSQLファイルに直接エクスポートし、テーブルスキーマをダウンストリームに適用します。

  • インクリメンタルレプリケーションの場合、データリンク全体に次のテーブルスキーマが含まれます。これらは同じ場合も異なる場合もあります。

    schema

    • 現時点でのアップストリームテーブルスキーマschema-Uとして識別されます。
    • DMによって現在消費されているbinlogイベントのテーブルスキーマschema-Bとして識別されます。このスキーマは、履歴時のアップストリームテーブルスキーマに対応します。
    • DM(スキーマトラッカーコンポーネント)で現在維持されているテーブルスキーマschema-Iとして識別されます。
    • schema-Dとして識別されるダウンストリームTiDBクラスタのテーブルスキーマ。

    ほとんどの場合、上記の4つのテーブルスキーマは同じです。

アップストリームデータベースがDDL操作を実行してテーブルスキーマを変更すると、 schema-Uが変更されます。 DDL操作を内部スキーマトラッカーコンポーネントとダウンストリームTiDBクラスタに適用することにより、DMはschema-Ischema-Dを順番に更新して、 schema-Uとの一貫性を保ちます。したがって、DMは通常、 schema-Bテーブルスキーマに対応するbinlogイベントを消費できます。つまり、DDL操作が正常に移行された後でも、 schema-B 、およびschema-Uschema-I性がありschema-D

ただし、 オプティミスティックモードシャーディングDDLサポートを有効にして移行中に、ダウンストリームテーブルのschema-Dが、一部のアップストリームシャードテーブルのschema-Bおよびschema-Iと一致しない場合があります。このような場合でも、DMはschema-Ischema-Bの一貫性を維持して、DMLに対応するbinlogイベントを正常に解析できるようにします。

さらに、一部のシナリオ(ダウンストリームテーブルにアップストリームテーブルよりも多くの列がある場合など)では、 schema-Dschema-Bおよびschema-Iと矛盾する場合があります。

上記のシナリオをサポートし、スキーマの不整合によって引き起こされる他の移行の中断を処理するために、DMは、DMに保持されているschema-Iのテーブルスキーマを取得、変更、および削除するbinlog-schemaコマンドを提供します。

ノート:

binlog-schemaコマンドは、DMv6.0以降のバージョンでのみサポートされます。以前のバージョンでは、 operate-schemaコマンドを使用する必要があります。

指示

help binlog-schema
manage or show table schema in schema tracker

Usage:
  dmctl binlog-schema [command]

Available Commands:
  delete      delete table schema structure
  list        show table schema structure
  update      update tables schema structure

Flags:
  -h, --help   help for binlog-schema

Global Flags:
  -s, --source strings   MySQL Source ID.

Use "dmctl binlog-schema [command] --help" for more information about a command.

ノート:

  • テーブルスキーマはデータ移行中に変更される可能性があるため、予測可能なテーブルスキーマを取得するために、現在binlog-schemaコマンドは、データ移行タスクがPaused状態の場合にのみ使用できます。
  • 誤った取り扱いによるデータの損失を避けるために、スキーマを変更する前に、まずテーブルスキーマを取得してバックアップすることを強くお勧めします。

パラメーター

  • delete :テーブルスキーマを削除します。
  • list :テーブルスキーマを一覧表示します。
  • update :テーブルスキーマを更新します。
  • -sまたは--source
    • 必須。
    • 操作が適用されるMySQLソースを指定します。

使用例

テーブルスキーマを取得する

テーブルスキーマを取得するには、次のbinlog-schema listのコマンドを実行します。

help binlog-schema list
show table schema structure

Usage:
  dmctl binlog-schema list <task-name> <database> <table> [flags]

Flags:
  -h, --help   help for list

Global Flags:
  -s, --source strings   MySQL Source ID.

db_singleタスクのmysql-replica-01ソースに対応する`db_single`.`t1`テーブルのテーブルスキーマを取得する場合は、次のコマンドを実行します。

binlog-schema list -s mysql-replica-01 task_single db_single t1
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` int(11) DEFAULT NULL, PRIMARY KEY (`c1`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin",
            "source": "mysql-replica-01",
            "worker": "127.0.0.1:8262"
        }
    ]
}

テーブルスキーマを更新します

テーブルスキーマを更新するには、 binlog-schema updateコマンドを実行します。

help binlog-schema update
update tables schema structure

Usage:
  dmctl binlog-schema update <task-name> <database> <table> [schema-file] [flags]

Flags:
      --flush         flush the table info and checkpoint immediately (default true)
      --from-source   use the schema from upstream database as the schema of the specified tables
      --from-target   use the schema from downstream database as the schema of the specified tables
  -h, --help          help for update
      --sync          sync the table info to master to resolve shard ddl lock, only for optimistic mode now (default true)

Global Flags:
  -s, --source strings   MySQL Source ID.

次のように、 db_singleのタスクでmysql-replica-01のMySQLソースに対応する`db_single`.`t1`のテーブルのテーブルスキーマを設定する場合:

CREATE TABLE `t1` (
    `c1` int(11) NOT NULL,
    `c2` bigint(11) DEFAULT NULL,
    PRIMARY KEY (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin

上記のCREATE TABLEのステートメントをファイル(たとえば、 db_single.t1-schema.sql )として保存し、次のコマンドを実行します。

operate-schema set -s mysql-replica-01 task_single -d db_single -t t1 db_single.t1-schema.sql
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "source": "mysql-replica-01",
            "worker": "127.0.0.1:8262"
        }
    ]
}

テーブルスキーマを削除します

テーブルスキーマを削除するには、 binlog-schema deleteコマンドを実行します。

help binlog-schema delete
delete table schema structure

Usage:
  dmctl binlog-schema delete <task-name> <database> <table> [flags]

Flags:
  -h, --help   help for delete

Global Flags:
  -s, --source strings   MySQL Source ID.

ノート:

DMに保持されているテーブルスキーマが削除された後、このテーブルに関連するDDL / DMLステートメントをダウンストリームに移行する必要がある場合、DMは次の3つのソースからテーブルスキーマを順番に取得しようとします。

  • チェックポイントテーブルのtable_infoフィールド
  • 楽観的なシャーディングDDLのメタ情報
  • ダウンストリームTiDBの対応するテーブル

db_singleタスクのmysql-replica-01ソースに対応する`db_single`.`t1`テーブルのテーブルスキーマを削除する場合は、次のコマンドを実行します。

binlog-schema delete -s mysql-replica-01 task_single db_single t1
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "source": "mysql-replica-01",
            "worker": "127.0.0.1:8262"
        }
    ]
}