diff options
| author | Robert Haas | 2024-03-04 18:33:12 +0000 |
|---|---|---|
| committer | Robert Haas | 2024-03-04 18:33:28 +0000 |
| commit | d75c4027b6f260f2045b162017567aeeb909b056 (patch) | |
| tree | 35488e90b82274595b76e1484b2b582d7b779cba /src/bin | |
| parent | cb6945dc8061d03e6ec670a6856228f12e94264c (diff) | |
Fix incremental backup interaction with XLOG_DBASE_CREATE_FILE_COPY.
After XLOG_DBASE_CREATE_FILE_COPY, a correct incremental backup needs
to copy in full everything with the database and tablespace OID
mentioned in that record; but that record doesn't specifically mention
the blocks, or even the relfilenumbers, of the affected relations.
As a result, we were failing to copy data that we should have copied.
To fix, enter the DB OID and tablespace OID into the block reference
table with relfilenumber 0 and limit block 0; and treat that as a
limit block of 0 for every relfilenumber whose DB OID and tablespace
OID match.
Also, add a test case.
Patch by me, reviewed by Noah Misch.
Discussion: http://postgr.es/m/CA+Tgmob0xa=ByvGLMdAgkUZyVQE=r4nyYZ_VEa40FCfEDFnTKA@mail.gmail.com
Diffstat (limited to 'src/bin')
| -rw-r--r-- | src/bin/pg_combinebackup/meson.build | 1 | ||||
| -rw-r--r-- | src/bin/pg_combinebackup/t/006_db_file_copy.pl | 58 |
2 files changed, 59 insertions, 0 deletions
diff --git a/src/bin/pg_combinebackup/meson.build b/src/bin/pg_combinebackup/meson.build index 30dbbaa6cfa..1d4b9c218fd 100644 --- a/src/bin/pg_combinebackup/meson.build +++ b/src/bin/pg_combinebackup/meson.build @@ -33,6 +33,7 @@ tests += { 't/003_timeline.pl', 't/004_manifest.pl', 't/005_integrity.pl', + 't/006_db_file_copy.pl', ], } } diff --git a/src/bin/pg_combinebackup/t/006_db_file_copy.pl b/src/bin/pg_combinebackup/t/006_db_file_copy.pl new file mode 100644 index 00000000000..24f55449c63 --- /dev/null +++ b/src/bin/pg_combinebackup/t/006_db_file_copy.pl @@ -0,0 +1,58 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use File::Compare; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Set up a new database instance. +my $primary = PostgreSQL::Test::Cluster->new('primary'); +$primary->init(has_archiving => 1, allows_streaming => 1); +$primary->append_conf('postgresql.conf', 'summarize_wal = on'); +$primary->start; + +# Initial setup. +$primary->safe_psql('postgres', <<EOM); +CREATE DATABASE lakh OID = 100000 STRATEGY = FILE_COPY +EOM +$primary->safe_psql('lakh', <<EOM); +CREATE TABLE t1 (a int) +EOM + +# Take a full backup. +my $backup1path = $primary->backup_dir . '/backup1'; +$primary->command_ok( + [ 'pg_basebackup', '-D', $backup1path, '--no-sync', '-cfast' ], + "full backup"); + +# Now make some database changes. +$primary->safe_psql('postgres', <<EOM); +DROP DATABASE lakh; +CREATE DATABASE lakh OID = 100000 STRATEGY = FILE_COPY +EOM + +# Take an incremental backup. +my $backup2path = $primary->backup_dir . '/backup2'; +$primary->command_ok( + [ 'pg_basebackup', '-D', $backup2path, '--no-sync', '-cfast', + '--incremental', $backup1path . '/backup_manifest' ], + "incremental backup"); + +# Recover the incremental backup. +my $restore = PostgreSQL::Test::Cluster->new('restore'); +$restore->init_from_backup($primary, 'backup2', + combine_with_prior => [ 'backup1' ]); +$restore->start(); + +# Query the DB. +my $stdout; +my $stderr; +$restore->psql('lakh', 'SELECT * FROM t1', + stdout => \$stdout, stderr => \$stderr); +is($stdout, '', 'SELECT * FROM t1: no stdout'); +like($stderr, qr/relation "t1" does not exist/, + 'SELECT * FROM t1: stderr missing table'); + +done_testing(); |
