DM 2.0 版本 Error 3140: Invalid JSON text: The document is empty 报错

【 TiDB 使用环境】生产环境
【 TiDB 版本】tidb=5.0.4、dm=v2.0.7
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
DM数据同步遇到 Error 3140: Invalid JSON text: The document is empty 导致同步异常中断。

中断后发现日志中存在大量重试报错:

content:[2023/01/03 11:07:28.825 +08:00] [ERROR] [baseconn.go:184] ["execute statement failed"] [task=prod_datacenter-v5_rd_stattax] [unit="binlog replication"] [query="UPDATE `rttax2`.`taxpayer_task` SET `I_ID` = ?, ..., `I_STATUS` = ?,...., `CH_BACK_DATA` = ? WHERE `I_ID` = ? LIMIT 1"] [argument="[...,[],...]"] [error="Error 3140: Invalid JSON text: The document is empty"]
  1. CH_BACK_DATAjson字段,update参数为解析为 [] (空括号) 。
  2. 检查上游mysql该字段数据 CH_BACK_DATA= null
    image

看报错,感觉 update json 字段后内容是空,然后有问题。

推荐在 tidb 手动执行下 update SQL 测试下,看看报错。

  1. 要么是 tidb 和 MySQL 行为不一样
  2. 可能和 sql_mode 有管

先测试下试试。可以的话 提供下表结构和 update 语句 我也想研究研究 :thinking:

1 个赞

已复现,原因是:
数据字段定义 not null,但是数据写入为null。导致dm同步失败。
image

可以提供一下表结构和 DML,我们这边也复现一下吗

以下sql都是在dm上游mysql执行:

CREATE TABLE `dm_json_test` (
    ->   `I_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    ->   `DATA` json NOT NULL COMMENT 'xxx',
    ->   PRIMARY KEY (`I_ID`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='测试表';

 insert into dm_json_test(I_ID,DATA) values(1,'{"name":"name1"}');

update dm_json_test set DATA=null where I_ID=1;
Query OK, 1 row affected, 1 warning (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 1

show warnings;
+---------+------+------------------------------+
| Level   | Code | Message                      |
+---------+------+------------------------------+
| Warning | 1048 | Column 'DATA' cannot be null |
+---------+------+------------------------------+

select * from dm_json_test;
+------+------+
| I_ID | DATA |
+------+------+
|    1 | null |
+------+------+

MySQL相关bug:
https://bugs.mysql.com/bug.php?id=98496

1 个赞

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