Skip to content

Commit 7b342e3

Browse files
committed
Merge branch 'issue_171'
2 parents 1102e57 + d42e720 commit 7b342e3

File tree

5 files changed

+82
-6
lines changed

5 files changed

+82
-6
lines changed

doc/pgprobackup.xml

+23-4
Original file line numberDiff line numberDiff line change
@@ -1634,13 +1634,14 @@ pg_probackup restore -B <replaceable>backup_dir</replaceable> --instance <replac
16341634
<para>
16351635
If you restore <link linkend="pbk-archive-mode">ARCHIVE</link> backups,
16361636
perform <link linkend="pbk-performing-point-in-time-pitr-recovery">PITR</link>,
1637-
or specify the <literal>--restore-as-replica</literal> option with the
1637+
or specify the <literal>--restore-as-replica</literal> flag with the
16381638
<literal>restore</literal> command to set up a standby server,
16391639
<application>pg_probackup</application> creates a recovery configuration
16401640
file once all data files are copied into the target directory. This file
16411641
includes the minimal settings required for recovery, except for the password in the
16421642
<ulink url="https://postgrespro.com/docs/postgresql/current/runtime-config-replication.html#GUC-PRIMARY-CONNINFO">primary_conninfo</ulink>
1643-
parameter; you have to add the password manually, if required.
1643+
parameter; you have to add the password manually or use
1644+
the <literal>--primary-conninfo</literal> option, if required.
16441645
For <productname>PostgreSQL</productname> 11 or lower,
16451646
recovery settings are written into the <filename>recovery.conf</filename>
16461647
file. Starting from <productname>PostgreSQL</productname> 12,
@@ -3605,8 +3606,11 @@ pg_probackup restore -B <replaceable>backup_dir</replaceable> --instance <replac
36053606
[--help] [-D <replaceable>data_dir</replaceable>] [-i <replaceable>backup_id</replaceable>]
36063607
[-j <replaceable>num_threads</replaceable>] [--progress]
36073608
[-T <replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable>] [--external-mapping=<replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable>] [--skip-external-dirs]
3608-
[-R | --restore-as-replica] [--no-validate] [--skip-block-validation] [--force]
3609-
[--restore-command=<replaceable>cmdline</replaceable>] [--no-sync]
3609+
[-R | --restore-as-replica] [--no-validate] [--skip-block-validation]
3610+
[--force] [--no-sync]
3611+
[--restore-command=<replaceable>cmdline</replaceable>]
3612+
[--restore-command=<replaceable>cmdline</replaceable>]
3613+
[--primary-conninfo=<replaceable>primary_conninfo</replaceable>]
36103614
[<replaceable>recovery_target_options</replaceable>] [<replaceable>logging_options</replaceable>] [<replaceable>remote_options</replaceable>]
36113615
[<replaceable>partial_restore_options</replaceable>] [<replaceable>remote_wal_archive_options</replaceable>]
36123616
</programlisting>
@@ -3644,6 +3648,21 @@ pg_probackup restore -B <replaceable>backup_dir</replaceable> --instance <replac
36443648
</listitem>
36453649
</varlistentry>
36463650

3651+
<varlistentry>
3652+
<term><option>--primary-conninfo=<replaceable>primary_conninfo</replaceable></option></term>
3653+
<listitem>
3654+
<para>
3655+
Sets the
3656+
<ulink url="https://postgrespro.com/docs/postgresql/current/runtime-config-replication.html#GUC-PRIMARY-CONNINFO">primary_conninfo</ulink>
3657+
parameter to the specified value.
3658+
This option will be ignored unless the <option>-R</option> flag if specified.
3659+
</para>
3660+
<para>
3661+
Example: <literal>--primary-conninfo='host=192.168.1.50 port=5432 user=foo password=foopass'</literal>
3662+
</para>
3663+
</listitem>
3664+
</varlistentry>
3665+
36473666
<varlistentry>
36483667
<term><option>-T <replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable></option></term>
36493668
<term><option>--tablespace-mapping=<replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable></option></term>

src/pg_probackup.c

+4
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ static bool target_immediate;
9090
static char *target_name = NULL;
9191
static char *target_action = NULL;
9292

93+
static char *primary_conninfo = NULL;
94+
9395
static pgRecoveryTarget *recovery_target_options = NULL;
9496
static pgRestoreParams *restore_params = NULL;
9597

