利用DM进行MySQL迁移TiDB问题

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

  • 【TiDB 版本】:v4.0.5
  • 【问题描述】:尝试使用DM迁移MySQL 5.7到TiDB 4.0.5,参考官网的操作,出现如下报错:
    1.Unknown character set: ‘gbk’
    2.packet for query is too large. Try adjusting the ‘max_allowed_packet’ variable on the server

想了解下:
1.看了下官网,TiDB目前不支持gbk,这个后续有计划吗?
2.max_allowed_packet 这个参数目标端和源端都调整为1G,但是还是报错,这个query的packet不至于这么大的吧,是不是还要需要优化调整的参数?

1 个赞

您好 关于 GBK 支持 目前还没有计划,这部分也主要取决于 TiDB 的支持.
packet for query is too large. Try adjusting the ‘max_allowed_packet’ variable on the server 这个报错是在 DM load 阶段报的吗? 可以考虑修改 dumper 数据导出的 批大小.
DM 2.0.0 rc.2 可以参考
https://github.com/pingcap/dm/blob/v2.0.0-rc.2/tests/http_apis/conf/dm-task.yaml#L31
DM 1.0.6 可以参考
https://github.com/pingcap/dm/blob/v1.0.6/tests/http_apis/conf/dm-task.yaml#L33

你好,感谢回复,是的,在开启任务后报错,这边修改了task.yaml如下参数:
mydumpers:
4304-replica-01:
threads: 32
chunk-filesize: 0
skip-tz-utc: true
statement-size: 1000000
extra-args: “”

重启task,还是报一样的错误,发现日志中显示的是:
“max-allowed-packet”:67108864,“statement-size”:0
就是这两个参数的修改都没效果,

用如下重启dm:
tiup dm stop dm-1
tiup dm start dm-1
然后重启任务,报另外错误:
parse mydumper metadata error: open dumped_data.dm-1/metadata: no such file or directory

是我配置不合理,还是重启dm后,metadata会丢失吗?这个感觉是不是有点不合理呢。

麻烦提供一下task.yaml的具体配置内容,以及 query-status {taskname} 的查询结果,谢谢!

数据源配置文件的参数需要加上max-allowed-packet,然后设置成比67108864更大

metadata的问题,需要看一下query-status。另外帮忙看下下游的 {dm_meta} 库中的 {task-name}_syncer_checkpoint 的内容

你好,task.yaml内容如下:
name: “dm-bi-4304”
task-mode: “all”
ignore-checking-items: [“auto_increment_ID”, “table_schema”]
target-database:
host: “172.19.51.31”
port: 4000
user: “tidb_dm_user”
password: “r6XXcPY+S3ixHmWJl79Qg0C3Kd4GJ/3poSYyBOA=”

mysql-instances:

source-id: “4304-replica-01”

4304-replica-01:
do-dbs: [“bidata_monitor”, “ga_user_profile”, “gt_user_profile_v5”, “lbs”]

mydumpers:
4304-replica-01:
threads: 32
chunk-filesize: 0
skip-tz-utc: true
statement-size: 1000000
extra-args: “”


query-status内容如下:
{
“result”: true,
“msg”: “”,
“sources”: [
{
“result”: true,
“msg”: “”,
“sourceStatus”: {
“source”: “4304-replica-01”,
“worker”: “dm-172.19.51.24-8262”,
“result”: null,
“relayStatus”: null
},
“subTaskStatus”: [
{
“name”: “dm-bi-4304”,
“stage”: “Paused”,
“unit”: “Load”,
“result”: {
“isCanceled”: false,
“errors”: [
{
“ErrCode”: 11001,
“ErrClass”: “functional”,
“ErrScope”: “internal”,
“ErrLevel”: “high”,
“Message”: “parse mydumper metadata error: open dumped_data.dm-bi-4304/metadata: no such file or directory”,
“RawCause”: “”,
“Workaround”: “”
}
],
“detail”: null
},
“unresolvedDDLLockID”: “”,
“load”: {
“finishedBytes”: “0”,
“totalBytes”: “0”,
“progress”: “NaN %”,
“metaBinlog”: “”
}
}
]
}
]
}

