DM从mysql同步数据到TiDB出现报错:Error 3140: Invalid JSON text: The document root must not be followed by other values

【 TiDB 使用环境`】生产
【 TiDB 版本】
TiDB v5.0.3
DM v2.0.4

【遇到的问题】
DM在从mysql进行数据同步的时候出现如下的报错:
“Message”: “startLocation: [position: (, 0), gtid-set: ], endLocation: [position: (mysqlbin.025277, 35127156), gtid-set: 27a0991c-b504-11ea-9bc4-005056b73203:1-5220,c492d887-b503-11ea-8362-005056b7b179:1-1663122490]: execute statement failed: REPLACE INTO XXXX.md_ad_creative_XXX (advertiser_id,ad_id,action_bar,actionbar_click_url,captions,click_url,cover_image_tokens,cover_image_urls,cover_slogans,create_time,creative_category,creative_tag,creatives,horizontal_photo_ids,new_expose_tag,package_name,photo_list,put_status,site_id,sticker_styles,update_time,vertical_photo_ids,view_status,view_status_reason,c_status,campaign_id,creative_name,create_channel,expose_tag,photo_id,review_detail,cover_url,image_token,first_frame_type,overlay_bg_url,overlay_bg_image_token,cover_height,cover_width,click_track_url,creative_material_type,sticker_title,overlay_type,ad_photo_played_t3s_url,impression_url,short_slogan,reject_video_snapshot,material_url,programmed_creative_material,image_tokens,display_info,package_id,game_id,duty_user_id,publish_agent_id,siteid,creative_id,unit_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,…”,
“RawCause”: “Error 3140: Invalid JSON text: The document root must not be followed by other values.”,

从报错看,是无效的JSON数据,这个要具体从那方便排查呢?

【复现路径】做过哪些操作出现的问题
【问题现象及影响】
【附件】

  • 相关日志、配置文件、Grafana 监控(https://metricstool.pingcap.com/)
  • TiUP Cluster Display 信息
  • TiUP CLuster Edit config 信息
  • TiDB-Overview 监控
  • 对应模块的 Grafana 监控(如有 BR、TiDB-binlog、TiCDC 等)
  • 对应模块日志(包含问题前后 1 小时日志)

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

2 个赞

找下二进制中这个位置附近的语句,endLocation: [position: (mysqlbin.025277, 35127156),看下是什么,不敏感的话发下,然后看看能不能在下游tidb中执行

1 个赞

涉及敏感数据,不方便公开发送,这个表本身是张大宽表,insert语句比较大,但是之前同步倒是正常的,今天突然就出现了同步异常;

DM同步mysql,可以跳过继续执行吗?

大概有两种方法:

  1. handle-error skip/replace/revert the current error event or a specific binlog position (binlog-pos) event.(但是官网中介绍的是处理DDL的,所以我遇到这种错误都是采用的方式二)

2.停止同步任务,调整dm_meta该任务的pos点,跳过出错的语句,然后启动任务即可

最好还是看看对应pos点的sql语句是什么,为什么不能执行比较好

因为我把binlog解析出来,找到对应的sql语句,在tidb执行是没有问题的:joy:

所以我想着看能不能把已经执行的SQL语句的pos给跳过了,看后面还会不会有问题;

你说的第二种方法:直接修改dm_meta该任务的pos点,是指的直接修改XXX_syncer_checkpoint表吗?

对的,是指这张表

那很奇怪啊,还是看下dm-task的日志,看看具体的报错是什么

我也不清楚是啥原因导致的,和执行DDL操作有关吗?但是我看在MySQL执行完Alter语句之后,TiDB也是同步过去的

dm-task的日志报错日志和最开始的是一样的

还有就是在咨询下,跳过pos这个要怎么改表的pos,这个之前没这么操作过,担心会有问题

比如说这个报错,怎么跳过去

正常来说只需要更改对应表名的binlog相关选项就行,比如binlog-name,binlog-pos,如果开启了gtid则更改gtid相关,如果不管用的话也可以采用极端一点的方法,停止任务,然后将这种任务表删除,task配置文件设置成下一个pos点,然后启动任务

好的,我试试吧,多谢

这个指的是根据 mysqlbinlog 解析出 DML,去 TiDB 执行吗?

有些奇怪,您能试一下短暂打开 TiDB 的 general log,看看具体报错的 SQL 和参数是什么吗?单独执行一下看看有没有报错

目前问题先暂时从mysqlbinlog解析出来报错的SQL在tidb执行了,然后跳过了,后面如果还有类似的问题,我按照你提供的方法看一下,这个问题确实有些奇怪

也就是说,mysqlbinlog 解析出的 SQL,到 TiDB 是可以运行的对吧。下次遇到的话,可以试试 REPLACE INTO 而不是 INSERT INTO 看看能不能运行

好的,好的,多谢多谢

如果解决了,最好标记一下对我有用

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