apache/seatunnel · critical · DebeziumException

Supplemental logging not properly configured. Use: ALTER…

Error message

Supplemental logging not properly configured. Use: ALTER DATABASE ADD SUPPLEMENTAL LOG DATA

What it means

Before streaming, checkDatabaseAndTableState verifies Oracle's supplemental logging setup. If neither ALL nor MIN supplemental logging is enabled at the database level, LogMiner cannot produce complete before-images and row identification, so the connector refuses to start with this DebeziumException. This is a prerequisite-check failure, not a runtime data problem.

Solutions

  1. Run ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; as a DBA-privileged user.
  2. Preferably enable full supplemental logging: ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; then restart the connector.
  3. Verify with SELECT SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_ALL FROM V$DATABASE; both should be non-YES->YES/IMPLICIT as appropriate.
  4. Also add table-level logging for captured tables: ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; plus ALTER TABLE <schema>.<table> ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;.

Example fix

-- before: connector fails supplemental-logging check
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;  -- NO
-- after
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
Defensive patterns

Strategy: validation

Validate before calling

SELECT SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_ALL
  FROM V$DATABASE;
-- proceed only if at least MIN is YES/IMPLICIT

Try / catch

try {
    startConnector();
} catch (DebeziumException e) {
    if (e.getMessage().contains("Supplemental logging not properly configured")) {
        // run ALTER DATABASE ADD SUPPLEMENTAL LOG DATA via DBA, then restart
    } else { throw e; }
}

Prevention

When it happens

Trigger: execute -> checkDatabaseAndTableState finds isDatabaseAllSupplementalLoggingEnabled and isDatabaseMinSupplementalLoggingEnabled both false — i.e. SELECT SUPPLEMENTAL_LOG_DATA_MIN/ALL FROM V$DATABASE both show NO.

Common situations: Fresh Oracle database never configured for CDC; DBA recreated the database or restored from a dump without reapplying supplemental logging settings; using a log-mining user that can query V$DATABASE but the DBA skipped the setup steps in the Debezium Oracle connector docs.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/859ac7d034d3b92f. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-connectors-v2/connector-cdc/connector-cdc-oracle/src/main/java/io/debezium/connector/oracle/logminer/LogMinerStreamingChangeEventSource.java:864

     * @param schema connector's database schema, should not be {@code null}
     * @throws SQLException if a database exception occurred
     */
    private void checkDatabaseAndTableState(
            OracleConnection connection, String pdbName, OracleDatabaseSchema schema)
            throws SQLException {
        final Instant start = Instant.now();
        LOGGER.trace(
                "Checking database and table state, this may take time depending on the size of your schema.");
        try {
            if (pdbName != null) {
                connection.setSessionToPdb(pdbName);
            }

            // Check if ALL supplemental logging is enabled at the database
            if (!isDatabaseAllSupplementalLoggingEnabled(connection)) {
                // Check if MIN supplemental logging is enabled at the database
                if (!isDatabaseMinSupplementalLoggingEnabled(connection)) {
                    throw new DebeziumException(
                            "Supplemental logging not properly configured. "
                                    + "Use: ALTER DATABASE ADD SUPPLEMENTAL LOG DATA");
                }

                // Check if ALL COLUMNS supplemental logging is enabled for each captured table
                for (TableId tableId : schema.tableIds()) {
                    if (!connection.isTableExists(tableId)) {
                        LOGGER.warn(
                                "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());

View on GitHub (pinned to cf67b549a7)