你好,max_allowed_packet 这个参数已经在源端和目标端通过如下命令修改:
set global max_allowed_packet=110241024*1024;
这样可以生效的吧,还是说dm读取的是 mysql.cnf配置文件?
query-status上一条已发

{task-name}_syncer_checkpoint查无数据
select * from dm-bi-4304_syncer_checkpoint limit 10;
Empty set (0.00 sec)

  1. 请问是导入阶段报错吗?那么参考文档配置参数

    https://docs.pingcap.com/zh/tidb/stable/loader-overview#全量导入过程中遇到报错-packet-for-query-is-too-large-try-adjusting-the-max_allowed_packet-variable

还需要修改配置文件的。你的DM版本是多少,2.0的话是source.yaml里,frommax-allowed-packet

另外可以传一下dm-172.19.51.24-8262这个worker的日志、以及dm-bi-4304_loader_checkpoint的内容吗,感谢

你好,
谢谢, 这个方法可行,在task.yaml配置文件中加入参数:max-allowed-packet=134217728
改了之后没有报错,
但是在接下来task运行过程中,tidb-server占用大量CPU,及几乎全部内存,

而且数据导入进度也没有更新,query-status打印如下:
“subTaskStatus”: [
{
“name”: “dm-bi-4304-2”,
“stage”: “Running”,
“unit”: “Load”,
“result”: null,
“unresolvedDDLLockID”: “”,
“load”: {
“finishedBytes”: “41397722”,
“totalBytes”: “6363142205”,
“progress”: “0.65 %”,
“metaBinlog”: “(mysql4304-bin.000183, 3860275)”
}
}
]

dm-work节点持续打印日志:
[2020/09/08 13:46:44.820 +08:00] [INFO] [status.go:75] [“progress status of load”] [task=dm-bi-4304-2] [unit=load] [finished_bytes=41397722] [total_bytes=6363142205] [total_file_count=105] [progress=“0.65 %”]

麻烦看看,谢谢

相关日志我整理下给出

dm-worker.log (5.2 MB) dm-bi-4304-2_loader_checkpoint.csv (11.3 KB)
已上传,麻烦查看,谢谢

麻烦上传下 tidb.log 看下是否有报错,多谢。

tidb.zip (6.5 MB)
你好,已上传

  1. 查看 tidb 日志都是 ,根据上面反馈,cpu 和内存消耗很多
    [2020/09/08 17:37:17.734 +08:00] [ERROR] [client.go:188] [“tso request is canceled due to timeout”]
    [2020/09/08 17:37:18.420 +08:00] [WARN] [pd.go:109] [“get timestamp too slow”] [“cost time”=3.905790204s]
    [2020/09/08 17:37:22.329 +08:00] [ERROR] [client.go:273] ["[pd] getTS error"] [error=EOF]
    [2020/09/08 17:37:22.388 +08:00] [ERROR] [kv.go:272] [“fail to load safepoint from pd”] [error=“context deadline exceeded”]
    [2020/09/08 17:37:22.388 +08:00] [ERROR] [pd.go:130] [“updateTS error”] [error=EOF]
    [2020/09/08 17:37:22.397 +08:00] [WARN] [pd.go:109] [“get timestamp too slow”] [“cost time”=300.636504ms

  2. 把 loader 的进程数 pool-size 默认为 16 ,改为 8试试

谢谢,我再试一下

好的,有问题再反馈,多谢。

image
你好,
这边在task.yaml的loader中加入参数:
pool-size: 8
但是问题依旧,tidb-server进程占用太多内存和CPU,但是导数进度并没有更新

麻烦减小到1 试试,另外重启dm-worker