apache/seatunnel · error · IllegalArgumentException

Oracle-CDC specific startup mode uses…

Error message

Oracle-CDC specific startup mode uses startup.specific-offset.scn instead of file or position offsets.

What it means

When startup.mode = specific, Oracle CDC positions the reader at an SCN, not at a binlog-style file/position. getOracleStartupConfig therefore rejects startup.specific-offset.file or startup.specific-offset.pos if either is set, since those generic JDBC-source offsets are meaningless for Oracle redo logs.

Solutions

  1. Delete startup.specific-offset.file and startup.specific-offset.pos from the config.
  2. Specify startup.specific-offset.scn with the target SCN instead.
  3. Obtain a current SCN via SELECT current_scn FROM v$database if unsure.

Example fix

// before
startup.mode = "specific"
startup.specific-offset.file = "mysql-bin.000001"
startup.specific-offset.pos = 4
// after
startup.mode = "specific"
startup.specific-offset.scn = 2518210
Defensive patterns

Strategy: validation

Validate before calling

if ("specific".equals(config.get("startup.mode")) &&
    (config.hasPath("startup.specific-offset.file") || config.hasPath("startup.specific-offset.pos")))
    throw new IllegalArgumentException("use startup.specific-offset.scn for Oracle");

Prevention

When it happens

Trigger: startup.mode = "specific" combined with startup.specific-offset.file = "..." or startup.specific-offset.pos set; getStartupConfig calls getOracleStartupConfig and hits the guard after the non-specific branch.

Common situations: Users copy a MySQL CDC specific-offset config (file + pos) and reuse it for Oracle; templates shared between MySQL/Oracle jobs.

Related errors


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

Appendix: source

Thrown at seatunnel-connectors-v2/connector-cdc/connector-cdc-oracle/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/oracle/source/OracleIncrementalSource.java:121

        Optional<Long> startupSpecificOffsetScn =
                config.getOptional(OracleIncrementalSourceOptions.STARTUP_SPECIFIC_OFFSET_SCN);

        if (startupMode != StartupMode.SPECIFIC) {
            if (startupSpecificOffsetScn.isPresent()) {
                throw new IllegalArgumentException(
                        OracleIncrementalSourceOptions.STARTUP_SPECIFIC_OFFSET_SCN.key()
                                + " is only supported when startup.mode is specific.");
            }
            return new StartupConfig(
                    startupMode,
                    config.get(SourceOptions.STARTUP_SPECIFIC_OFFSET_FILE),
                    config.get(SourceOptions.STARTUP_SPECIFIC_OFFSET_POS),
                    config.get(SourceOptions.STARTUP_TIMESTAMP));
        }

        if (config.getOptional(SourceOptions.STARTUP_SPECIFIC_OFFSET_FILE).isPresent()
                || config.getOptional(SourceOptions.STARTUP_SPECIFIC_OFFSET_POS).isPresent()) {
            throw new IllegalArgumentException(
                    "Oracle-CDC specific startup mode uses "
                            + OracleIncrementalSourceOptions.STARTUP_SPECIFIC_OFFSET_SCN.key()
                            + " instead of file or position offsets.");
        }

        Long scn =
                startupSpecificOffsetScn.orElseThrow(
                        () ->
                                new IllegalArgumentException(
                                        OracleIncrementalSourceOptions.STARTUP_SPECIFIC_OFFSET_SCN
                                                        .key()
                                                + " is required when startup.mode is specific."));
        if (scn <= 0) {
            throw new IllegalArgumentException(
                    OracleIncrementalSourceOptions.STARTUP_SPECIFIC_OFFSET_SCN.key()
                            + " must be greater than 0.");
        }

View on GitHub (pinned to cf67b549a7)