Hi, I am doing some testing on pg_basebackup and pg_combinebackup patches. I have also tried to create tap test for pg_combinebackup by taking reference from pg_basebackup tap cases. Attaching first draft test patch.
I have done some testing with compression options, both -z and -Z level is working with incremental backup. A minor comment : It is mentioned in pg_combinebackup help that maximum 10 incremental backup can be given with -i option, but I found maximum 9 incremental backup directories can be given at a time. Thanks & Regards, Rajkumar Raghuwanshi QMG, EnterpriseDB Corporation On Thu, Aug 29, 2019 at 10:06 PM Jeevan Ladhe <jeevan.la...@enterprisedb.com> wrote: > Due to the inherent nature of pg_basebackup, the incremental backup also > allows taking backup in tar and compressed format. But, pg_combinebackup > does not understand how to restore this. I think we should either make > pg_combinebackup support restoration of tar incremental backup or restrict > taking the incremental backup in tar format until pg_combinebackup > supports the restoration by making option '--lsn' and '-Ft' exclusive. > > It is arguable that one can take the incremental backup in tar format, > extract > that manually and then give the resultant directory as input to the > pg_combinebackup, but I think that kills the purpose of having > pg_combinebackup utility. > > Thoughts? > > Regards, > Jeevan Ladhe >
diff --git a/src/bin/pg_combinebackup/t/pg_combinebackup.pl b/src/bin/pg_combinebackup/t/pg_combinebackup.pl new file mode 100644 index 0000000..e0f834a --- /dev/null +++ b/src/bin/pg_combinebackup/t/pg_combinebackup.pl @@ -0,0 +1,79 @@ +use strict; +use warnings; +use Cwd; +use Config; +use File::Basename qw(basename dirname); +use File::Path qw(rmtree); +use PostgresNode; +use TestLib; +use Test::More tests => 23; + +program_help_ok('pg_combinebackup'); +program_version_ok('pg_combinebackup'); +program_options_handling_ok('pg_combinebackup'); + +my $tempdir = TestLib::tempdir; + +my $node = get_new_node('main'); + +# Initialize node +$node->init(); +my $pgdata = $node->data_dir; + +# Change wal related setting for pg_basebackup to run +open my $conf, '>>', "$pgdata/postgresql.conf"; +print $conf "max_replication_slots = 10\n"; +print $conf "max_wal_senders = 10\n"; +print $conf "wal_level = replica\n"; +close $conf; +$node->start; + +$node->command_fails(['pg_combinebackup'], + 'pg_combinebackup needs full and incremental directory specified'); + +# Create an unlogged table to test that forks other than init are not copied. +$node->safe_psql('postgres', 'CREATE UNLOGGED TABLE base_unlogged (id int)'); + +my $baseUnloggedPath = $node->safe_psql('postgres', + q{select pg_relation_filepath('base_unlogged')}); + +# Make sure main and init forks exist +ok(-f "$pgdata/${baseUnloggedPath}_init", 'unlogged init fork in base'); +ok(-f "$pgdata/$baseUnloggedPath", 'unlogged main fork in base'); + +# Run full base backup. +$node->command_ok([ 'pg_basebackup', '-D', "$tempdir/backup"], + 'pg_basebackup runs for full backup'); +ok(-f "$tempdir/backup/PG_VERSION", 'full backup was created'); + +# Unlogged relation forks other than init should not be copied +ok(-f "$tempdir/backup/${baseUnloggedPath}_init", + 'unlogged init fork in backup'); +ok( !-f "$tempdir/backup/$baseUnloggedPath", + 'unlogged main fork not in backup'); + +# Get LSN of last backup to use for incremental backupslurp_file +my @extract_lsn = split (" ", scalar TestLib::slurp_file("$tempdir/backup/backup_label")); +my $LSN = $extract_lsn[3]; + +# Run incr base backup. +$node->command_ok([ 'pg_basebackup', '-D', "$tempdir/backup1",'--lsn', "$LSN"], + 'pg_basebackup runs for incremental backup'); +ok(-f "$tempdir/backup1/PG_VERSION", 'incremental backup was created'); + +# Unlogged relation forks other than init should not be copied +ok(-f "$tempdir/backup1/${baseUnloggedPath}_init", + 'unlogged init fork in backup'); +ok( !-f "$tempdir/backup1/$baseUnloggedPath", + 'unlogged main fork not in backup'); + +# Run pg_combinebackup. +$node->command_ok([ 'pg_combinebackup', '-f', "$tempdir/backup", '-i', "$tempdir/backup1", '-o', "$tempdir/backup2"], + 'pg_combinebackup runs'); +ok(-f "$tempdir/backup2/PG_VERSION", 'combined backup was created'); + +# Unlogged relation forks other than init should not be copied +ok(-f "$tempdir/backup2/${baseUnloggedPath}_init", + 'unlogged init fork in backup'); +ok( !-f "$tempdir/backup2/$baseUnloggedPath", + 'unlogged main fork not in backup');