alibaba/canal · error · CanalParseException
can't find init table meta for {} with position : {}
Error message
can't find init table meta for {} with position : {} What it means
Thrown as CanalParseException when processTableMeta(startPosition) returns false, meaning the table metadata needed at the start position could not be resolved. Even though a binlog position was found, Canal could not load the schema/table info required to decode row events correctly, so it refuses to start to avoid corrupt parsing.
Source
Thrown at parse/src/main/java/com/alibaba/otter/canal/parse/inbound/AbstractEventParser.java:193
long queryServerId = erosaConnection.queryServerId();
if (queryServerId != 0) {
serverId = queryServerId;
}
if (erosaConnection instanceof MysqlConnection) {
isMariaDB = ((MysqlConnection) erosaConnection).isMariaDB();
}
// 4. 获取最后的位置信息
long start = System.currentTimeMillis();
logger.warn("---> begin to find start position, it will be long time for reset or first position");
EntryPosition position = findStartPosition(erosaConnection);
final EntryPosition startPosition = position;
if (startPosition == null) {
throw new PositionNotFoundException("can't find start position for " + destination);
}
if (!processTableMeta(startPosition)) {
throw new CanalParseException("can't find init table meta for " + destination
+ " with position : " + startPosition);
}
long end = System.currentTimeMillis();
logger.warn("---> find start position successfully, {}", startPosition.toString() + " cost : "
+ (end - start)
+ "ms , the next step is binlog dump");
// 重新链接,因为在找position过程中可能有状态,需要断开后重建
erosaConnection.reconnect();
final SinkFunction sinkHandler = new SinkFunction<EVENT>() {
private LogPosition lastPosition;
public boolean sink(EVENT event) {
try {
CanalEntry.Entry entry = parseAndProfilingIfNecessary(event, false);
if (!running) {
View on GitHub (pinned to 87be50e876)
Solutions
- Ensure the canal MySQL user has SELECT on the tables being replicated (canal.instance.filter.regex/table).
- Confirm the tables in the filter still exist on the source with the same names.
- If using TSDB, clear or rebuild the TSDB snapshot (h2/db) for the destination so meta is re-fetched.
- Align canal.instance.filter.regex to include the tables present in the binlog at the start position.
Example fix
# before canal.instance.filter.regex = .*\\..* # after (only replicate existing tables and grant SELECT) canal.instance.filter.regex = mydb\\.(orders,customers) GRANT SELECT ON mydb.* TO 'canal'@'%';
Defensive patterns
Strategy: validation
Validate before calling
-- confirm the table exists and canal can read it SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='mydb' AND table_name='orders'; SHOW COLUMNS FROM mydb.orders; -- fails without SELECT
Try / catch
try { parser.start(); }
catch (CanalParseException e) {
if (e.getMessage().startsWith("can't find init table meta")) { rebuildTsdbSnapshot(destination); parser.start(); }
else throw e;
} Prevention
- Grant SELECT on replicated tables to the canal user.
- Keep canal.instance.filter.regex aligned with existing tables.
- Enable TSDB and rebuild its snapshot after major DDL.
When it happens
Trigger: Right after a valid startPosition is found, AbstractEventParser calls processTableMeta(startPosition); a false return triggers this. With TSDB enabled this delegates to tableMetaTSDB; without it, the table-meta fetch against the source DB fails or the table is not in the filter.
Common situations: The table referenced by the start position no longer exists at the source (dropped/renamed), the canal user lacks SELECT on the table, the filter (canal.instance.filter.regex/table) excludes the table so meta is skipped, or TSDB snapshot is missing/corrupt for that position. Also after a DDL that renamed the table between the binlog position and now.
Related errors
- unknow column : + name
- use gtid and TableMeta TSDB should be config timestamp > 0
- column size is not match for table:{},{} vs {}
- fetch failed by table meta:{}
- The provided data type doesn't map to know any known one.
AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14).
Data as JSON: /api/errors/51fb4f13d6495b03.
Report an issue: GitHub.