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
- Set canal.instance.filter.table.error = true to continue processing past missing tables.
- Enable TSDB (canal.instance.tsdb.enable=true) so Canal maintains historical DDL snapshots for dropped/renamed tables.
- Verify the canal user has SELECT privileges on all replicated schemas.
- 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
- Set canal.instance.filter.table.error=true to avoid aborting on missing tables during online DDL.
- Enable TSDB so historical table metadata persists for dropped/renamed tables.
- Filter out temporary tables created by gh-ost/pt-osc via canal.instance.filter.black.regex.
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
- not found [{}] in db , pls check!
- parse row data failed.
- column size is not match for table:{},{} vs {}
- fetch table meta failed. table: {}
- fetch failed by table meta:{}
AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14).
Data as JSON: /api/errors/acc535a0541d1590.
Report an issue: GitHub.