Skip to main content
Source Ingest Engine captures inserts, updates, and deletes from database transaction logs and writes them continuously to Apache Iceberg. A single CDC source can capture many database tables. Ingest Engine creates and maintains a separate Iceberg table for each source table.

Supported databases

How it works

  1. Ingest Engine takes an initial snapshot when the selected snapshot mode requires one.
  2. Debezium continues from the corresponding binlog position or PostgreSQL LSN.
  3. Changes are grouped by source table and written to that table’s Iceberg destination.
  4. Source progress and Iceberg data and delete files are coordinated through Ingest Engine checkpoints.
  5. A checkpoint completes only after the Iceberg catalog commit succeeds.
The result is continuous, exactly-once replication into Iceberg. After a restart, Ingest Engine resumes from the last completed checkpoint without omitting or applying committed changes twice. See Shared data services for how shared CDC capture and durable ingestion can be reused across pipelines.

Write modes

Multi-table Iceberg supports two write modes. Choose the mode based on whether the destination should retain change history or expose the latest state of each source row.

Append-only

Append-only mode writes every captured change as a new Iceberg row. Inserts, updates, deletes, and snapshot reads remain available as a change history with operation metadata. Use append-only mode for:
  • audit and history tables;
  • downstream change processing;
  • replayable raw data layers;
  • the highest write throughput when a current-state table is not required.

Full CDC

Full CDC mode maintains the current state of every source row in Iceberg. Source tables must have a stable primary key. Ingest Engine writes new row versions and removes the replaced or deleted versions as part of the same checkpoint. Ingest Engine selects the appropriate Iceberg delete representation for the target table:
  • Equality deletes match rows in previously committed data files by primary key.
  • Position delete files target recent rows when Ingest Engine knows their data file and row position. This is the position-based representation used by Iceberg v2 tables.
  • Deletion vectors encode position-based deletes for Iceberg v3 tables when the catalog and query engines support them.
These representations follow the Iceberg row-level delete model. This keeps older changes efficient through primary-key matching while avoiding unnecessary scans for rows written or replaced during the current checkpoint.
For full CDC, every captured table must expose its primary key. Floating-point columns cannot be used as Iceberg identifier fields.

Create a CDC source

Create CDC sources through the API. The source schema is discovered from the database, so the request does not repeat every source column.

MySQL

Unqualified table names are resolved against database. You can also use fully qualified names such as ecommerce.orders.

PostgreSQL

Unqualified PostgreSQL table names are resolved against schema. Use distinct replication slot and publication names for independently running CDC sources.

Source configuration

Snapshot modes

Snapshot mode values are passed to the bundled Debezium connector. Common modes are:

Configure multi-table Iceberg

Enable multiTable on the Iceberg sink. Ingest Engine derives a destination table name from each captured source table and creates the table when it first receives data.
Supported template variables are: Include the database and schema in the template when the same table name may appear in multiple source namespaces. See Apache Iceberg for catalog authentication, object-store credentials, Parquet settings, and table properties.

Exactly-once commits

Ingest Engine coordinates database progress with Iceberg through checkpoint barriers and two-phase commits:
  1. Writers finish the data files and delete information produced for the checkpoint.
  2. The checkpoint records the corresponding database position.
  3. Ingest Engine commits the files as one atomic Iceberg snapshot for each target table.
  4. The checkpoint is acknowledged only after the catalog accepts the snapshot.
If a worker or controller fails before the catalog commit, the incomplete checkpoint is not published. If the commit succeeds but its acknowledgement is interrupted, Ingest Engine recovers the checkpoint and recognizes the committed work instead of applying it again.

Database prerequisites

MySQL

Enable row-based binary logging:
Create a dedicated replication user:
The binlog retention period must be longer than the maximum expected pipeline downtime.

PostgreSQL

Enable logical replication:
Create a user with replication and table-read privileges:
For complete old row values on updates and deletes, configure the captured table with an appropriate replica identity:
Monitor replication slots and remove slots that are no longer used. An inactive slot can prevent PostgreSQL from reclaiming old WAL files.

Choosing a mode

Last modified on October 1, 2026