Em tabela particionada, o decoding lógico emite as mudanças da partição folha.
É o REPLICA IDENTITY dela que conta — o do parent nunca é lido. E ALTER no
parent não propaga:
CREATE TABLE t (id bigint, created_at timestamp, PRIMARY KEY (id, created_at))
PARTITION BY RANGE (created_at);
CREATE TABLE t_p1 PARTITION OF t FOR VALUES FROM ('2026-01-01') TO ('2027-01-01');
ALTER TABLE t REPLICA IDENTITY FULL;
-- t -> f
-- t_p1 -> d partição existente: não cascateou
CREATE TABLE t_p2 PARTITION OF t FOR VALUES FROM ('2027-01-01') TO ('2028-01-01');
-- t_p2 -> d partição nova: não herdou
Partição nasce em DEFAULT e fica lá. Para replicação, o ALTER no parent é um
no-op silencioso.
Isso morde no CDC. O AWS DMS avisa que não suporta REPLICA IDENTITY FULL quando o
endpoint usa o plugin pglogical — e, de fato, os UPDATE não chegam no destino.
Se as folhas estão em FULL, olhar o parent não denuncia nada: o valor dele é
independente do que o decoding enxerga.
O fix é uma linha por partição:
ALTER TABLE t_p1 REPLICA IDENTITY DEFAULT; -- passa a usar a PK
ALTER TABLE t_p2 REPLICA IDENTITY DEFAULT;
Só de catálogo: sem rewrite, milissegundos, independente do tamanho da tabela.
Conferir depois — sempre nas folhas, nunca no parent:
SELECT c.relname,
CASE c.relreplident WHEN 'd' THEN 'DEFAULT' WHEN 'f' THEN 'FULL'
WHEN 'n' THEN 'NOTHING' WHEN 'i' THEN 'INDEX' END AS ri
FROM pg_inherits i
JOIN pg_class c ON c.oid = i.inhrelid
WHERE i.inhparent = 't'::regclass
ORDER BY c.relname;
DEFAULT usa a primary key — e como a chave de partição precisa fazer parte da PK,
ela já está lá.