dm同步syncer_checkpoint数据异常

dm版本v1.0.1 下游tidb oom导致很多同步任务中断,后来自动恢复,不过其中一个增量同步的任务变成了从conf配置文件中配置的meta信息点开始同步,查询dm_meta库发现对应的syncer_checkpoint表存在,但是行数为0,通过dm-worker日志可看出同步任务之前工作正常,但是突然offset出现问题

具体的dm-worker log可参考附件

error20200331.log (352.1 KB)

这个问题在 DM v1.0.1 版本自动恢复,可以尝试一下通过 stop/start task任务,看看是否可以恢复。详细可以看一下文档的介绍,另外建议 DM 升级到 v1.0.4 最新版本 ,对于异常处理方便机制做了修复。

可能没表达清楚,我要问的不是自动恢复的问题,而是同步的meta信息丢了,正常同步的position是记录在dm_meta库xxxx_syncer_checkpoint表的,这个表的count为0了,导致任务不知道该从哪同步了,现在问题也解决了,我从日志中找到了最后同步正常的position,然后修改task的conf中meta信息,再重启任务就成功了 我的问题是:为什么meta信息会无故丢失

dm用了很久了,之前也自动恢复过几次,今天是第一次出现这种情况

你可以尝试通过 ddl history 的 TiDB API 查一下 meta 表是什么时间被 DDL 操作过,来确认是什么出现的问题,可以排查一下。

Get all TiDB DDL job history information.

curl http://{TiDBIP}:10080/ddl/history

ddl history返回的内容太多了,有什么筛选参数可传吗 此外就是表结构是没动过的,因为出问题的时候我看过表结构,与其他syncer_checkpoint表的结构是一致的,再有就是出现问题的时间我理解通过我上面截图的log部分是可以判断出的,12:33分checkpoint还是正常的,一秒内就突然出现了异常

从 ddl 里面过滤一下这张表 trade-all_syncer_checkpoint 看下是否有信息?

只有一条create的

嗯,checkpoint 信息删掉的原因是:remove-meta":true 导致位点信息被删除

问题分析:

1.根据日志中可以查看到 all previous meta cleared 证明原数据信息被删除。

2.查看日志中启动 task 的参数,发现remove-meta":true,该参数设置为 true 时,每次重启 task 任务,都会清理掉下游的 checkpoint 点,该参数默认值为 false,不建议修改。

配置文件配置的是remove-meta: false 确认出问题的时候是false,所以问题变成了为啥读配置变成了true?

程序自动重连的时候是否会有个类似缓存的地方而不是直接从conf文件读取,这个文件我最早启动的时候是remove-meta: true,但是后来直接改了配置文件,没有在dmctl里做update

那麻烦提供下 ls -lrt task 配置文件最后修改时间,以及当前的 task 配置,多谢。

因为我昨天修改了配置文件里的meta部分,所以修改时间是昨天的,但是remove-meta是没做变动的 脱敏后的配置文件见附件 trade-all.yaml (3.3 KB)

您好,根据您这边提供的时间,可以看到 task 文件修改时间为 12:59,日志中 dm-worker 的启动时间是 12:33,dm-worker 日志中显示读取的 task 配置中 remove-meta 设置为 true,而 task 配置文件在 dm-worker 启动后进行过更改,无法证明 dm-worker 启动前 task 中的 remove-meta 的值。所以看下您那边是否能够复现?dm-worker 启动后读取的是 task 中的当前配置,不会有缓存的。

暂无法复现

目前根据日志看到的信息大概就是上面这样的,为了保险期间,建议检查下所有的 task 配置,确保 remove-meta 设置为默认值 false

恩,之前踩过这个坑,所以会特别注意这点,每次如果有需要改成true后也是马上就改回false

您好: 1. 从日志看,应该是task文件可能忘记修改了,使用的是true。 如果能够复现问题,下次麻烦执行stat task文件,只要修改时间比 dm welcome时间早, task文件是false,dm日志是true,就能说明dm应该有问题了. 不过正常情况下,感觉还是配置文件可能使用的比较多,有些忘记修改了吧。

非常抱歉!这个问题后续跟研发同学确认了下,task 之前的配置中 remove-meta 设置为 true,会将信息持久化保存在 dm-worker 部署目录下的 dm_worker_meta 中(1.0.x 版本)。因后面直接修改配置文件后,未进行 stop-task start-task 操作,导致重启 dm-worker 后,读取的仍为旧的缓存的配置(remove-meta:true)。另外纠正一下,task 配置重启读取指定的配置文件,dm-worker 重启后触发的启动 task 任务读取的是缓存的配置。

后续如果对 task 任务配置进行变更,变更后记得重启同步任务或者 update 更新