@@ -192,6 +194,7 @@ static ConfigOption cmd_options[] =
192194
{ 'b', 156, "skip-external-dirs", &skip_external_dirs, SOURCE_CMD_STRICT },
193195
{ 'f', 158, "db-include", opt_datname_include_list, SOURCE_CMD_STRICT },
194196
{ 'f', 159, "db-exclude", opt_datname_exclude_list, SOURCE_CMD_STRICT },
197+
{ 's', 160, "primary-conninfo", &primary_conninfo, SOURCE_CMD_STRICT },
195198
/* checkdb options */
196199
{ 'b', 195, "amcheck", &need_amcheck, SOURCE_CMD_STRICT },
197200
{ 'b', 196, "heapallindexed", &heapallindexed, SOURCE_CMD_STRICT },
@@ -686,6 +689,7 @@ main(int argc, char *argv[])
686689
restore_params->skip_external_dirs = skip_external_dirs;
687690
restore_params->partial_db_list = NULL;
688691
restore_params->partial_restore_type = NONE;
692+
restore_params->primary_conninfo = primary_conninfo;
689693

690694
/* handle partial restore parameters */
691695
if (datname_exclude_list && datname_include_list)

src/pg_probackup.h

+1
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@ typedef struct pgRestoreParams
423423
/* options for partial restore */
424424
PartialRestoreType partial_restore_type;
425425
parray *partial_db_list;
426+
const char *primary_conninfo;
426427
} pgRestoreParams;
427428

428429
/* Options needed for set-backup command */

src/restore.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -1059,7 +1059,9 @@ create_recovery_conf(time_t backup_id,
10591059
fio_fprintf(fp, "standby_mode = 'on'\n");
10601060
#endif
10611061

1062-
if (backup->primary_conninfo)
1062+
if (params->primary_conninfo)
1063+
fio_fprintf(fp, "primary_conninfo = '%s'\n", params->primary_conninfo);
1064+
else if (backup->primary_conninfo)
10631065
fio_fprintf(fp, "primary_conninfo = '%s'\n", backup->primary_conninfo);
10641066
}
10651067

tests/restore.py

+51-1
Original file line numberDiff line numberDiff line change
@@ -3376,4 +3376,54 @@ def test_stream_restore_command_option(self):
33763376
self.assertEqual('2', timeline_id)
33773377

33783378
# Clean after yourself
3379-
self.del_test_dir(module_name, fname)
3379+
self.del_test_dir(module_name, fname)
3380+
3381+
# @unittest.skip("skip")
3382+
def test_restore_primary_conninfo(self):
3383+
"""
3384+
"""
3385+
fname = self.id().split('.')[3]
3386+
node = self.make_simple_node(
3387+
base_dir=os.path.join(module_name, fname, 'node'),
3388+
set_replication=True,
3389+
initdb_params=['--data-checksums'])
3390+
3391+
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
3392+
self.init_pb(backup_dir)
3393+
self.add_instance(backup_dir, 'node', node)
3394+
node.slow_start()
3395+
3396+
# Take FULL
3397+
self.backup_node(backup_dir, 'node', node, options=['--stream'])
3398+
3399+
node.pgbench_init(scale=1)
3400+
3401+
#primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass'
3402+
3403+
replica = self.make_simple_node(
3404+
base_dir=os.path.join(module_name, fname, 'replica'))
3405+
replica.cleanup()
3406+
str_conninfo='host=192.168.1.50 port=5432 user=foo password=foopass'
3407+
3408+
self.restore_node(
3409+
backup_dir, 'node', replica,
3410+
options=['-R', '--primary-conninfo={0}'.format(str_conninfo)])
3411+
3412+
if self.get_version(node) >= self.version_to_num('12.0'):
3413+
standby_signal = os.path.join(replica.data_dir, 'standby.signal')
3414+
self.assertTrue(
3415+
os.path.isfile(standby_signal),
3416+
"File '{0}' do not exists".format(standby_signal))
3417+
3418+
if self.get_version(node) >= self.version_to_num('12.0'):
3419+
recovery_conf = os.path.join(replica.data_dir, 'probackup_recovery.conf')
3420+
else:
3421+
recovery_conf = os.path.join(replica.data_dir, 'recovery.conf')
3422+
3423+
with open(os.path.join(replica.data_dir, recovery_conf), 'r') as f:
3424+
recovery_conf_content = f.read()
3425+
3426+
self.assertIn(str_conninfo, recovery_conf_content)
3427+
3428+
# Clean after yourself
3429+
self.del_test_dir(module_name, fname)

0 commit comments

Comments
 (0)