dm迁移报错问题

【 TiDB 使用环境】生产环境Poc
【 TiDB 版本】4.0.13,6.1.7,MySQL版本5.7.21,dm版本2.0.3

需求:MySQL集群迁移至tidb集群,尝试了迁移至6.1.7后报错,后面又试了4.0.13,都是报错,都是在全量备份的时候报错,可能跟tidb集群版本没关系。

同步用户的权限如下

grant SELECT,RELOAD,LOCK TABLES,REPLICATION SLAVE,REPLICATION CLIENT on *.* 
grant SELECT,INSERT,CREATE,LOCK TABLES ON db_name.*

source配置如下

cat dm-source-oltp-137-db58_zzlogistics.yaml 

source-id: "source-xxxx-xxxx"  # 数据源的名
 
# DM-worker 是否使用全局事务标识符 (GTID) 拉取 binlog。使用前提是在上游 MySQL 已开启 GTID 模式。
enable-gtid: false
 
from:
  host: "xxxx"  # 上游数据源ip等相关信息
  user: "xxxx"
  password: "xxxx"
  port: xxxx

task配置文件如下

# 任务名,多个同时运行的任务不能重名。
name: "task-xxxx-xxxx"
#shard-mode: "pessimistic"  #分库分表合并需要设置为悲观模式
# 全量+增量 (all) 迁移模式。
task-mode: "all"
# 下游 TiDB 配置信息。
target-database:
  host: "xxxx"
  port: xxxx
  user: "xxxx"
  password: "xxxx"
 
# 当前数据迁移任务需要的全部上游 MySQL 实例配置。
mysql-instances:
-
  # 上游实例或者复制组 ID,参考。
  source-id: "source-xxxx-xxxx"
  # 需要迁移的库名或表名的黑白名单的配置项名称,用于引用全局的黑白名单配置,全局配置见下面的 `block-allow-list` 的配置。
  block-allow-list: "global"          # 如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list。
  # dump 处理单元的配置项名称,用于引用全局的 dump 处理单元配置。
  mydumper-config-name: "global"
  loader-config-name: "global"
  syncer-config-name: "global"
  filter-rules: ["filter-rule-1"]
  route-rules: ["route-rule-1"]     # 数据源表迁移到目标 TiDB 表的路由规则,可以定义多个规则
 
# 黑白名单全局配置,各实例通过配置项名引用。
block-allow-list:                     # 如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list。
  global:
    do-tables:
    - db-name: "xxxx"
      tbl-name: "*"

filters:                                        # 定义过滤数据源特定操作的规则,可以定义多个规则
  filter-rule-1:                                # 规则名称
    schema-pattern: "xxxx"                       # 匹配数据源的库名,支持通配符 "*" 和 "?"
    table-pattern: "*"                          # 匹配数据源的表名,支持通配符 "*" 和 "?"
    events: ["tuncate table","drop table"]    # 匹配上 schema-pattern 和 table-pattern 的库或者表的操作类型
    action: Ignore                              # 迁移(Do)还是忽略(Ignore)

routes:                           # 定义数据源表迁移到目标 TiDB 表的路由规则,可以定义多个规则
  route-rule-1:                   # 规则名称
    schema-pattern: "xxxx"      # 匹配数据源的库名,支持通配符 "*" 和 "?"
    target-schema: "xxxx"         # 目标 TiDB 库名

# dump 处理单元全局配置,各实例通过配置项名引用。
mydumpers:
  global:
      threads: 8                       # dump 处理单元从上游数据库实例导出数据的线程数量,默认值为 4
      chunk-filesize: 64               # dump 处理单元生成的数据文件大小,默认值为 64,单位为 MB
      extra-args: "-B xxxx"   # dump 处理单元的其他参数,从 DM 1.0.2 版本开始,DM 会自动生成 table-list 配置,在其之前的版本仍然需要人工配置。

loaders:
  global:
      pool-size: 2

syncers:
  global:
    worker-count: 32
    batch: 100

问题描述,使用dm 2.0.3版本工具进行数据迁移,全量备份阶段,任务状态提示如下报错

{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "sourceStatus": {
                "source": "source-xxxx-xxxx",
                "worker": "dm-xx.xx.xx.xx-xxxx",
                "result": null,
                "relayStatus": null
            },
            "subTaskStatus": [
                {
                    "name": "task-xxxx-xxxx",
                    "stage": "Paused",
                    "unit": "Dump",
                    "result": {
                        "isCanceled": false,
                        "errors": [
                            {
                                "ErrCode": 32001,
                                "ErrClass": "dump-unit",
                                "ErrScope": "internal",
                                "ErrLevel": "high",
                                "Message": "mydumper/dumpling runs with error, with output (may empty): ",
                                "RawCause": "sql: SELECT COLUMN_NAME,EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=? AND TABLE_NAME=? ORDER BY ORDINAL_POSITION;: driver: bad connection",
                                "Workaround": ""
                            }
                        ],
                        "detail": null
                    },
                    "unresolvedDDLLockID": "",
                    "dump": {

                    }
                }
            ]
        }
    ]
}

根据官方文档的指导重启任务没法解决问题,重启任务后又会重新做全量备份,循环报错。dm-worker.log日志报错如下,可以看到执行了近四个小时然后报错的。

