Debezium is the Kafka Connect CDC engine operators run against Oracle, Postgres, MySQL, MariaDB, and MongoDB. The recorded window on main is 37 commits across 115 files, 6328 insertions and 588 deletions. No release tag landed. The pieces that change runtime behavior are Oracle LogMiner window growth, MongoDB topology checks, empty Postgres enums, and MySQL schema history recovery on large binlog files.
Oracle LogMiner no longer crawls one log per stall ¶
Oracle LogMiner is the expensive path. When a long running transaction pins the lower watermark, CappedLogFileSessionSelector used to grow the mining window by one archive log per session. Mining sessions can take hours on a busy redo stream. Closing a multi log gap then cost one session per log.
A stall distance change now sizes the per thread log count from the byte span up to the previously mined boundary. That is the same derivation already used to seed the selector from offsets after a restart. Growth still keeps a plus one floor so a stall always advances. A later patch applies the growth ceiling on restarts, so a derived count from a seeded SCN cannot drag an unbounded slice into catch up.
The brief hard ceiling of 16 logs per redo thread did not stay. A new connector option log.mining.log.count.growth.max in OracleConnectorConfig defaults to 4. log.mining.log.count.min still wins if it is higher. The mining window can exceed the ceiling when the connector reads already mined logs again. The knob bounds automatic growth, not coverage. The property has no effect when log.mining.strategy is redo_log_catalog.
log.mining.log.count.min=1
log.mining.log.count.growth.max=4
Larger values spend more IO per pass and catch up in fewer steps. Smaller values do the reverse. The Oracle connector docs tell operators to raise the ceiling only after they know the IO budget of the database. If the configured minimum meets or exceeds the growth max, validation logs a warning and automatic growth is off.
MongoDB fails validation on standalone servers ¶
Standalone MongoDB has no oplog. Change streams return server error 40573. The connector used to pass validateConnection and then fail once streaming started.
Standalone topology now fails connector validation in MongoDbConnector. validateClusterTopology still requires a replica set name when the driver says one is required. It then rejects ClusterType.STANDALONE. Replica set, sharded, load balanced, and unknown topologies still pass. A single node replica set is enough.
MongoDB deployed as a standalone server is not supported: change streams require a replica set or sharded cluster (a single-node replica set is sufficient)
Incremental snapshot gained a smaller but real type hole. Date document id keys are now accepted in keyFromRow. String and UUID binary ids already worked. DATE_TIME becomes java.util.Date. Unsupported binary subtypes now print the actual BSON type instead of a generic “Unsupported type of document id”. If incremental snapshot died on date _id values, that path no longer throws.
Empty Postgres enums and binlog positions past 2 GiB ¶
Postgres type registry priming called rs.getArray("enum_values").getArray() for enum categories. An empty enum produces a null SQL array. That was a null pointer during connector start. Empty PostgreSQL enum types in TypeRegistry treat a null array as an empty label list. Integration tests also cover the unfiltered SQL_TYPES path.
MySQL and MariaDB had a quieter failure mode. Binlog positions are compared as long in the history record comparator. A stored position past Integer.MAX_VALUE deserializes as a Long. Document#getInteger then returns null, so every schema history record looked as if it were after the restart offset, and recovery applied nothing. Positions and server_id are now read as long and compared with Long.compare. Tests cover 4 GiB and a 9886193806 byte position. If a binlog file grew past 2 GiB, this is the bug that made schema history look empty after a restart.
Snapshot read metrics and Neo4j delete payloads ¶
Create, update, and delete already had JMX counters. Snapshot READ events did not. Read events are now a connector metric. TotalNumberOfReadEventsSeen lives on CommonEventMeter and in the snapshot metrics docs. Filtered and erroneous READ events increment it too. If snapshot progress showed total events without a matching CUD split, this is the missing slice.
The Neo4j CUD SMT omits properties on deleted relationships. The CUD format forbids a properties block on relationship deletes. The factory now passes null for Operation.DELETE. The serializer skips the key. Tests cover batched and single output modes.
Configuration.getList(Field) and getStrings(Field) ignored field defaults when the key was unset, while getString(Field) and the numeric accessors already applied them. Those list accessors now go through getString(Field). Two call sites had been parsing defaults by hand. Connector options with list defaults now match the documented fallback.
What to watch ¶
Oracle operators on online_catalog or hybrid get log.mining.log.count.growth.max=4 as the new default, not the old 16 log hard ceiling. If catch up after a pinned transaction lags redo, raise the value and measure redo IO. If log.mining.log.count.min is already above 4, growth is off and the warning in logs is expected.
MongoDB connectors pointed at a standalone process will fail at config validation. Convert the process to a replica set first. Date _id incremental snapshots no longer throw on document id type.
MySQL schema history recovery after a restart on a large binlog file is worth a retest. Positions past 2 GiB used to skip history apply entirely. MariaDB database.ssl.mode docs also split from the MySQL values. Valid MariaDB settings are disable, trust, verify-ca, and verify-full, default disable.