问题描述如题,以下为error log
2015-12-03 16:27:55.718 [destination = , address = , EventParser] ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:crm[com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed. Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed. Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table:s1.t1,6 vs 5 ]
原提问者GitHub用户Librazk
column size is not match for table:s1.t1,6 vs 5. 应该是做了字段删除操作,和主键无关
使用新RDS的自主用户权限,对canal授权super权限
原回答者GitHub用户agapple
当表没有主键时,MySQL在插入数据时会使用默认的行值填充主键列。如果该表中还有其他列,则MySQL将使用默认值来填充这些列。
由于MySQL在插入数据时需要知道表的结构信息,因此它会使用tableMeta对象来获取表的结构信息。而columnInfo对象则包含了表中每个列的信息,包括列名、数据类型、是否为主键等。
当插入数据时,MySQL会根据列信息和行值来生成相应的SQL语句。如果列信息和行值不匹配,则会导致插入失败或者插入的数据与预期不符。
因此,当表没有主键时,为了避免出现columnInfo和tableMeta的size不匹配的情况,可以在插入数据之前手动设置主键列的值。例如:
INSERT INTO table_name (col1, col2, col3) VALUES (val1, val2, val3);
SET @id = LAST_INSERT_ID();
UPDATE table_name SET col1 = @id WHERE id = val1;
在这个例子中,我们手动设置了主键列col1的值为@id,然后通过更新语句将主键列的值更新为插入的主键值val1。这样就可以避免columnInfo和tableMeta的size不匹配的问题了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。