mirror of
https://github.com/postgrespro/pg_probackup.git
synced 2025-01-05 13:20:31 +02:00
PBCKP-36: Create recovery.conf if --latest specified
This commit is contained in:
parent
1ff905989e
commit
d87149c68f
@ -123,7 +123,7 @@ help_pg_probackup(void)
|
||||
|
||||
printf(_("\n %s restore -B backup-path --instance=instance_name\n"), PROGRAM_NAME);
|
||||
printf(_(" [-D pgdata-path] [-i backup-id] [-j num-threads]\n"));
|
||||
printf(_(" [--time=time|--xid=xid|--lsn=lsn [--inclusive=boolean]]\n"));
|
||||
printf(_(" [--time=time|--xid=xid|--lsn=lsn|--latest [--inclusive=boolean]]\n"));
|
||||
printf(_(" [--timeline=timeline] [-T OLDDIR=NEWDIR] [--progress]\n"));
|
||||
printf(_(" [--external-mapping=OLDDIR=NEWDIR]\n"));
|
||||
printf(_(" [--immediate] [--recovery-target-name=target-name]\n"));
|
||||
@ -292,7 +292,7 @@ help_restore(void)
|
||||
{
|
||||
printf(_("%s restore -B backup-path --instance=instance_name\n"), PROGRAM_NAME);
|
||||
printf(_(" [-D pgdata-path] [-i backup-id] [-j num-threads] [--progress]\n"));
|
||||
printf(_(" [--time=time|--xid=xid|--lsn=lsn [--inclusive=boolean]]\n"));
|
||||
printf(_(" [--time=time|--xid=xid|--lsn=lsn|--latest [--inclusive=boolean]]\n"));
|
||||
printf(_(" [--timeline=timeline] [-T OLDDIR=NEWDIR]\n"));
|
||||
printf(_(" [--external-mapping=OLDDIR=NEWDIR]\n"));
|
||||
printf(_(" [--immediate] [--recovery-target-name=target-name]\n"));
|
||||
@ -312,7 +312,8 @@ help_restore(void)
|
||||
printf(_(" --time=time time stamp up to which recovery will proceed\n"));
|
||||
printf(_(" --xid=xid transaction ID up to which recovery will proceed\n"));
|
||||
printf(_(" --lsn=lsn LSN of the write-ahead log location up to which recovery will proceed\n"));
|
||||
printf(_(" --inclusive=boolean whether we stop just after the recovery target\n"));
|
||||
printf(_(" --lsn=lsn LSN of the write-ahead log location up to which recovery will proceed\n"));
|
||||
printf(_(" --latest recovery into a latest possible state\n"));
|
||||
printf(_(" --timeline=timeline recovering into a particular timeline\n"));
|
||||
printf(_(" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"));
|
||||
printf(_(" relocate the tablespace from directory OLDDIR to NEWDIR\n"));
|
||||
|
@ -81,6 +81,7 @@ static TimeLineID target_tli;
|
||||
static bool target_immediate;
|
||||
static char *target_name = NULL;
|
||||
static char *target_action = NULL;
|
||||
static bool target_latest = false;
|
||||
|
||||
static pgRecoveryTarget *recovery_target_options = NULL;
|
||||
|
||||
@ -152,6 +153,7 @@ static ConfigOption cmd_options[] =
|
||||
{ 's', 137, "xid", &target_xid, SOURCE_CMD_STRICT },
|
||||
{ 's', 138, "inclusive", &target_inclusive, SOURCE_CMD_STRICT },
|
||||
{ 'u', 139, "timeline", &target_tli, SOURCE_CMD_STRICT },
|
||||
{ 'b', 157, "latest", &target_latest, SOURCE_CMD_STRICT },
|
||||
{ 'f', 'T', "tablespace-mapping", opt_tablespace_map, SOURCE_CMD_STRICT },
|
||||
{ 'f', 155, "external-mapping", opt_externaldir_map, SOURCE_CMD_STRICT },
|
||||
{ 'b', 140, "immediate", &target_immediate, SOURCE_CMD_STRICT },
|
||||
@ -474,7 +476,8 @@ main(int argc, char *argv[])
|
||||
/* parse all recovery target options into recovery_target_options structure */
|
||||
recovery_target_options = parseRecoveryTargetOptions(target_time, target_xid,
|
||||
target_inclusive, target_tli, target_lsn, target_immediate,
|
||||
target_name, target_action, restore_no_validate);
|
||||
target_name, target_action, restore_no_validate,
|
||||
target_latest);
|
||||
}
|
||||
|
||||
if (num_threads < 1)
|
||||
|
@ -292,6 +292,7 @@ typedef struct pgRecoveryTarget
|
||||
const char *recovery_target_name;
|
||||
const char *recovery_target_action;
|
||||
bool restore_no_validate;
|
||||
bool latest;
|
||||
} pgRecoveryTarget;
|
||||
|
||||
typedef struct
|
||||
@ -427,7 +428,7 @@ extern pgRecoveryTarget *parseRecoveryTargetOptions(
|
||||
const char *target_time, const char *target_xid,
|
||||
const char *target_inclusive, TimeLineID target_tli, const char* target_lsn,
|
||||
bool target_immediate, const char *target_name,
|
||||
const char *target_action, bool restore_no_validate);
|
||||
const char *target_action, bool restore_no_validate, bool latest);
|
||||
|
||||
/* in merge.c */
|
||||
extern void do_merge(time_t backup_id);
|
||||
|
@ -769,11 +769,11 @@ create_recovery_conf(time_t backup_id,
|
||||
{
|
||||
char path[MAXPGPATH];
|
||||
FILE *fp;
|
||||
bool need_restore_conf = false;
|
||||
bool need_restore_conf;
|
||||
|
||||
if (!backup->stream
|
||||
|| (rt->time_specified || rt->xid_specified))
|
||||
need_restore_conf = true;
|
||||
need_restore_conf = !backup->stream ||
|
||||
(rt->time_specified || rt->xid_specified || rt->lsn_specified) ||
|
||||
rt->latest;
|
||||
|
||||
/* No need to generate recovery.conf at all. */
|
||||
if (!(need_restore_conf || restore_as_replica))
|
||||
@ -993,7 +993,7 @@ parseRecoveryTargetOptions(const char *target_time,
|
||||
bool target_immediate,
|
||||
const char *target_name,
|
||||
const char *target_action,
|
||||
bool restore_no_validate)
|
||||
bool restore_no_validate, bool latest)
|
||||
{
|
||||
time_t dummy_time;
|
||||
TransactionId dummy_xid;
|
||||
@ -1085,6 +1085,8 @@ parseRecoveryTargetOptions(const char *target_time,
|
||||
rt->restore_no_validate = restore_no_validate;
|
||||
}
|
||||
|
||||
rt->latest = latest;
|
||||
|
||||
if (target_name)
|
||||
{
|
||||
recovery_target_specified++;
|
||||
|
@ -39,7 +39,7 @@ pg_probackup - utility to manage backup/recovery of PostgreSQL database.
|
||||
[--log-directory=log-directory]
|
||||
[--log-rotation-size=log-rotation-size]
|
||||
[--log-rotation-age=log-rotation-age]
|
||||
[--delete-expired] [--delete-wal]
|
||||
[--delete-expired] [--delete-wal] [--merge-expired]
|
||||
[--retention-redundancy=retention-redundancy]
|
||||
[--retention-window=retention-window]
|
||||
[--compress]
|
||||
@ -51,16 +51,19 @@ pg_probackup - utility to manage backup/recovery of PostgreSQL database.
|
||||
[--master-port=port] [--master-user=user_name]
|
||||
[--replica-timeout=timeout]
|
||||
[--skip-block-validation]
|
||||
[--external-dirs=external-directory-path]
|
||||
|
||||
pg_probackup restore -B backup-path --instance=instance_name
|
||||
[-D pgdata-path] [-i backup-id] [--progress]
|
||||
[--time=time|--xid=xid|--lsn=lsn [--inclusive=boolean]]
|
||||
[--timeline=timeline] [-T OLDDIR=NEWDIR]
|
||||
[-D pgdata-path] [-i backup-id] [-j num-threads]
|
||||
[--time=time|--xid=xid|--lsn=lsn|--latest [--inclusive=boolean]]
|
||||
[--timeline=timeline] [-T OLDDIR=NEWDIR] [--progress]
|
||||
[--external-mapping=OLDDIR=NEWDIR]
|
||||
[--immediate] [--recovery-target-name=target-name]
|
||||
[--recovery-target-action=pause|promote|shutdown]
|
||||
[--restore-as-replica]
|
||||
[--no-validate]
|
||||
[--skip-block-validation]
|
||||
[--skip-external-dirs]
|
||||
|
||||
pg_probackup validate -B backup-path [--instance=instance_name]
|
||||
[-i backup-id] [--progress] [-j num-threads]
|
||||
@ -74,10 +77,11 @@ pg_probackup - utility to manage backup/recovery of PostgreSQL database.
|
||||
[--format=format]
|
||||
|
||||
pg_probackup delete -B backup-path --instance=instance_name
|
||||
[--wal] [-i backup-id | --expired]
|
||||
[--wal] [-i backup-id | --expired | --merge-expired]
|
||||
[--dry-run]
|
||||
|
||||
pg_probackup merge -B backup-path --instance=instance_name
|
||||
-i backup-id
|
||||
-i backup-id [--progress] [-j num-threads]
|
||||
|
||||
pg_probackup add-instance -B backup-path -D pgdata-path
|
||||
--instance=instance_name
|
||||
|
@ -95,7 +95,7 @@ class OptionTest(ProbackupTest, unittest.TestCase):
|
||||
repr(self.output), self.cmd))
|
||||
except ProbackupException as e:
|
||||
self.assertEqual(e.message,
|
||||
'ERROR: You must specify at least one of the delete options: --expired |--wal |--backup_id\n',
|
||||
'ERROR: You must specify at least one of the delete options: --expired |--wal |--merge-expired |--delete-invalid |--backup_id\n',
|
||||
'\n Unexpected Error Message: {0}\n CMD: {1}'.format(repr(e.message), self.cmd))
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user