开发者社区 问答 正文

视图 A 使用视图 B,且视图 B 存在中间查询,会导致 Canal 无法正确读取表结构信息

MySQL 版本:5.7.26 Canal 版本:1.1.0

有天发现从 canal 处收不到变更,查看日志发现以下报错:

2019-12-02 14:36:51.232 [destination = dw, address = /192.168.8.57:3306 , EventParser] ERROR c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - dump address /192.168.8.57:3306 has an error, retrying. caused by com.alibaba.otter.canal.parse.exception.CanalParseException: java.io.IOException: ErrorPacket [errorNumber=1046, fieldCount=-1, message=No database selected, sqlState=3D000, sqlStateMarker=#] with command: show create table test.a;show create table test.a000001_midd_;... at com.alibaba.otter.canal.parse.driver.mysql.MysqlQueryExecutor.queryMulti(MysqlQueryExecutor.java:109) ~[canal.parse.driver-1.1.0.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.queryMulti(MysqlConnection.java:107) ~[canal.parse-1.1.0.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.dumpTableMeta(DatabaseTableMeta.java:175) ~[canal.parse-1.1.0.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.rollback(DatabaseTableMeta.java:129) ~[canal.parse-1.1.0.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.processTableMeta(AbstractMysqlEventParser.java:91) ~[canal.parse-1.1.0.jar:na] at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:188) ~[canal.parse-1.1.0.jar:na] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161]

我把报错提示的 show create table ... 语句挎贝,在不选中 database 的情况下执行查询,MySQL 报了 1046 的错误。

后来我发现若存在视图 A 引用视图 B、且视图 B 中存在中间查询就会有这样的报错。 如:

SELECT a.xxx FROM ( SELECT aa.xxx FROM aa ) a

如果我把中间查询的部分抽成另一张视图就没有问题:

-- 视图 B_tmp SELECT aa.xxx FROM aa

-- 视图 B SELECT a.xxx FROM B_tmp a

原提问者GitHub用户VivionLin

展开
收起
Java工程师 2023-05-03 12:29:01 117 分享 版权
1 条回答
写回答
取消 提交回答
  • 看到 1.1.2 版本已经有小伙伴解决了这个问题了

    原回答者GitHub用户VivionLin

    2023-05-04 16:11:16
    赞同 展开评论