alibaba/canal · error · CanalParseException
Unsupported BinlogImage + image
Error message
Unsupported BinlogImage + image
What it means
Symmetric to the binlog_format gate: when supportBinlogImages is configured, preDump() reads binlog_row_image and throws CanalParseException if it is not in the allowed set. canal works best with FULL or MINIMAL row images; this guard lets operators forbid formats that would omit needed columns.
Source
Thrown at parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlEventParser.java:117
}
if (!found) {
throw new CanalParseException("Unsupported BinlogFormat " + format);
}
}
if (supportBinlogImages != null && supportBinlogImages.length > 0) {
BinlogImage image = ((MysqlConnection) metaConnection).getBinlogImage();
boolean found = false;
for (BinlogImage supportImage : supportBinlogImages) {
if (supportImage != null && image == supportImage) {
found = true;
break;
}
}
if (!found) {
throw new CanalParseException("Unsupported BinlogImage " + image);
}
}
if (tableMetaTSDB != null && tableMetaTSDB instanceof DatabaseTableMeta) {
((DatabaseTableMeta) tableMetaTSDB).setConnection(metaConnection);
((DatabaseTableMeta) tableMetaTSDB).setFilter(eventFilter);
((DatabaseTableMeta) tableMetaTSDB).setBlackFilter(eventBlackFilter);
((DatabaseTableMeta) tableMetaTSDB).setSnapshotInterval(tsdbSnapshotInterval);
((DatabaseTableMeta) tableMetaTSDB).setSnapshotExpire(tsdbSnapshotExpire);
((DatabaseTableMeta) tableMetaTSDB).init(destination);
}
tableMetaCache = new TableMetaCache(metaConnection, tableMetaTSDB);
((LogEventConvert) binlogParser).setTableMetaCache(tableMetaCache);
}
}
protected void afterDump(ErosaConnection connection) {View on GitHub (pinned to 87be50e876)
Solutions
- Align the master: `SET GLOBAL binlog_row_image = 'FULL'` (or whatever canal requires).
- Adjust supportBinlogImages to include the master's current image if MINIMAL suffices for your consumers.
- Verify with `SHOW VARIABLES LIKE 'binlog_row_image'` after any server-side change.
Example fix
-- align master image with canal's allowed set SET GLOBAL binlog_row_image = 'FULL';
Defensive patterns
Strategy: validation
Validate before calling
BinlogImage actual = connection.getBinlogImage();
boolean ok = false;
for (BinlogImage allowed : supportBinlogImages) {
if (allowed == actual) { ok = true; break; }
}
if (!ok) {
throw new IllegalStateException("Master binlog_row_image " + actual + " not in allowed " + Arrays.toString(supportBinlogImages));
} Prevention
- Align master binlog_row_image with canal's supportBinlogImages.
- Use FULL when consumers need all columns.
- Re-verify after any master tuning or failover.
When it happens
Trigger: canal.instance.supportBinlogImages restricts the set and the master's binlog_row_image value falls outside it (e.g. NOBLOB or MINIMAL when only FULL is allowed).
Common situations: Master tuned to binlog_row_image=MINIMAL to save space, while canal's config demands FULL to receive all column values.
Related errors
- unexpected binlog image query result: + rs.getFieldValues()
- Unsupported BinlogFormat + format
- Invalid ExecuteLoadQueryLogEvent: fn_pos_start=%d, fn_pos_en
- status_vars_len ( ) > data_len ( )
- parseUUIDSet failed due to wrong format: %s
AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14).
Data as JSON: /api/errors/afe6f638cf856dc2.
Report an issue: GitHub.