apache/seatunnel · error · DebeziumException
Unable to find table in relational model: <tableId>
Error message
Unable to find table in relational model: <tableId>
What it means
In checkDatabaseAndTableState, when only MIN supplemental logging is enabled, the connector iterates each captured tableId and looks it up in the loaded relational model (schema.tableFor). If the lookup returns null, the table expected by the connector configuration is absent from the in-memory schema, and this DebeziumException is thrown (instead of a later NPE) to aid debugging.
Source
Thrown at seatunnel-connectors-v2/connector-cdc/connector-cdc-oracle/src/main/java/io/debezium/connector/oracle/logminer/LogMinerStreamingChangeEventSource.java:891
"Database table '{}' no longer exists, supplemental log check skipped",
tableId);
} else if (!isTableAllColumnsSupplementalLoggingEnabled(connection, tableId)) {
LOGGER.warn(
"Database table '{}' not configured with supplemental logging \"(ALL) COLUMNS\"; "
+ "only explicitly changed columns will be captured. "
+ "Use: ALTER TABLE {}.{} ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS",
tableId,
tableId.schema(),
tableId.table());
}
final Table table = schema.tableFor(tableId);
if (table == null) {
// This should never happen; however in the event something would cause it
// we can
// at least get the table identifier thrown in the error to debug from
// rather
// than an erroneous NPE
throw new DebeziumException(
"Unable to find table in relational model: " + tableId);
}
checkTableColumnNameLengths(table);
}
} else {
// ALL supplemental logging is enabled, now check table/column lengths
for (TableId tableId : schema.tableIds()) {
final Table table = schema.tableFor(tableId);
if (table == null) {
// This should never happen; however in the event something would cause it
// we can
// at least get the table identifier thrown in the error to debug from
// rather
// than an erroneous NPE
throw new DebeziumException(
"Unable to find table in relational model: " + tableId);
}
checkTableColumnNameLengths(table);View on GitHub (pinned to cf67b549a7)
Solutions
- Confirm the table still exists in Oracle and matches the connector's table include/exclude filters exactly (schema and name, case-sensitive).
- Verify the database schema history topic is intact and in sync; if corrupted, stop connector, fix history topic/recovery, and restart.
- Re-run a snapshot for the missing table (or remove it from the capture list if intentionally dropped).
- Check identifier casing: unquoted Oracle names are uppercase; ensure config uses ORACLE.TABLE.NAME casing that resolves to the same TableId.
Example fix
// before: table.include.list references a renamed table "table.include.list": "INVENTORY.ORDERS" // after: match the actual current table name "table.include.list": "INVENTORY.CUSTOMER_ORDERS"
Defensive patterns
Strategy: validation
Validate before calling
-- confirm every configured table exists and is in the captured model SELECT owner, table_name FROM all_tables WHERE owner || '.' || table_name IN (:configuredTableIds);
Prevention
- Keep table.include.list in sync with actual Oracle table names and casing
- Guard the schema history topic from corruption and monitor its recovery
- Remove dropped/renamed tables from the capture list before restarting
- Prefer database-level (ALL) COLUMNS supplemental logging to skip this table-by-table branch
When it happens
Trigger: execute -> checkDatabaseAndTableState -> schema.tableFor(tableId) returns null for a tableId in the captured schema — the relational model was built before/without that table, or the table was dropped/renamed between snapshot and streaming.
Common situations: Table dropped or renamed in Oracle after the snapshot but still listed via table include/exclude config; signal-based incremental snapshot referencing a table not in the relational model; schema history topic out of sync with the database; case-sensitivity mismatch in quoted identifiers.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Unable to find table in relational model: ${tableId}
- Can't obtain schema for table %s
- Failed to resolve current SCN
- Failed to resolve snapshot offset
- Online REDO LOG files or archive log files do not contain th
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/35e3122bb9fa3290.
Report an issue: GitHub.