[PostgreSQL] Logical Replication에서 큰 텍스트 컬럼이 누락되는 문제

[원본 링크]

관련 포스트
https://blog.naver.com/sssang97/223926531588
만약 PostgreSQL에 CDC를 걸어서 쓴다면 WAL 기반의 복제를 기본적으로 쓸텐데, 그럴 때 생길 수 있는 문제점 중 하나다.

PostgreSQL은 INSERT나 UPDATE가 발생하면, 거의 모든 컬럼의 값을 WAL에 기록한다.
가령, 매우 일부의 값을 수정하더라도 항상 전체 값을 WAL을 기록한다. MVCC 기반의 버전관리 시스템을 쓰기 때문이다.

여기에도 예외가 있는데, 특정 컬럼의 크기가 매우 크다면 그건 WAL에 기록되지 않고 별도의 영역에 기록된다.
이걸 TOAST라고 부르는데, 보통 2K나 수십K가 되면 별도로 빠지는게 기본값이다.

근데 문제는 그렇게 빠지면, WAL Replication 전송에서도 그 필드에 대한 값 전송이 빠진다는 것이다.

모든 값이 크기에 상관없이 전송되길 원한다면, 다음 쿼리를 사용해서 특정 테이블에 대한 제한을 해제해야 한다.

ALTER TABLE [table_name] REPLICA IDENTITY FULL;

다만 이러면 PostgreSQL에서 쓰기 부하나 읽기 부하가 증가할 수 있으므로, 일반적으로 권장되는 옵션은 아니다.

가능하다면 애플리케이션 수준에서 값이 안와도 기존 상태 기반으로 UPDATE하는 식으로 구현하는 것이 좋을 것이다.



참조
https://www.postgresql.org/docs/current/logical-replication-publication.html
https://stackoverflow.com/questions/67977581/is-alter-table-mytable-replica-identity-full-a-safe-operation-for-a-high-volu