双向同步,一段时间没有数据同步,channel挂起,mainsteam和pipeline状态正常,position状态没有更新
pid:2 nid:2 exception:setl:com.alibaba.otter.node.etl.select.exceptions.SelectException: com.alibaba.otter.node.etl.select.exceptions.SelectException: this rowdata has no pks , entry: header { version: 1 logfileName: "mysql-bin.000180" logfileOffset: 36354060 serverId: 2 serverenCode: "UTF-8" executeTime: 1554235662000 sourceType: MYSQL schemaName: "mysql" tableName: "yongger2" eventLength: 40 eventType: INSERT props { key: "rowsCount" value: "1" } } entryType: ROWDATA storeValue: "\b\356\002\020\001P\000b\037\022\035\b\000\020\324\017\032\004data \000(\0010\000B\000R\bLONGBLOB" and rowData: afterColumns { index: 0 sqlType: 2004 name: "data" isKey: false updated: true isNull: false value: "" mysqlType: "LONGBLOB" }
at com.alibaba.otter.node.etl.select.selector.MessageParser.parse(MessageParser.java:212) at com.alibaba.otter.node.etl.select.selector.canal.CanalEmbedSelector.selector(CanalEmbedSelector.java:278) at com.alibaba.otter.node.etl.select.SelectTask.processSelect(SelectTask.java:236) at com.alibaba.otter.node.etl.select.SelectTask.access$300(SelectTask.java:94) at com.alibaba.otter.node.etl.select.SelectTask$1.run(SelectTask.java:208) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) Caused by: com.alibaba.otter.node.etl.select.exceptions.SelectException: this rowdata has no pks , entry: header { version: 1 logfileName: "mysql-bin.000180" logfileOffset: 36354060 serverId: 2 serverenCode: "UTF-8" executeTime: 1554235662000 sourceType: MYSQL schemaName: "mysql" tableName: "yongger2" eventLength: 40 eventType: INSERT props { key: "rowsCount" value: "1" } } entryType: ROWDATA storeValue: "\b\356\002\020\001P\000b\037\022\035\b\000\020\324\017\032\004data \000(\0010\000B\000R\bLONGBLOB" and rowData: afterColumns { index: 0 sqlType: 2004 name: "data" isKey: false updated: true isNull: false value: "" mysqlType: "LONGBLOB" }
at com.alibaba.otter.node.etl.select.selector.MessageParser.internParse(MessageParser.java:585) at com.alibaba.otter.node.etl.select.selector.MessageParser.internParse(MessageParser.java:391) at com.alibaba.otter.node.etl.select.selector.MessageParser.parse(MessageParser.java:142) ... 9 more
原提问者GitHub用户 stickmanth
根据您提供的信息,这个错误是由于CanalEmbedSelector在解析一条数据时发现该数据没有主键,无法进行同步,导致SelectTask挂起。这可能是由于源端数据库中的数据表没有设置主键,或者主键定义不规范导致的。
您可以尝试以下几个解决方法:
在源端数据库中为数据表设置主键,确保每个表都有主键定义,并且主键定义规范。
如果源端数据表的主键定义不规范,可以尝试修改主键定义,使其符合规范。例如,将主键定义为整型或字符串类型,并且不允许为空。
如果源端数据库中的数据表没有主键,可以尝试使用Canal的动态列支持功能,动态生成一个唯一索引,作为数据同步的主键。
检查Canal的版本是否支持该数据库类型和版本,如果不支持,可以尝试升级Canal版本或使用其他的同步工具。
如果您尝试了以上解决方法仍然无法解决问题,建议检查Canal、Otter和源端数据库的日志,查看是否有其他错误信息。同时,您也可以提供更多的细节,以便更好地帮助您解决问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。