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

より多くの列を持つダウンストリームTiDBテーブルにデータを移行する

このドキュメントでは、対応するアップストリームテーブルよりも多くの列を持つダウンストリームTiDBテーブルにデータを移行するときに実行する追加の手順について説明します。通常の移行手順については、次の移行シナリオを参照してください。

DMを使用して、より多くの列を持つダウンストリームTiDBテーブルにデータを移行します

アップストリームのbinlogを複製する場合、DMはダウンストリームの現在のテーブルスキーマを使用してbinlogを解析し、対応するDMLステートメントを生成しようとします。アップストリームbinlogのテーブルの列番号がダウンストリームテーブルスキーマの列番号と一致しない場合、次のエラーが発生します。

"errors": [
    {
        "ErrCode": 36027,
        "ErrClass": "sync-unit",
        "ErrScope": "internal",
        "ErrLevel": "high",
        "Message": "startLocation: [position: (mysql-bin.000001, 2022), gtid-set:09bec856-ba95-11ea-850a-58f2b4af5188:1-9 ], endLocation: [ position: (mysql-bin.000001, 2022), gtid-set: 09bec856-ba95-11ea-850a-58f2b4af5188:1-9]: gen insert sqls failed, schema: log, table: messages: Column count doesn't match value count: 3 (columns) vs 2 (values)",
        "RawCause": "",
        "Workaround": ""
    }
]

次に、アップストリームテーブルスキーマの例を示します。

# Upstream table schema
CREATE TABLE `messages` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
)

以下は、ダウンストリームテーブルスキーマの例です。

# Downstream table schema
CREATE TABLE `messages` (
  `id` int(11) NOT NULL,
  `message` varchar(255) DEFAULT NULL, # This is the additional column that only exists in the downstream table.
  PRIMARY KEY (`id`)
)

DMがダウンストリームテーブルスキーマを使用してアップストリームによって生成されたbinlogイベントを解析しようとすると、DMは上記のColumn count doesn't matchのエラーを報告します。

このような場合、 binlog-schemaコマンドを使用して、データソースから移行するテーブルのテーブルスキーマを設定できます。指定されたテーブルスキーマは、DMによって複製されるbinlogイベントデータに対応している必要があります。シャードテーブルを移行する場合は、シャードテーブルごとに、binlogイベントデータを解析するためにDMでテーブルスキーマを設定する必要があります。手順は次のとおりです。

  1. DMでSQLファイルを作成し、アップストリームテーブルスキーマに対応するCREATE TABLEステートメントをファイルに追加します。たとえば、次のテーブルスキーマをlog.messages.sqlに保存します。

    # Upstream table schema
    CREATE TABLE `messages` (
    `id` int(11) NOT NULL,
    PRIMARY KEY (`id`)
    )
    
  2. binlog-schemaコマンドを使用して、データソースから移行するテーブルのテーブルスキーマを設定します。このとき、上記のColumn count doesn't matchのエラーにより、データ移行タスクは一時停止状態になっているはずです。

    tiup dmctl --master-addr ${advertise-addr} binlog-schema update -s ${source-id} ${task-name} ${database-name} ${table-name} ${schema-file}
    

    このコマンドのパラメーターの説明は次のとおりです。

    パラメータ説明
    -master-addrdmctlが接続されるクラスタのDMマスターノードの${advertise-addr}を指定します。 ${advertise-addr}は、DMマスターが外部にアドバタイズするアドレスを示します。
    binlog-schema setスキーマ情報を手動で設定します。
    -sソースを指定します。 ${source-id}はMySQLデータのソースIDを示します。
    ${task-name}データ移行タスクのtask.yamlの構成ファイルで定義されている移行タスクの名前を指定します。
    ${database-name}データベースを指定します。 ${database-name}は、アップストリームデータベースの名前を示します。
    ${table-name}アップストリームテーブルの名前を指定します。
    ${schema-file}設定するテーブルスキーマファイルを指定します。

    例えば:

    tiup dmctl --master-addr 172.16.10.71:8261 binlog-schema update -s mysql-01 task-test -d log -t message log.message.sql
    
  3. resume-taskコマンドを使用して、一時停止状態で移行タスクを再開します。

    tiup dmctl --master-addr ${advertise-addr} resume-task ${task-name}
    
  4. query-statusコマンドを使用して、データ移行タスクが正しく実行されていることを確認します。

    tiup dmctl --master-addr ${advertise-addr} query-status resume-task ${task-name}