1
0
mirror of https://github.com/postgrespro/pg_probackup.git synced 2025-02-03 14:01:57 +02:00

Merge branch 'issue_171'

This commit is contained in:
Grigory Smolkin 2020-03-06 02:31:35 +03:00
commit 7b342e3946
5 changed files with 82 additions and 6 deletions

View File

@ -1634,13 +1634,14 @@ pg_probackup restore -B <replaceable>backup_dir</replaceable> --instance <replac
<para> <para>
If you restore <link linkend="pbk-archive-mode">ARCHIVE</link> backups, If you restore <link linkend="pbk-archive-mode">ARCHIVE</link> backups,
perform <link linkend="pbk-performing-point-in-time-pitr-recovery">PITR</link>, perform <link linkend="pbk-performing-point-in-time-pitr-recovery">PITR</link>,
or specify the <literal>--restore-as-replica</literal> option with the or specify the <literal>--restore-as-replica</literal> flag with the
<literal>restore</literal> command to set up a standby server, <literal>restore</literal> command to set up a standby server,
<application>pg_probackup</application> creates a recovery configuration <application>pg_probackup</application> creates a recovery configuration
file once all data files are copied into the target directory. This file 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 includes the minimal settings required for recovery, except for the password in the
<ulink url="https://postgrespro.com/docs/postgresql/current/runtime-config-replication.html#GUC-PRIMARY-CONNINFO">primary_conninfo</ulink> <ulink url="https://postgrespro.com/docs/postgresql/current/runtime-config-replication.html#GUC-PRIMARY-CONNINFO">primary_conninfo</ulink>
parameter; you have to add the password manually, if required. parameter; you have to add the password manually or use
the <literal>--primary-conninfo</literal> option, if required.
For <productname>PostgreSQL</productname> 11 or lower, For <productname>PostgreSQL</productname> 11 or lower,
recovery settings are written into the <filename>recovery.conf</filename> recovery settings are written into the <filename>recovery.conf</filename>
file. Starting from <productname>PostgreSQL</productname> 12, file. Starting from <productname>PostgreSQL</productname> 12,
@ -3605,8 +3606,11 @@ pg_probackup restore -B <replaceable>backup_dir</replaceable> --instance <replac
[--help] [-D <replaceable>data_dir</replaceable>] [-i <replaceable>backup_id</replaceable>] [--help] [-D <replaceable>data_dir</replaceable>] [-i <replaceable>backup_id</replaceable>]
[-j <replaceable>num_threads</replaceable>] [--progress] [-j <replaceable>num_threads</replaceable>] [--progress]
[-T <replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable>] [--external-mapping=<replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable>] [--skip-external-dirs] [-T <replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable>] [--external-mapping=<replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable>] [--skip-external-dirs]
[-R | --restore-as-replica] [--no-validate] [--skip-block-validation] [--force] [-R | --restore-as-replica] [--no-validate] [--skip-block-validation]
[--restore-command=<replaceable>cmdline</replaceable>] [--no-sync] [--force] [--no-sync]
[--restore-command=<replaceable>cmdline</replaceable>]
[--restore-command=<replaceable>cmdline</replaceable>]
[--primary-conninfo=<replaceable>primary_conninfo</replaceable>]
[<replaceable>recovery_target_options</replaceable>] [<replaceable>logging_options</replaceable>] [<replaceable>remote_options</replaceable>] [<replaceable>recovery_target_options</replaceable>] [<replaceable>logging_options</replaceable>] [<replaceable>remote_options</replaceable>]
[<replaceable>partial_restore_options</replaceable>] [<replaceable>remote_wal_archive_options</replaceable>] [<replaceable>partial_restore_options</replaceable>] [<replaceable>remote_wal_archive_options</replaceable>]
</programlisting> </programlisting>
@ -3644,6 +3648,21 @@ pg_probackup restore -B <replaceable>backup_dir</replaceable> --instance <replac
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><option>--primary-conninfo=<replaceable>primary_conninfo</replaceable></option></term>
<listitem>
<para>
Sets the
<ulink url="https://postgrespro.com/docs/postgresql/current/runtime-config-replication.html#GUC-PRIMARY-CONNINFO">primary_conninfo</ulink>
parameter to the specified value.
This option will be ignored unless the <option>-R</option> flag if specified.
</para>
<para>
Example: <literal>--primary-conninfo='host=192.168.1.50 port=5432 user=foo password=foopass'</literal>
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><option>-T <replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable></option></term> <term><option>-T <replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable></option></term>
<term><option>--tablespace-mapping=<replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable></option></term> <term><option>--tablespace-mapping=<replaceable>OLDDIR</replaceable>=<replaceable>NEWDIR</replaceable></option></term>

