DM 运行中报错

在我更新上游数据库表结构之后,DM突然不自动同步了,查看日志,好像是我修改某个字段自增的问题,该怎么解决呢,附日志信息:

{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "sourceStatus": {
                "source": "mysql-replica-01",
                "worker": "dm-10.5.63.101-8262",
                "result": null,
                "relayStatus": null
            },
            "subTaskStatus": [
                {
                    "name": "test",
                    "stage": "Paused",
                    "unit": "Sync",
                    "result": {
                        "isCanceled": false,
                        "errors": [
                            {
                                "ErrCode": 44006,
                                "ErrClass": "schema-tracker",
                                "ErrScope": "internal",
                                "ErrLevel": "high",
                                "Message": "startLocation: [position: (binlog.000074, 9806), gtid-set: ], endLocation: [position: (binlog.000074, 9974), gtid-set: ], origin SQL: [ALTER TABLE `dm_test` CHANGE `id` `id` INT\
 NOT NULL\
 AUTO_INCREMENT]: cannot track DDL: ALTER TABLE `TPCD2G`.`dm_test` CHANGE COLUMN `id` `id` INT NOT NULL AUTO_INCREMENT",
                                "RawCause": "[ddl:8200]Unsupported modify column: can't set auto_increment",
                                "Workaround": ""
                            }
                        ],
                        "detail": null
                    },
                    "unresolvedDDLLockID": "",
                    "sync": {
                        "totalEvents": "0",
                        "totalTps": "0",
                        "recentTps": "0",
                        "masterBinlog": "(binlog.000074, 14192)",
                        "masterBinlogGtid": "",
                        "syncerBinlog": "(binlog.000074, 9729)",
                        "syncerBinlogGtid": "",
                        "blockingDDLs": [
                        ],
                        "unresolvedGroups": [
                        ],
                        "synced": false,
                        "binlogType": "remote",
                        "secondsBehindMaster": "0"
                    }
                }
            ]
        }
    ]
}
1 个赞
ALTER TABLE `TPCD2G`.`dm_test` CHANGE COLUMN `id` `id` INT NOT NULL AUTO_INCREMENT;

上游和下游表结构是如何定义的,可否发下?

从目前看到的信息,下游tidb不支持这个修改;

处理参考:

https://docs.pingcap.com/zh/tidb-data-migration/stable/handle-failed-ddl-statements

1 个赞
  • 不支持设置 PRIMARY KEYUNIQUE KEY ,不支持设置 AUTO_INCREMENT 属性。可能输出的错误信息: unsupported add column '%s' constraint PRIMARY/UNIQUE/AUTO_INCREMENT KEY
1 个赞

在执行 handle-error test skip 这条语句之后成功了,但是又出现了另一个错误,可能是我之后对上游mysql操作导致的:

{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "sourceStatus": {
                "source": "mysql-replica-01",
                "worker": "dm-10.5.63.101-8262",
                "result": null,
                "relayStatus": null
            },
            "subTaskStatus": [
                {
                    "name": "test",
                    "stage": "Paused",
                    "unit": "Sync",
                    "result": {
                        "isCanceled": false,
                        "errors": [
                            {
                                "ErrCode": 10006,
                                "ErrClass": "database",
                                "ErrScope": "not-set",
                                "ErrLevel": "high",
                                "Message": "startLocation: [position: (, 0), gtid-set: ], endLocation: [position: (binlog.000074, 10249), gtid-set: ]: execute statement failed: REPLACE INTO `TPCD2G`.`dm_test` (`id`,`value`,`mysql_time`) VALUES (?,?,?)",
                                "RawCause": "Error 1146: Table 'tpcd2g.dm_test' doesn't exist",
                                "Workaround": ""
                            }
                        ],
                        "detail": null
                    },
                    "unresolvedDDLLockID": "",
                    "sync": {
                        "totalEvents": "0",
                        "totalTps": "0",
                        "recentTps": "0",
                        "masterBinlog": "(binlog.000074, 15655)",
                        "masterBinlogGtid": "",
                        "syncerBinlog": "(binlog.000074, 9729)",
                        "syncerBinlogGtid": "",
                        "blockingDDLs": [
                        ],
                        "unresolvedGroups": [
                        ],
                        "synced": false,
                        "binlogType": "remote",
                        "secondsBehindMaster": "0"
                    }
                }
            ]
        }
    ]
}
继续执行skip也不成功了,这是skip结果:
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": false,
            "msg": "only support to handle ddl error currently, see https://docs.pingcap.com/tidb-data-migration/stable/error-handling for other errors",
            "source": "mysql-replica-01",
            "worker": ""
        }
    ]
}
1 个赞

下游实例中 tpcd2g.dm_test是否存在呢?

1 个赞

本来不存在,我试着新建了一个,也还是不行,报同样的错误,有没有什么办法能让它重新同步一下呢

1 个赞

重新全量同步吗?
如果是一个task只同步一个表的情况下,重现全量同步,
首先停掉dm task任务;
然后在下游tidb中 :
dm_meta.{task_name}_loader_checkpoint
dm_meta.{task_name}_syncer_checkpoint
把这两个表中的记录删除掉,然后启动task任务,就会触发全量重新全量同步。

1 个赞

您好,
dm_meta.{task_name}_loader_checkpoint
dm_meta.{task_name}_syncer_checkpoint
这两个语句是在下游的哪里执行呢

1 个赞

不是语句,是两个表,删除两个表的记录即可

1 个赞

这个记录的位置是?

1 个赞

dm_meta是数据库名字
{task_name}_loader_checkpoint
{task_name}_syncer_checkpoint
是两个表名字

1 个赞

哈哈,这个意思,可以了,谢谢您

1 个赞

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。