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