开发者社区> 问答> 正文

canal server初始化表结构有BUG,报 Table 'XXX.base table' do

DatabaseTableMeta类第209行开始

for (String schema : schemas) {
        // filter views
        packet = connection.query("show full tables from `" + schema + "` where Table_type = 'BASE TABLE'");
        int tableNameColumnIndex = 0; // default index is 0
        List<String> tables = new ArrayList<>();
        for (int line = 0; line < packet.getFieldValues().size() / columnSize; line++) {
            String table = packet.getFieldValues().get(line * columnSize + tableNameColumnIndex);
            String fullName = schema + "." + table;
            if (blackFilter == null || !blackFilter.filter(fullName)) {
                if (filter == null || filter.filter(fullName)) {
                    tables.add(table);
                }
            }
        }

        if (tables.isEmpty()) {
            continue;
        }

        StringBuilder sql = new StringBuilder();
        for (String table : tables) {
            sql.append("show create table `" + schema + "`.`" + table + "`;");
        }

        List<ResultSetPacket> packets = connection.queryMulti(sql.toString());
        for (ResultSetPacket onePacket : packets) {
            if (onePacket.getFieldValues().size() > 1) {
                String oneTableCreateSql = onePacket.getFieldValues().get(1);
                memoryTableMeta.apply(INIT_POSITION, schema, oneTableCreateSql, null);
            }
        }
    }

这个地方看着是要支持polardb-x的show table,但是会导致mysql出问题,把TABLE_TYPE的值“BASE TABLE”当成表名加到tables集合中,导致后面执行desc BASE TABLE直接报错。 看这段代码的意思应该是想在第二个for循环之前定义一个tableNameColumnIndex,然后想在for循环面对它做计算重新赋值,依此来跳过BASE TABLE,但是不知道作者是不是忘了,后面啥也没对它做,导致每张表后面都会跟着加进去一个BASE TABLE表。

原提问者GitHub用户zswiori

展开
收起
白夜行fighting 2023-04-25 21:02:45 246 0
1 条回答
写回答
取消 提交回答
  • canal-1.1.6 hotfix版本已经修复

    原回答者GitHub用户agapple

    2023-04-26 17:47:21
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载