alibaba / canal

阿里巴巴 MySQL binlog 增量订阅&消费组件
Apache License 2.0
28.46k stars 7.61k forks source link

canal.deployer-1.1.6版本的安装包有bug #4245

Closed qq664042 closed 2 years ago

qq664042 commented 2 years ago

environment

Issue Description

github下载地址 下载 下载后,发现源码包与字节码包的内容是不一至的,字节码包部署后,疯狂报错,说找不到BASE TABLE错误。反编译在对比源码包,发现不一至,字节码包的代码有bug.

8b0da36f418976ae856a7c547c64a47

Just put your stack trace here!

image

Jack1007 commented 2 years ago

我也遇到了这个问题 java.io.IOException: ErrorPacket [errorNumber=1146, fieldCount=-1, message=Table 'test.base table' doesn't exist, sqlState=42S02, sqlStateMarker=#]

jimmy384 commented 2 years ago

https://github.com/alibaba/canal/issues/4220 我也遇到了,源码编译没问题。当时提了issue之后官方重新上传了包和 docker 镜像,但重新上传的好像还是有问题

qq664042 commented 2 years ago

Reference i

有没有发现源码包与字节码包的上传日期相差好几天啊 image 现在是不知道怎么用源码包,打包成目标的字节码包。

jimmy384 commented 2 years ago

https://github.com/alibaba/canal/issues/4219#issuecomment-1152913052 当时我也发现了,我就是通过这个日期发现官方重新上传了一次包。 我当时是把代码拉下来,然后从1.1.6的tag创建一个本地分支,mvn package,把打包出来的canal.parser.jar替换掉,就换了一个jar包

qq664042 commented 2 years ago

#4219 (comment) 当时我也发现了,我就是通过这个日期发现官方重新上传了一次包。 我当时是把代码拉下来,然后从1.1.6的tag创建一个本地分支,mvn package,把打包出来的canal.parser.jar替换掉,就换了一个jar包

好像可以这样打包,打包完之后在根目录下的target里面 mvn clean install -Dmaven.test.skip=true -Denv=release

hncdyj123 commented 2 years ago

开始一直以为是我的数据库有问题,后面我发现老是在创建BASE TABLE表 可以在conf/example/instance.properties中

canal.instance.filter.black.regex=new_energy\\.BASE.*
qq664042 commented 2 years ago

开始一直以为是我的数据库有问题,后面我发现老是在创建BASE TABLE表 可以在conf/example/instance.properties中

canal.instance.filter.black.regex=new_energy\\.BASE.*

这种方式好像是可以,但是源码包与安装包的代码不到至总感觉怪怪的

bwcx-jzy commented 2 years ago

开始一直以为是我的数据库有问题,后面我发现老是在创建BASE TABLE表 可以在conf/example/instance.properties中

canal.instance.filter.black.regex=new_energy\\.BASE.*

我用配置这个后还是报错,还有其他地方需要修改配置吗?

bwcx-jzy commented 2 years ago

发现报错的信息每个环境不一样

2022-06-24 09:07:23.788 [destination = example , address = /127.0.0.1:3338 , EventParser] ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:example[com.alibaba.otter.canal.parse.exception.CanalParseException: java.io.IOException: ErrorPacket [errorNumber=1146, fieldCount=-1, message=Table 'mysql.BASE TABLE' doesn't exist, sqlState=42S02, sqlStateMarker=#]
 with command: show create table `mysql`.`columns_priv`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`db`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`engine_cost`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`event`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`func`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`general_log`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`gtid_executed`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`help_category`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`help_keyword`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`help_relation`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`help_topic`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`innodb_index_stats`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`innodb_table_stats`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`ndb_binlog_index`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`plugin`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`proc`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`procs_priv`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`proxies_priv`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`server_cost`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`servers`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`slave_master_info`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`slave_relay_log_info`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`slave_worker_info`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`slow_log`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`tables_priv`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`time_zone`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`time_zone_leap_second`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`time_zone_name`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`time_zone_transition`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`time_zone_transition_type`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`user`;show create table `mysql`.`BASE TABLE`;
Caused by: java.io.IOException: ErrorPacket [errorNumber=1146, fieldCount=-1, message=Table 'mysql.BASE TABLE' doesn't exist, sqlState=42S02, sqlStateMarker=#]
 with command: show create table `mysql`.`columns_priv`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`db`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`engine_cost`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`event`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`func`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`general_log`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`gtid_executed`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`help_category`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`help_keyword`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`help_relation`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`help_topic`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`innodb_index_stats`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`innodb_table_stats`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`ndb_binlog_index`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`plugin`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`proc`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`procs_priv`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`proxies_priv`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`server_cost`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`servers`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`slave_master_info`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`slave_relay_log_info`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`slave_worker_info`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`slow_log`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`tables_priv`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`time_zone`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`time_zone_leap_second`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`time_zone_name`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`time_zone_transition`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`time_zone_transition_type`;show create table `mysql`.`BASE TABLE`;show create table `mysql`.`user`;show create table `mysql`.`BASE TABLE`;
        at com.alibaba.otter.canal.parse.driver.mysql.MysqlQueryExecutor.queryMulti(MysqlQueryExecutor.java:109)
        at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.queryMulti(MysqlConnection.java:111)
        at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.dumpTableMeta(DatabaseTableMeta.java:233)
        at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.rollback(DatabaseTableMeta.java:174)
        at com.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.processTableMeta(AbstractMysqlEventParser.java:142)
        at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$1.run(AbstractEventParser.java:197)
        at java.lang.Thread.run(Thread.java:748)
  1. mysql.BASE TABLE
  2. demo_ds_1.BASE TABLE
  3. test.base table
  4. canal-sync.BASE TABLE

出现这样的情况,是不是因为用户的数据里面不一致造成的呢?

jimmy384 commented 2 years ago

都一样是BASE TABLE, 前面只是数据库的名字,每个人肯定起的名字不一样

bwcx-jzy commented 2 years ago

#4219 (comment) 当时我也发现了,我就是通过这个日期发现官方重新上传了一次包。 我当时是把代码拉下来,然后从1.1.6的tag创建一个本地分支,mvn package,把打包出来的canal.parser.jar替换掉,就换了一个jar包

我本地打包还会有这样的错

bwcx-jzy commented 2 years ago

都一样是BASE TABLE, 前面只是数据库的名字,每个人肯定起的名字不一样

不像,我这个 mysql,我没有指定这个数据库

bwcx-jzy commented 2 years ago

都一样是BASE TABLE, 前面只是数据库的名字,每个人肯定起的名字不一样

如果是数据库名称,是不是哪里可以配置什么?会不会是因为自动加载 admin 造成的?

hncdyj123 commented 2 years ago

@bwcx-jzy 你可以把这些语句拉到mysql的mysql库执行下,我帮你格式化了一下,主要还是这段有问题

SHOW CREATE TABLE `mysql`.`BASE TABLE`;

SHOW CREATE TABLE `mysql`.`columns_priv`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`db`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`engine_cost`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`event`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`func`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`general_log`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`gtid_executed`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`help_category`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`help_keyword`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`help_relation`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`help_topic`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`innodb_index_stats`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`innodb_table_stats`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`ndb_binlog_index`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`plugin`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`proc`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`procs_priv`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`proxies_priv`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`server_cost`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`servers`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`slave_master_info`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`slave_relay_log_info`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`slave_worker_info`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`slow_log`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`tables_priv`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`time_zone`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`time_zone_leap_second`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`time_zone_name`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`time_zone_transition`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`time_zone_transition_type`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;
SHOW CREATE TABLE `mysql`.`user`;
SHOW CREATE TABLE `mysql`.`BASE TABLE`;

直接这样试试

可以在conf/example/instance.properties中
canal.instance.filter.black.regex=mysql\\.BASE.*
hncdyj123 commented 2 years ago

各位有遇到关键字报错的吗 转义也做了 好像无效 是不是因为打包的问题 复现了?

4241

SZDRZ commented 2 years ago

跟各位一样的问题。期初还以自己哪里配置错了,搞了半天才从数据库中发现有问题的SQL语句

image

yreezy commented 2 years ago

哈哈 一样 这个BASE TABLE 是table value 需要过滤的 但是deploy包有问题 - - 导致这块过滤没生效

yreezy commented 2 years ago

问个问题 我本地包package后 丢到 canal-deployer/lib 替换同名文件 启动之后日志什么的还是没有 这个有遇到么

yreezy commented 2 years ago

都一样是BASE TABLE, 前面只是数据库的名字,每个人肯定起的名字不一样

如果是数据库名称,是不是哪里可以配置什么?会不会是因为自动加载 admin 造成的?

实际上这里是 show full tables from " + schema + " where Table_type = 'BASE TABLE'查询到的两个字段 这里会有两个字段 一个表名 一个type->BASE TABLE 所以目前最好的方法 要么是替换jar包 要么是black.regex去过滤 + .*//.BASE TABLE

goxxdev commented 2 years ago

错误位置: com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta:211

fixed issue #4216 , support polardb-x show tables 753fad66 jianghang.loujh jianghang.loujh@alibaba-inc.com on 2022/6/10 at 13:36

CoderDuMeng commented 2 years ago

同样docker image 就没问题

AaronZhangL commented 2 years ago

应该过滤掉所有SCHEMA名称下的BASE TABLE表名,修改文件[/home/admin/canal-server/conf/{your-db-schema-name}/instance.properties]中的下面设置:

canal.instance.filter.black.regex=.*\\.BASE TABLE.*

下面的写法只会过滤掉特定SCHEMA, new_energy的BASE TABLE表

canal.instance.filter.black.regex=new_energy\\.BASE.*

agapple commented 2 years ago

https://github.com/alibaba/canal/pull/4331, 已修复