From e9af50464bca8be625bc425bcf48737f0e0b13e1 Mon Sep 17 00:00:00 2001 From: Victor Spirin Date: Thu, 20 Feb 2020 15:23:04 +0300 Subject: [PATCH 1/4] Added --primary-conninfo option for restoring as replica --- src/pg_probackup.c | 4 ++++ src/pg_probackup.h | 1 + src/restore.c | 8 ++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/pg_probackup.c b/src/pg_probackup.c index a39a4bbf..4956bac1 100644 --- a/src/pg_probackup.c +++ b/src/pg_probackup.c @@ -90,6 +90,8 @@ static bool target_immediate; static char *target_name = NULL; static char *target_action = NULL; +static char *primary_conninfo = NULL; + static pgRecoveryTarget *recovery_target_options = NULL; static pgRestoreParams *restore_params = NULL; @@ -191,6 +193,7 @@ static ConfigOption cmd_options[] = { 'b', 156, "skip-external-dirs", &skip_external_dirs, SOURCE_CMD_STRICT }, { 'f', 158, "db-include", opt_datname_include_list, SOURCE_CMD_STRICT }, { 'f', 159, "db-exclude", opt_datname_exclude_list, SOURCE_CMD_STRICT }, + { 's', 160, "primary-conninfo", &primary_conninfo, SOURCE_CMD_STRICT }, /* checkdb options */ { 'b', 195, "amcheck", &need_amcheck, SOURCE_CMD_STRICT }, { 'b', 196, "heapallindexed", &heapallindexed, SOURCE_CMD_STRICT }, @@ -675,6 +678,7 @@ main(int argc, char *argv[]) restore_params->skip_external_dirs = skip_external_dirs; restore_params->partial_db_list = NULL; restore_params->partial_restore_type = NONE; + restore_params->primary_conninfo = primary_conninfo; /* handle partial restore parameters */ if (datname_exclude_list && datname_include_list) diff --git a/src/pg_probackup.h b/src/pg_probackup.h index 6fbd7773..c2cf55df 100644 --- a/src/pg_probackup.h +++ b/src/pg_probackup.h @@ -423,6 +423,7 @@ typedef struct pgRestoreParams /* options for partial restore */ PartialRestoreType partial_restore_type; parray *partial_db_list; + const char *primary_conninfo; } pgRestoreParams; /* Options needed for set-backup command */ diff --git a/src/restore.c b/src/restore.c index c25a4711..edb15bb6 100644 --- a/src/restore.c +++ b/src/restore.c @@ -1069,8 +1069,12 @@ create_recovery_conf(time_t backup_id, fio_fprintf(fp, "standby_mode = 'on'\n"); #endif - if (backup->primary_conninfo) - fio_fprintf(fp, "primary_conninfo = '%s'\n", backup->primary_conninfo); + if(params->primary_conninfo) + fio_fprintf(fp, "primary_conninfo = '%s'\n", params->primary_conninfo); + else{ + if (backup->primary_conninfo) + fio_fprintf(fp, "primary_conninfo = '%s'\n", backup->primary_conninfo); + } } if (pitr_requested) From 6f1ba680abfd56514936020a96451fb0624fe011 Mon Sep 17 00:00:00 2001 From: Grigory Smolkin Date: Sun, 23 Feb 2020 22:04:01 +0300 Subject: [PATCH 2/4] [Issue #171] minor fixes --- src/restore.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/restore.c b/src/restore.c index 391741d6..583279a4 100644 --- a/src/restore.c +++ b/src/restore.c @@ -1056,12 +1056,10 @@ create_recovery_conf(time_t backup_id, fio_fprintf(fp, "standby_mode = 'on'\n"); #endif - if(params->primary_conninfo) + if (params->primary_conninfo) fio_fprintf(fp, "primary_conninfo = '%s'\n", params->primary_conninfo); - else{ - if (backup->primary_conninfo) - fio_fprintf(fp, "primary_conninfo = '%s'\n", backup->primary_conninfo); - } + else if (backup->primary_conninfo) + fio_fprintf(fp, "primary_conninfo = '%s'\n", backup->primary_conninfo); } if (pitr_requested) From d46e96b808864df2d48786e23d73b57730126186 Mon Sep 17 00:00:00 2001 From: Grigory Smolkin Date: Sun, 23 Feb 2020 22:04:14 +0300 Subject: [PATCH 3/4] [Issue #171] test coverage --- tests/restore.py | 52 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/tests/restore.py b/tests/restore.py index 93b28c80..54b6d44e 100644 --- a/tests/restore.py +++ b/tests/restore.py @@ -3376,4 +3376,54 @@ class RestoreTest(ProbackupTest, unittest.TestCase): self.assertEqual('2', timeline_id) # Clean after yourself - self.del_test_dir(module_name, fname) \ No newline at end of file + self.del_test_dir(module_name, fname) + + # @unittest.skip("skip") + def test_restore_primary_conninfo(self): + """ + """ + fname = self.id().split('.')[3] + node = self.make_simple_node( + base_dir=os.path.join(module_name, fname, 'node'), + set_replication=True, + initdb_params=['--data-checksums']) + + backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup') + self.init_pb(backup_dir) + self.add_instance(backup_dir, 'node', node) + node.slow_start() + + # Take FULL + self.backup_node(backup_dir, 'node', node, options=['--stream']) + + node.pgbench_init(scale=1) + + #primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass' + + replica = self.make_simple_node( + base_dir=os.path.join(module_name, fname, 'replica')) + replica.cleanup() + str_conninfo='host=192.168.1.50 port=5432 user=foo password=foopass' + + self.restore_node( + backup_dir, 'node', replica, + options=['-R', '--primary-conninfo={0}'.format(str_conninfo)]) + + if self.get_version(node) >= self.version_to_num('12.0'): + standby_signal = os.path.join(replica.data_dir, 'standby.signal') + self.assertTrue( + os.path.isfile(standby_signal), + "File '{0}' do not exists".format(standby_signal)) + + if self.get_version(node) >= self.version_to_num('12.0'): + recovery_conf = os.path.join(replica.data_dir, 'probackup_recovery.conf') + else: + recovery_conf = os.path.join(replica.data_dir, 'recovery.conf') + + with open(os.path.join(replica.data_dir, recovery_conf), 'r') as f: + recovery_conf_content = f.read() + + self.assertIn(str_conninfo, recovery_conf_content) + + # Clean after yourself + self.del_test_dir(module_name, fname) From d42e72016c9fcd0db00dafa7951a33bb2dc340f1 Mon Sep 17 00:00:00 2001 From: Grigory Smolkin Date: Sun, 23 Feb 2020 22:51:58 +0300 Subject: [PATCH 4/4] [Issue #171] documentation --- doc/pgprobackup.xml | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/doc/pgprobackup.xml b/doc/pgprobackup.xml index fe5109e6..26ce99c9 100644 --- a/doc/pgprobackup.xml +++ b/doc/pgprobackup.xml @@ -1634,13 +1634,14 @@ pg_probackup restore -B backup_dir --instance If you restore ARCHIVE backups, perform PITR, - or specify the --restore-as-replica option with the + or specify the --restore-as-replica flag with the restore command to set up a standby server, pg_probackup creates a recovery configuration file once all data files are copied into the target directory. This file includes the minimal settings required for recovery, except for the password in the primary_conninfo - parameter; you have to add the password manually, if required. + parameter; you have to add the password manually or use + the --primary-conninfo option, if required. For PostgreSQL 11 or lower, recovery settings are written into the recovery.conf file. Starting from PostgreSQL 12, @@ -3584,6 +3585,7 @@ pg_probackup restore -B backup_dir --instance OLDDIR=NEWDIR] [--external-mapping=OLDDIR=NEWDIR] [--skip-external-dirs] [-R | --restore-as-replica] [--no-validate] [--skip-block-validation] [--force] [--restore-command=cmdline] +[--primary-conninfo=primary_conninfo] [recovery_target_options] [logging_options] [remote_options] [partial_restore_options] [remote_wal_archive_options] @@ -3621,6 +3623,21 @@ pg_probackup restore -B backup_dir --instance + + + + + Sets the + primary_conninfo + parameter to the specified value. + This option will be ignored if used without the flag. + + + Example: --primary-conninfo='host=192.168.1.50 port=5432 user=foo password=foopass' + + + +