【 使用环境 】生产环境
【 OB or 其他组件 】observer obproxy binlogserver ocp
【 使用版本 】ce 4.3.5.2-hf2
【问题描述】由于我们的某个表使用了全文索引。表结构如下:
CREATE TABLE `t_category` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '分类名称',
`path` varchar(100) DEFAULT NULL COMMENT '路径,id以逗号连接,前后加逗号',
PRIMARY KEY (`id`),
FULLTEXT KEY `category_path` (`path`) WITH PARSER space PARSER_PROPERTIES=(min_token_size=3,max_token_size=84)
) AUTO_INCREMENT = 1000001 DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC
在迁移到ob之前的mysql 可以工作的表是
CREATE TABLE `t_category` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '分类名称',
`path` varchar(100) DEFAULT NULL COMMENT '路径,id以逗号连接,前后加逗号',
PRIMARY KEY (`id`),
FULLTEXT KEY `category_path` (`path`)
) ENGINE=InnoDB AUTO_INCREMENT=1000012 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC
【复现路径】cloudcanal 或者 canal 在接收到这张表的binlog event 会去 执行 show create table xxx
.t_category
, 在mysql的上 canal是兼容的,ob的 得到的ddl 包含了 “PARSER_PROPERTIES=(min_token_size=3,max_token_size=84)”
就报错了,整个日志如下:
WARN c.c.c.m.worker.reader.vendor.parse.meta.MemoryTableMeta - parse failed : CREATE TABLE `t_category` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '分类名称',
`path` varchar(100) DEFAULT NULL COMMENT '路径,id以逗号连接,前后加逗号',
PRIMARY KEY (`id`),
FULLTEXT KEY `category_path` (`path`) WITH PARSER space PARSER_PROPERTIES=(min_token_size=3,max_token_size=84)
) AUTO_INCREMENT = 1000001 DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMMENT = '分类'
com.alibaba.druid.sql.parser.ParserException: illegal name, pos 14xx, line 6, column 77, token =
at com.alibaba.druid.sql.parser.SQLExprParser.name(SQLExprParser.java:2067)
at com.alibaba.druid.sql.parser.SQLExprParser.parseDataType(SQLExprParser.java:3777)
at com.alibaba.druid.sql.parser.SQLExprParser.parseDataType(SQLExprParser.java:3600)
at com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser.parseColumn(MySqlExprParser.java:988)
at com.alibaba.druid.sql.dialect.mysql.parser.MySqlCreateTableParser.parseCreateTable(MySqlCreateTableParser.java:272)
at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseCreate(MySqlStatementParser.java:309)
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:249)
at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:565)
at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:587)
at com.alibaba.druid.sql.repository.SchemaRepository.console(SchemaRepository.java:445)
at com.clougence.cloudcanal.mysql.worker.reader.vendor.parse.meta.MemoryTableMeta.apply(MemoryTableMeta.java:77)
binlog server 都是用ocp直接创建维护,默认也应该开了 _show_ddl_in_compat_mode
应该还是单独的druid 不兼容ob的这种非mysql标准的语法,请问有没有什么绕过方法 或者 后续优化路径?