Fix stale visibility maps in incremental backups after heap truncation

An incremental backup taken after VACUUM truncates a table can restore
stale visibility map bits when both data checksums and wal_log_hints are
disabled. If the restored table grows again, the stale bits can cause
VACUUM to skip required freezing and advance relfrozenxid past unfrozen
tuples, or cause index-only scans to return deleted rows.

Heap truncation clears bits for removed heap pages in the last remaining
VM page. With both settings disabled, that page is not separately
WAL-logged. The WAL summarizer records the VM truncation limit but does
not mark the remaining page as modified, allowing incremental backups
to reuse its old contents. The truncation record precedes the incremental
backup's start LSN, so recovery does not replay it to clear those bits.

Fix this by marking the last remaining VM page as modified when
summarizing a truncation record, so incremental backups include its
current contents. Do this conservatively even when truncation falls on
a VM page boundary and the remaining page does not need to change.

Note that existing WAL summaries are not regenerated by this fix.
Incremental backups taken after updating can therefore still be affected
if they use summaries generated before the fix. Take a new full backup
from an uncorrupted server after updating and use it as the basis for
subsequent incremental backups. This does not repair existing backups
or corruption already present in a restored database.

Backpatch to PostgreSQL 17, where incremental backup was introduced.

Bug: #19775
Author: Ke <[email protected]>
Co-authored-by: Fujii Masao <[email protected]>
Co-authored-by: Shihao Zhong <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Discussion: 
https://postgr.es/m/cagrkxqsnghf+wbyp-pdfjvlfbejjg3cvzd9hn-gxsvcwj2f...@mail.gmail.com
Backpatch-through: 17

Branch
------
REL_18_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/41b4b8e8bf1a07ce4fbfa86b8e544299e1a706cf

Modified Files
--------------
src/backend/postmaster/walsummarizer.c          | 19 +++++-
src/bin/pg_combinebackup/meson.build            |  1 +
src/bin/pg_combinebackup/t/014_vm_truncation.pl | 85 +++++++++++++++++++++++++
3 files changed, 103 insertions(+), 2 deletions(-)

Reply via email to