[2024/04/11 18:12:09.125 +08:00] [ERROR] [dumpling.go:138] ["dump data exits with error"] [task=task-xxxx-xxxx] [unit=dump] ["cost time"=3h55m25.147905887s] [error="ErrCode:32001 ErrClass:\"dump-unit\" ErrScope:\"internal\" ErrLevel:\"high\" Message:\"mydumper/dumpling runs with error, with output (may empty): \" RawCause:\"sql: SELECT COLUMN_NAME,EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=? AND TABLE_NAME=? ORDER BY ORDINAL_POSITION;: driver: bad connection\" "]
[2024/04/11 18:12:09.125 +08:00] [INFO] [subtask.go:289] ["unit process returned"] [subtask=task-xxxx-xxxx] [unit=Dump] [stage=Paused] [status={}]
[2024/04/11 18:12:09.125 +08:00] [ERROR] [subtask.go:308] ["unit process error"] [subtask=task-xxxx-xxxx] [unit=Dump] ["error information"="{\"ErrCode\":32001,\"ErrClass\":\"dump-unit\",\"ErrScope\":\"internal\",\"ErrLevel\":\"high\",\"Message\":\"mydumper/dumpling runs with error, with output (may empty): \",\"RawCause\":\"sql: SELECT COLUMN_NAME,EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=? AND TABLE_NAME=? ORDER BY ORDINAL_POSITION;: driver: bad connection\"}"]

已经排查确认过,MySQL端没有流量访问,不存在有任务去kill连接,且没有类似pt-kill这种工具的任务执行。

后面网友建议升级dm集群版本,升级到6.1.7版本后报错依旧存在,报错虽然不一样,但是也类似

                        "errors": [
                            {
                                "ErrCode": 32001,
                                "ErrClass": "dump-unit",
                                "ErrScope": "internal",
                                "ErrLevel": "high",
                                "Message": "mydumper/dumpling runs with error, with output (may empty): ",
                                "RawCause": "sql: SHOW COLUMNS FROM `db58_zzlogistics`.`logistics_base_0`: driver: bad connection",
                                "Workaround": ""
                            }
                        ],

还试了在全量备份期间手动做了一个select sleep(100000000),dm执行一个多小时后报错(备份文件也是1.3T左右,用2.0.3的时候并发数是2,用6.1.7的时候给了8,所以执行时间减少了差不多3/4),这也侧面反应,dm连接异常应该不是MySQL端kill的,而且过了很久之前测试的sleep这个查询都还在。

[2024/04/12 16:24:01.300 +08:00] [ERROR] [dumpling.go:152] ["dump data exits with error"] [task=task-xxxx-xxxx] [unit=dump] ["cost time"=1h5m36.89669174s] [error="ErrCode:32001 ErrClass:\"dump-unit\" ErrScope:\"internal\" ErrLevel:\"high\" Message:\"mydumper/dumpling runs with error, with output (may empty): \" RawCause:\"sql: SHOW COLUMNS FROM `d
xxxx`.`logistics_base_0`: driver: bad connection\" "]
[2024/04/12 16:24:01.300 +08:00] [INFO] [subtask.go:356] ["unit process returned"] [subtask=task-xxxx-xxxx] [unit=Dump] [stage=Paused] [status="{\"totalTables\":41,\"completedTables\":1,\"finishedBytes\":1314877011547,\"finishedRows\":413061038,\"estimateTotalRows\":350604900}"]
[2024/04/12 16:24:01.886 +08:00] [ERROR] [subtask.go:377] ["unit process error"] [subtask=task-xxxx-xxxx] [unit=Dump] ["error information"="ErrCode:32001 ErrClass:\"dump-unit\" ErrScope:\"internal\" ErrLevel:\"high\" Message:\"mydumper/dumpling runs with error, with output (may empty): \" RawCause:\"sql: SHOW COLUMNS FROM `db58_zzlogistics`.`logis
tics_base_0`: driver: bad connection\" "]

两次报错提示的SQL,用同步用户登录到MySQL是可以正常执行得到相应的结果,整个流程试过单个小表是没问题的,整库的话就有问题。

dm 版本可以升级到最新版试一下 比如用 7.5.1 的dm 版本

检查下上下游,看看有没有max_execution_time的配置,show variables like ‘%max_execution_time%’

你报错是dumping数据出错了
第一步都没走通

手动去上游 MySQL 执行下看看

配有,这个参数在MySQL我们没有配置,而且用2.0.3版本的时候用了2线程并发,执行了3h55min报错,用6.1.7版本的时候用了8线程并发,执行1h5min报错,侧面也反应了这个应该不是MySQLkill的连接

试试用tiup dumping 手动dumping数据看能不能出数据 我之前遇到过mysql 各种无法导出数据 不走索引的问题

show create table db58_zzlogistics. logistics_base_0`` 看看

lightning: tidb restart cause lightning to cost more time to import · Issue #33714 · pingcap/tidb (github.com)

看下这个呢,首先看看tidb的日志,监控,有没有重启的情况

已经提示是连接错误了,检查配置文件 的IP,端口,权限等等