环境信息
canal version 1.1.2 mysql version 5.7
问题描述
2019-01-23 10:45:52.443 [[scheduler-table-meta-snapshot]] WARN c.a.otter.canal.parse.inbound.mysql.tsdb.MemoryTableMeta - parse faield : CREATE TABLE news ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID标识', title varchar(550) NOT NULL COMMENT '标题', PRIMARY KEY (id), KEY title_index (title) USING BTREE, FULLTEXT KEY ft_news_title (title) /*!50100 WITH PARSER ngram */ ) ENGINE=InnoDB AUTO_INCREMENT=1042277 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='' com.alibaba.fastsql.sql.parser.ParserException: illegal name, pos 2525, line 5, column 43, token HINT at com.alibaba.fastsql.sql.parser.SQLExprParser.name(SQLExprParser.java:1538) ~[fastsql-2.0.0_preview_540.jar:2.0.0_preview_540] at com.alibaba.fastsql.sql.dialect.mysql.parser.MySqlExprParser.parseColumn(MySqlExprParser.java:495) ~[fastsql-2.0.0_preview_540.jar:2.0.0_preview_540] at com.alibaba.fastsql.sql.dialect.mysql.parser.MySqlCreateTableParser.parseCreateTable(MySqlCreateTableParser.java:361) ~[fastsql-2.0.0_preview_540.jar:2.0.0_preview_540] at com.alibaba.fastsql.sql.dialect.mysql.parser.MySqlStatementParser.parseCreate(MySqlStatementParser.java:253) ~[fastsql-2.0.0_preview_540.jar:2.0.0_preview_540] at com.alibaba.fastsql.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:223) ~[fastsql-2.0.0_preview_540.jar:2.0.0_preview_540] at com.alibaba.fastsql.sql.SQLUtils.parseStatements(SQLUtils.java:498) ~[fastsql-2.0.0_preview_540.jar:2.0.0_preview_540] at com.alibaba.fastsql.sql.repository.SchemaRepository.console(SchemaRepository.java:413) ~[fastsql-2.0.0_preview_540.jar:2.0.0_preview_540] at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.MemoryTableMeta.apply(MemoryTableMeta.java:73) ~[canal.parse-1.1.1-SNAPSHOT.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.TableMetaCache.parseTableMeta(TableMetaCache.java:101) [canal.parse-1.1.1-SNAPSHOT.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.compareTableMetaDbAndMemory(DatabaseTableMeta.java:311) [canal.parse-1.1.1-SNAPSHOT.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.applySnapshotToDB(DatabaseTableMeta.java:253) [canal.parse-1.1.1-SNAPSHOT.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.access$100(DatabaseTableMeta.java:45) [canal.parse-1.1.1-SNAPSHOT.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta$2.run(DatabaseTableMeta.java:86) [canal.parse-1.1.1-SNAPSHOT.jar:na] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_191] at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_191] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_191] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_191] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191] 2019-01-23 10:45:52.444 [[scheduler-table-meta-snapshot]] ERROR c.a.o.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta - scheudle applySnapshotToDB faield java.lang.NullPointerException: null at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.TableMetaCache.parseTableMeta(TableMetaCache.java:103) ~[canal.parse-1.1.1-SNAPSHOT.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.compareTableMetaDbAndMemory(DatabaseTableMeta.java:311) ~[canal.parse-1.1.1-SNAPSHOT.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.applySnapshotToDB(DatabaseTableMeta.java:253) ~[canal.parse-1.1.1-SNAPSHOT.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.access$100(DatabaseTableMeta.java:45) ~[canal.parse-1.1.1-SNAPSHOT.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta$2.run(DatabaseTableMeta.java:86) ~[canal.parse-1.1.1-SNAPSHOT.jar:na] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_191] at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_191] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_191] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_191] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]
原提问者GitHub用户hzsbrave
使用最新版本的canal还是无法解决改问题,发现fastsql-2.0.0_preview_644.jar包无法解析FULLTEXT KEY ft_news_title (title) /*!50100 WITH PARSER ngram /后面的 : /!50100 WITH PARSER ngram */ 中的!50100 WITH PARSER `ngram为非法token,进行反编译fastsql-2.0.0_preview_644.jar修改MySqlCreateTableParser.java文件,再编译成class文件,替换fastsql-2.0.0_preview_644.jar的MySqlCreateTableParser.class文件,解决问题```
原回答者GitHub用户hzsbrave
从出错的 SQL 语句可以看出,该语句创建了一个名为 news 的表,该表包含 id、title 和 PRIMARY KEY 三个字段,其中 id 字段为自增长的主键。
根据 canal 版本和 MySQL 版本,可以确定该错误可能是由于以下原因导致的:
版本冲突:canal 版本和 MySQL 版本可能存在兼容性问题,导致在执行某些操作时出现错误。 语法错误:该语句可能存在语法错误,例如 CREATE TABLE 语句中的某些关键字或分号位置不正确。 为了解决该问题,可以尝试以下方法:
升级 canal 版本和 MySQL 版本,确保兼容性问题得以解决。 检查语法错误,确保 CREATE TABLE 语句中的关键字和分号位置正确。 在执行 SQL 语句时,可以使用 MySQL 的内置工具来检查语法错误,例如 mysqlcheck 或 sqlcheck。 此外,还可以尝试在执行 SQL 语句时使用 canal 的日志功能来捕获错误信息,并根据错误信息来进行排查和修复。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。