DM迁移阿里云RDS-mysql至TIDB发生问题

各位好,我想使用dm将云上的RDS-MYSQL迁移到自建的TIDB集群上发生错误 { “result”: true, “msg”: “”, “workers”: [ { “result”: true, “worker”: “IP地址”, “msg”: “”, “subTaskStatus”: [ { “name”: “test”, “stage”: “Paused”, “unit”: “Dump”, “result”: { “isCanceled”: false, “errors”: [ { “Type”: “UnknownError”, “msg”: "[code=32001:class=dump-unit:scope=internal:level=high] mydumper runs with error: exit status 1.

", “error”: null } ], “detail”: null }, “unresolvedDDLLockID”: “”, “dump”: {

                }
            }
        ],
        "relayStatus": {
            "masterBinlog": "(mysql-bin.003890, 123176638)",
            "masterBinlogGtid": "c9217eaf-d666-11e8-8ae0-6c92bf3bb29d:1-351841791,b6d60458-d666-11e8-8c7d-7cd30adb883a:1-770091200",
            "relaySubDir": "b6d60458-d666-11e8-8c7d-7cd30adb883a.000001",
            "relayBinlog": "(mysql-bin.003890, 123176638)",
            "relayBinlogGtid": "",
            "relayCatchUpMaster": true,
            "stage": "Running",
            "result": null
        },
        "sourceID": "mysql-replica-01"
    }
]

}

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0
  • 【问题描述】:DM迁移云上数据库到TIDB 若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

请问RDS-MYSQL是否可以采用DM的方式进行迁移,如果能是如何从云上进行mysqldump的。如果不能,那么我该采用什么方案进行数据迁移

可以采用 DM 方式来进行数据迁移,具体可以看下官方文档对 DM 的原理介绍。看给出的信息是 mydumper 阶段的报错,根据报错信息参考文档介绍:https://pingcap.com/docs-cn/stable/reference/tools/data-migration/features/manually-handling-sharding-ddl-locks/

我检查了sharding DDL lock状态,并没有ddl锁,而且我的上游数据库没有分表,不会产生多表合并的场景。我没有从您推荐的文档中找到解决的方法。请问 这个mysqldump的报错 还有什么处理的方案? DM如果从阿里的RDS上获取进行mysqldump的操作的?

看下 task 配置,和 inventory.ini 配置。 另外把 query-error 完整报错也发一下。

inventory.ini

query-error { “result”: true, “msg”: “”, “workers”: [ { “result”: true, “worker”: “xxx.xxx.xxx.xxx”, “msg”: “”, “subTaskError”: [ { “name”: “test”, “stage”: “Paused”, “unit”: “Dump”, “dump”: { “msg”: “” } } ], “RelayError”: { “msg”: “” } } ] }

先执行 check-task

然后 resume-task

再 query-error 看下详细报错

resume-task的结果: resume-task test { “op”: “Resume”, “result”: true, “msg”: “”, “workers”: [ { “meta”: { “result”: false, “worker”: “xxxx:8262”, “msg”: “[code=38032:class=dm-master:scope=internal:level=high] operation 843 of task test on worker 172.17.7.254:8262 not success: [code=40051:class=dm-worker:scope=internal:level=high] current stage is not paused not valid\ngithub.com/pingcap/dm/pkg/terror.(*Error).Generate\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/terror/terror.go:232\ngithub.com/pingcap/dm/dm/master.(*Server).waitOperationOk\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/dm/master/server.go:1939\ngithub.com/pingcap/dm/dm/master.(*Server).handleOperationResult\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/dm/master/server.go:1974\ngithub.com/pingcap/dm/dm/master.(*Server).OperateTask.func2\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/dm/master/server.go:396\ngithub.com/pingcap/dm/dm/master.(*AgentPool).Emit\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/dm/master/agent_pool.go:117\nruntime.goexit\n\t/usr/local/go/src/runtime/asm_amd64.s:1357” }, “op”: “Resume”, “logID”: “843” } ] }

query-error的结果: { “result”: true, “msg”: “”, “workers”: [ { “result”: true, “worker”: “xxxx:8262”, “msg”: “”, “subTaskError”: [ { “name”: “test”, “stage”: “Paused”, “unit”: “Dump”, “dump”: { “msg”: “” } } ], “RelayError”: { “msg”: “” } } ] }

check-task 能通过吗

也可以看下日志,和文档中的错误代码一起排查。

» check-task ./task.yaml { “result”: true, “msg”: “check pass!!!” } 应该是没问题的

我想请教一下,DM从RDS dump的原理,mysqldump 这一步是不是会造成锁表

应该是需要的,是不是上游账号没有 reload 权限

可以在 mydumper 上加个参数: --no-locks

我尝试单独使用mysqldump进行数据导出。提示报错 ** (mydumper:829): CRITICAL **: 15:39:15.477: Couldn’t acquire global lock, snapshots will not be consistent: Access denied; you need (at least one of) the RELOAD privilege(s) for this operation。 确实提示缺少reload权限

如果可以的话,可以加个权限。

如果不行就加 --no-locks