【 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"]
-
CH_BACK_DATA
为json字段
,update参数为解析为 []
(空括号) 。
- 检查上游mysql该字段数据
CH_BACK_DATA= null
WalterWj
(王军 - PingCAP)
2
看报错,感觉 update json 字段后内容是空,然后有问题。
推荐在 tidb 手动执行下 update SQL 测试下,看看报错。
- 要么是 tidb 和 MySQL 行为不一样
- 可能和 sql_mode 有管
先测试下试试。可以的话 提供下表结构和 update 语句 我也想研究研究 。
1 个赞
已复现,原因是:
数据字段定义 not null,但是数据写入为null。导致dm同步失败。
可以提供一下表结构和 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 |
+------+------+
system
(system)
关闭
7
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。