下游存在更多列的迁移场景
DM 同步上游的 binlog 时,会尝试使用下游当前的表结构来解析 binlog 并生成相应的 DML 语句。如果上游的 binlog 里数据表的列数与下游表结构的列数不一致,则会产生如下错误:
例如上游表结构为:
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
)
例如下游表结构为:
此时,你可以使用 binlog-schema
命令来为数据源中需要迁移的表指定表结构,表结构需要对应 DM 将要开始同步的 binlog event 的数据。如果你在进行分表合并的数据迁移,那么需要为每个分表按照如下步骤在 DM 中设置用于解析 binlog event 的表结构。具体操作为:
在 DM 中,新建一个
.sql
文件,并将上游表结构对应的CREATE TABLE
语句添加到该文件。例如,将以下表结构保存到log.messages.sql
中。如果是 6.0 及以上版本,可以直接通过--from-source/--from-target
更新,无需创建 SQL 文件。可参考。CREATE TABLE `messages` (
PRIMARY KEY (`id`)
)
使用
binlog-schema
命令为数据源中需要迁移的表设置表结构(此时数据迁移任务应该由于上述Column count doesn't match
错误而处于 Paused 状态)。例如:
tiup dmctl --master-addr 172.16.10.71:8261 binlog-schema update -s mysql-01 task-test -d log -t message log.message.sql
使用
resume-task
命令恢复处于 Paused 状态的同步任务。使用
query-status
命令确认数据迁移任务是否运行正常。