<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/debezium-in-production-postgresql-to-kafka-to-iceberg-cdc-patterns-that-actually-work-43qqjunc0" -->

---
title: Debezium in Production: PostgreSQL to Kafka to Iceberg...
description: A production-focused deep-dive into running Debezium for PostgreSQL to Kafka to Iceberg change data capture pipelines. It covers logical decoding with...
canonical: https://daily.dev/posts/debezium-in-production-postgresql-to-kafka-to-iceberg-cdc-patterns-that-actually-work-43qqjunc0
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Debezium in Production: PostgreSQL to Kafka to Iceberg CDC Patterns That Actually Work | daily.dev
og:description: A production-focused deep-dive into running Debezium for PostgreSQL to Kafka to Iceberg change data capture pipelines. It covers logical decoding with...
og:url: https://daily.dev/posts/debezium-in-production-postgresql-to-kafka-to-iceberg-cdc-patterns-that-actually-work-43qqjunc0
og:image: https://api.daily.dev/og/posts/43QqjUNc0.png
og:image:alt: Debezium in Production: PostgreSQL to Kafka to Iceberg CDC Patterns That Actually Work
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Debezium in Production: PostgreSQL to Kafka to Iceberg CDC Patterns That Actually Work

**[BigData Boutique blog](https://daily.dev/sources/bigdataboutique)** · 18 min read · 3 upvotes · 0 comments

## Summary

A production-focused deep-dive into running Debezium for PostgreSQL to Kafka to Iceberg change data capture pipelines. It covers logical decoding with pgoutput, replication slot mechanics and the disk-growth failure mode that can take down a primary, snapshot modes and incremental snapshots for large tables, delivery guarantees (at-least-once vs Kafka Connect's exactly-once support since Kafka 3.3), throughput tuning of the internal queue and producer, key JMX metrics to monitor, and the tradeoffs between Iceberg sink options (Apache Iceberg Kafka Connect sink, Flink, and Debezium Server Iceberg) for handling upserts and deletes via equality deletes. Recommends a bronze/silver table pattern for reliability.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://bigdataboutique.com/blog/debezium-production-cdc-patterns>

## Questions this post answers

### Why does my PostgreSQL disk fill up when using a Debezium replication slot?

A replication slot prevents PostgreSQL from recycling any WAL segment its consumer has not yet confirmed, so when Debezium stops consuming (a crashed connector, network partition, or Kafka outage), the primary retains every WAL segment generated since, growing without bound until the disk fills and PostgreSQL stops accepting writes.

_Track replication slot pitfalls like this on daily.dev before they cause an outage in your CDC pipeline._

### Which Debezium PostgreSQL plugin should I use, pgoutput or decoderbufs?

Use pgoutput. It ships inside PostgreSQL 10 and later, is maintained by the Postgres community with nothing extra to install, and is the only option supported by managed services like RDS and Cloud SQL, whereas decoderbufs is a Debezium-maintained Protobuf plugin requiring a native extension compiled onto the server. Set plugin.name explicitly since the property still defaults to decoderbufs.

_Developers picking CDC connector settings can compare tradeoffs like this on daily.dev before committing to a config._

### Does the Apache Iceberg Kafka Connect sink support upserts and deletes from Debezium CDC events?

No, the Apache Iceberg Kafka Connect sink only appends records; it dropped the CDC and upsert-mode features from the original Tabular connector, and a request to add them back was closed as not planned. A Debezium update or delete event lands as a new appended row rather than mutating existing data, so use it for an append-only bronze layer and route to Flink or Debezium Server Iceberg when you need a current-state table.

_Engineers choosing an Iceberg sink for CDC can weigh options like these on daily.dev before locking in an architecture._

## Similar posts on daily.dev

- [Implementing real-time change data capture with Debezium for Amazon Aurora PostgreSQL and Amazon RDS for PostgreSQL](https://daily.dev/posts/implementing-real-time-change-data-capture-with-debezium-for-amazon-aurora-postgresql-and-amazon-rds-wwimwgweo) · AWS Database Blog · 0 upvotes · 0 comments
- [Building Kafka-Less Data Integration Pipelines with Debezium](https://daily.dev/posts/building-kafka-less-data-integration-pipelines-with-debezium-5yi0fimdi) · Debezium · 1 upvotes · 0 comments
- [Approaches to Streaming Data into Apache Iceberg Tables](https://daily.dev/posts/approaches-to-streaming-data-into-apache-iceberg-tables-7z4y6jfd7) · Dremio Blog · 0 upvotes · 0 comments
- [Pinterest’s CDC-Powered Ingestion Slashes Database Latency from 24 Hours to 15 Minutes](https://daily.dev/posts/pinterest-s-cdc-powered-ingestion-slashes-database-latency-from-24-hours-to-15-minutes-yxa7rq7qv) · InfoQ · 5 upvotes · 0 comments

---

Tags: [#postgresql](https://daily.dev/tags/postgresql), [#apache-kafka](https://daily.dev/tags/apache-kafka), [#apache-iceberg](https://daily.dev/tags/apache-iceberg), [#change-data-capture](https://daily.dev/tags/change-data-capture), [#debezium](https://daily.dev/tags/debezium)

[View this post on daily.dev](https://daily.dev/posts/debezium-in-production-postgresql-to-kafka-to-iceberg-cdc-patterns-that-actually-work-43qqjunc0)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Debezium in Production: PostgreSQL to Kafka to Iceberg CDC Patterns That Actually Work","url":"https://daily.dev/posts/debezium-in-production-postgresql-to-kafka-to-iceberg-cdc-patterns-that-actually-work-43qqjunc0","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/debezium-in-production-postgresql-to-kafka-to-iceberg-cdc-patterns-that-actually-work-43qqjunc0"},"datePublished":"2026-08-24T14:24:17.900Z","dateModified":"2026-09-14T08:46:24.725Z","description":"A production-focused deep-dive into running Debezium for PostgreSQL to Kafka to Iceberg change data capture pipelines. It covers logical decoding with...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/9955ad2507ad88aafd0e86892b75eeff?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/9955ad2507ad88aafd0e86892b75eeff?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"BigData Boutique blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"BigData Boutique blog","logo":"https://media.daily.dev/image/upload/s--3BDyon-q--/f_auto/v1717941801/logos/bigdataboutique","url":"https://daily.dev/sources/bigdataboutique"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/debezium-in-production-postgresql-to-kafka-to-iceberg-cdc-patterns-that-actually-work-43qqjunc0","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":3},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"postgresql,apache-kafka,apache-iceberg,change-data-capture,debezium","timeRequired":"PT18M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"BigData Boutique blog","item":"https://daily.dev/sources/bigdataboutique"},{"@type":"ListItem","position":3,"name":"Debezium in Production: PostgreSQL to Kafka to Iceberg CDC Patterns That Actually Work"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/debezium-in-production-postgresql-to-kafka-to-iceberg-cdc-patterns-that-actually-work-43qqjunc0#faq","mainEntity":[{"@type":"Question","name":"Why does my PostgreSQL disk fill up when using a Debezium replication slot?","acceptedAnswer":{"@type":"Answer","text":"A replication slot prevents PostgreSQL from recycling any WAL segment its consumer has not yet confirmed, so when Debezium stops consuming (a crashed connector, network partition, or Kafka outage), the primary retains every WAL segment generated since, growing without bound until the disk fills and PostgreSQL stops accepting writes. Track replication slot pitfalls like this on daily.dev before they cause an outage in your CDC pipeline."}},{"@type":"Question","name":"Which Debezium PostgreSQL plugin should I use, pgoutput or decoderbufs?","acceptedAnswer":{"@type":"Answer","text":"Use pgoutput. It ships inside PostgreSQL 10 and later, is maintained by the Postgres community with nothing extra to install, and is the only option supported by managed services like RDS and Cloud SQL, whereas decoderbufs is a Debezium-maintained Protobuf plugin requiring a native extension compiled onto the server. Set plugin.name explicitly since the property still defaults to decoderbufs. Developers picking CDC connector settings can compare tradeoffs like this on daily.dev before committing to a config."}},{"@type":"Question","name":"Does the Apache Iceberg Kafka Connect sink support upserts and deletes from Debezium CDC events?","acceptedAnswer":{"@type":"Answer","text":"No, the Apache Iceberg Kafka Connect sink only appends records; it dropped the CDC and upsert-mode features from the original Tabular connector, and a request to add them back was closed as not planned. A Debezium update or delete event lands as a new appended row rather than mutating existing data, so use it for an append-only bronze layer and route to Flink or Debezium Server Iceberg when you need a current-state table. Engineers choosing an Iceberg sink for CDC can weigh options like these on daily.dev before locking in an architecture."}}]}
```

