tchivs created FLINK-38221:
------------------------------
Summary: PostgreSQL CDC fails to capture data from partition
tables when configured with parent table names
Key: FLINK-38221
URL: https://issues.apache.org/jira/browse/FLINK-38221
Project: Flink
Issue Type: Bug
Components: Flink CDC
Affects Versions: cdc-3.4.0
Environment: PostgreSQL CDC with partitioned tables
Reporter: tchivs
Fix For: cdc-3.5.0
h2. Problem Description
h3. Critical Data Loss Bug
PostgreSQL CDC connector completely fails to capture any changelog data when
users configure partition tables using standard parent table names. This is a
*critical data loss bug* affecting production deployments.
h3. Reproduction Steps
# *Create a partitioned table in PostgreSQL:*
{{CREATE TABLE aia_t_icc_jjdb (
id BIGINT,
name VARCHAR(255),
partition_date DATE NOT NULL,
PRIMARY KEY (id, partition_date)
) PARTITION BY RANGE (partition_date);
CREATE TABLE aia_t_icc_jjdb_202401 PARTITION OF aia_t_icc_jjdb
FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');}}
# *Configure Flink CDC with parent table name:*
{{source:
type: postgres-cdc
hostname: localhost
port: 5432
username: postgres
password: password
database-name: testdb
schema-name: public
table-name: aia_t_icc_jjdb # Parent partition table}}
# *Insert data into the partition table:*
{{INSERT INTO aia_t_icc_jjdb (id, name, partition_date)
VALUES (1, 'test', '2024-01-15');}}
h3. Expected Behavior
* CDC should discover the parent partition table {{aia_t_icc_jjdb}}
* CDC should capture INSERT/UPDATE/DELETE operations on the partition table
* Changelog events should be emitted for data changes
h3. Actual Behavior
* *NO CDC data is captured* - complete data loss
* Parent partition table {{aia_t_icc_jjdb}} is filtered out during table
discovery
* CDC connector runs without errors but produces zero changelog events
* Users receive no indication that the table configuration is ineffective
h2. Root Cause Analysis
h3. Technical Root Cause
The issue is in {{TableDiscoveryUtils.java}} line 55-56:
{{Set<TableId> allTableIds = jdbc.readTableNames(
database, null, null, new String[] \{"TABLE"}); // Missing "PARTITIONED
TABLE"}}
h3. PostgreSQL Partition Table Structure
* {*}Parent partition tables{*}: {{pg_class.relkind = 'p'}} (partitioned table)
* {*}Child partition tables{*}: {{pg_class.relkind = 'r'}} (regular table)
* {*}Table discovery query{*}: Only looks for {{tabletype = 'TABLE'}}
* {*}Problem{*}: Parent partitions need {{tabletype = 'PARTITIONED TABLE'}} to
be discovered
h3. Discovery Failure Chain
# User configures {{table-name: "aia_t_icc_jjdb"}} (parent partition)
# TableDiscoveryUtils queries {{pg_tables WHERE tabletype IN ('TABLE')}}
# Parent partition table not found (it's type 'PARTITIONED TABLE')
# Table filter excludes the configured table name
# Result: Zero CDC data captured
h2. Current User Workarounds (and their problems)
h3. Workaround 1: Regex Pattern Matching
{{table-name: "aia_t_icc_jjdb_\\d\{6}" # Match child partitions}}
*Problems:*
* Extremely slow initialization (loads schema for every child partition)
* Complex configuration requiring internal partition naming knowledge
* Error-prone and maintenance-intensive
* Breaks when partition naming changes
h3. Workaround 2: List All Child Partitions
{{table-name: "aia_t_icc_jjdb_202401,aia_t_icc_jjdb_202402,..."}}
*Problems:*
* Manual maintenance required for new partitions
* Configuration becomes unmanageable with many partitions
* Still slower than parent table approach
h2. Impact Assessment
h3. Severity: Critical
* {*}Data Loss{*}: Complete CDC data loss for partition tables
* {*}Silent Failure{*}: No obvious error messages, difficult to diagnose
* {*}Production Impact{*}: Affects real-time data pipelines using partition
tables
* {*}User Experience{*}: Forces complex, error-prone configurations
h3. Affected Scenarios
* Any PostgreSQL CDC deployment using partitioned tables
* Range partitioned tables (most common use case)
* List partitioned tables
* Hash partitioned tables
* Multi-level partition hierarchies
h3. Business Impact
* Real-time analytics miss partition table data changes
* Data synchronization failures in production
* Increased operational complexity due to workarounds
* Potential compliance issues due to incomplete data capture
h2. Proposed Solution
h3. Core Fix
Enhance {{TableDiscoveryUtils.java}} to include partitioned tables:
{{Set<TableId> allTableIds = jdbc.readTableNames(
database, null, null, new String[] \{"TABLE", "PARTITIONED TABLE"});}}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)