alibaba/canal · error · CanalParseException

not found [{}.{}] in db , pls check!

Error message

not found [{}.{}] in db , pls check!

What it means

Thrown from parseOneRow() when a forced table-meta reload returns null during row parsing. This is the second-chance path: Canal detected a possible online-DDL scenario and called getTableMeta with useCache=false to force a fresh DB lookup, but the table still cannot be found. Unless filterTableError is true, the exception aborts parsing.

Source

Thrown at parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java:651

                        && columnInfo[columnInfo.length - 1].type == LogEvent.MYSQL_TYPE_LONGLONG) {
                        existRDSNoPrimaryKey = true;
                    }
                }
            }

            EntryPosition position = createPosition(event.getHeader());
            if (!existRDSNoPrimaryKey) {
                // online ddl增加字段操作步骤:
                // 1. 新增一张临时表,将需要做ddl表的数据全量导入
                // 2. 在老表上建立I/U/D的trigger,增量的将数据插入到临时表
                // 3. 锁住应用请求,将临时表rename为老表的名字,完成增加字段的操作
                // 尝试做一次reload,可能因为ddl没有正确解析,或者使用了类似online ddl的操作
                // 因为online ddl没有对应表名的alter语法,所以不会有clear cache的操作
                tableMeta = getTableMeta(event.getTable().getDbName(), event.getTable().getTableName(), false, position);// 强制重新获取一次
                if (tableMeta == null) {
                    tableError = true;
                    if (!filterTableError) {
                        throw new CanalParseException("not found [" + event.getTable().getDbName() + "."
                                                      + event.getTable().getTableName() + "] in db , pls check!");
                    }
                }

                // 在做一次判断
                if (tableMeta != null && columnInfo.length > tableMeta.getFields().size()) {
                    tableError = true;
                    if (!filterTableError) {
                        throw new CanalParseException("column size is not match for table:" + tableMeta.getFullName()
                                                      + "," + columnInfo.length + " vs " + tableMeta.getFields().size());
                    }
                }
                // } else {
                // logger.warn("[" + event.getTable().getDbName() + "." +
                // event.getTable().getTableName()
                // + "] is no primary key , skip alibaba_rds_row_id column");
            }
        }

View on GitHub (pinned to 87be50e876)

Solutions

  1. Set canal.instance.filter.table.error = true to continue processing past missing tables.
  2. Enable TSDB (canal.instance.tsdb.enable=true) so Canal maintains historical DDL snapshots for dropped/renamed tables.
  3. Verify the canal user has SELECT privileges on all replicated schemas.
  4. If using gh-ost/pt-osc, configure Canal's nameFilter to exclude the temporary *_ghost_* / *_new tables.

Example fix

# before
canal.instance.filter.table.error=false
canal.instance.tsdb.enable=false

# after
canal.instance.filter.table.error=true
canal.instance.tsdb.enable=true
canal.instance.filter.black.regex=.*\\..*_ghc$,.*\\..*_ghost_\\d+$
Defensive patterns

Strategy: fallback

Try / catch

try {
    // parseOneRow is internal, but the outer pattern is:
    TableMeta meta = parseRowsEventForTableMeta(event);
} catch (CanalParseException e) {
    if (e.getMessage().contains("not found") && filterTableError) {
        logger.warn("Table not found during row parse, skipping: {}", fullname);
        tableError = true;
        // Continue processing — row data will be in error state
    }
}

Prevention

When it happens

Trigger: Inside parseOneRow(), after detecting a column mismatch or RDS no-primary-key scenario, Canal calls getTableMeta(dbName, tableName, false, position) to force-refresh metadata. If this returns null (table not found via 'show create table' / 'desc'), the exception fires. This typically means the table was dropped or renamed between the binlog event timestamp and the current processing time.

Common situations: An online DDL migration tool (e.g. pt-online-schema-change, gh-ost) created temporary tables that were already cleaned up by the time Canal processes the row events. The table was dropped after the binlog event but before Canal caught up. A schema rename happened and the old table name no longer resolves.

Related errors


AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14). Data as JSON: /api/errors/acc535a0541d1590. Report an issue: GitHub.