View File

@ -90,6 +90,8 @@ static bool target_immediate;
static char *target_name = NULL; static char *target_name = NULL;
static char *target_action = NULL; static char *target_action = NULL;
static char *primary_conninfo = NULL;
static pgRecoveryTarget *recovery_target_options = NULL; static pgRecoveryTarget *recovery_target_options = NULL;
static pgRestoreParams *restore_params = NULL; static pgRestoreParams *restore_params = NULL;
@ -192,6 +194,7 @@ static ConfigOption cmd_options[] =
{ 'b', 156, "skip-external-dirs", &skip_external_dirs, SOURCE_CMD_STRICT }, { 'b', 156, "skip-external-dirs", &skip_external_dirs, SOURCE_CMD_STRICT },
{ 'f', 158, "db-include", opt_datname_include_list, 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 }, { 'f', 159, "db-exclude", opt_datname_exclude_list, SOURCE_CMD_STRICT },
{ 's', 160, "primary-conninfo", &primary_conninfo, SOURCE_CMD_STRICT },
/* checkdb options */ /* checkdb options */
{ 'b', 195, "amcheck", &need_amcheck, SOURCE_CMD_STRICT }, { 'b', 195, "amcheck", &need_amcheck, SOURCE_CMD_STRICT },
{ 'b', 196, "heapallindexed", &heapallindexed, SOURCE_CMD_STRICT }, { 'b', 196, "heapallindexed", &heapallindexed, SOURCE_CMD_STRICT },
@ -686,6 +689,7 @@ main(int argc, char *argv[])
restore_params->skip_external_dirs = skip_external_dirs; restore_params->skip_external_dirs = skip_external_dirs;
restore_params->partial_db_list = NULL; restore_params->partial_db_list = NULL;
restore_params->partial_restore_type = NONE; restore_params->partial_restore_type = NONE;
restore_params->primary_conninfo = primary_conninfo;
/* handle partial restore parameters */ /* handle partial restore parameters */
if (datname_exclude_list && datname_include_list) if (datname_exclude_list && datname_include_list)

View File

@ -423,6 +423,7 @@ typedef struct pgRestoreParams
/* options for partial restore */ /* options for partial restore */
PartialRestoreType partial_restore_type; PartialRestoreType partial_restore_type;
parray *partial_db_list; parray *partial_db_list;
const char *primary_conninfo;
} pgRestoreParams; } pgRestoreParams;
/* Options needed for set-backup command */ /* Options needed for set-backup command */

View File

@ -1059,7 +1059,9 @@ create_recovery_conf(time_t backup_id,
fio_fprintf(fp, "standby_mode = 'on'\n"); fio_fprintf(fp, "standby_mode = 'on'\n");
#endif #endif
if (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); fio_fprintf(fp, "primary_conninfo = '%s'\n", backup->primary_conninfo);
} }

View File

@ -3376,4 +3376,54 @@ class RestoreTest(ProbackupTest, unittest.TestCase):
self.assertEqual('2', timeline_id) self.assertEqual('2', timeline_id)
# Clean after yourself # Clean after yourself
self.del_test_dir(module_name, fname) 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)