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

  1. Align the master: `SET GLOBAL binlog_row_image = 'FULL'` (or whatever canal requires).
  2. Adjust supportBinlogImages to include the master's current image if MINIMAL suffices for your consumers.
  3. 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

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


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