1
0
mirror of https://github.com/postgrespro/pg_probackup.git synced 2025-01-24 11:46:31 +02:00

partial_restore_type as separate type

This commit is contained in:
Grigory Smolkin 2019-08-11 13:54:43 +03:00
parent 454eeac8f8
commit 0ae5a66bfb
4 changed files with 36 additions and 12 deletions

View File

@ -609,6 +609,7 @@ main(int argc, char *argv[])
restore_params->skip_block_validation = skip_block_validation; restore_params->skip_block_validation = skip_block_validation;
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;
/* handle partial restore parameters */ /* handle partial restore parameters */
if (datname_exclude_list && datname_include_list) if (datname_exclude_list && datname_include_list)
@ -616,16 +617,21 @@ main(int argc, char *argv[])
if (datname_exclude_list) if (datname_exclude_list)
{ {
restore_params->is_include_list = false; restore_params->partial_restore_type = EXCLUDE;
restore_params->partial_db_list = datname_exclude_list; restore_params->partial_db_list = datname_exclude_list;
} }
else if (datname_include_list) else if (datname_include_list)
{ {
restore_params->is_include_list = true; restore_params->partial_restore_type = INCLUDE;
restore_params->partial_db_list = datname_include_list; restore_params->partial_db_list = datname_include_list;
} }
} }
/* sanity */
if (backup_subcmd == VALIDATE_CMD && restore_params->no_validate)
elog(ERROR, "You cannot specify \"--no-validate\" option with the \"%s\" command",
command_name);
if (num_threads < 1) if (num_threads < 1)
num_threads = 1; num_threads = 1;
@ -663,8 +669,15 @@ main(int argc, char *argv[])
restore_params); restore_params);
case VALIDATE_CMD: case VALIDATE_CMD:
if (current.backup_id == 0 && target_time == 0 && target_xid == 0 && !target_lsn) if (current.backup_id == 0 && target_time == 0 && target_xid == 0 && !target_lsn)
{
/* sanity */
if (datname_exclude_list || datname_include_list)
elog(ERROR, "You must specify parameter (-i, --backup-id) for partial validation");
return do_validate_all(); return do_validate_all();
}
else else
/* PITR validation and, optionally, partial validation */
return do_restore_or_validate(current.backup_id, return do_restore_or_validate(current.backup_id,
recovery_target_options, recovery_target_options,
restore_params); restore_params);
@ -797,7 +810,10 @@ opt_datname_include_list(ConfigOption *opt, const char *arg)
dbname = pgut_malloc(strlen(arg) + 1); dbname = pgut_malloc(strlen(arg) + 1);
/* TODO add sanity for database name */ if (strcmp(dbname, "tempate0") == 0 ||
strcmp(dbname, "tempate1") == 0)
elog(ERROR, "Databases 'template0' and 'template1' cannot be used for partial restore or validation");
strcpy(dbname, arg); strcpy(dbname, arg);
parray_append(datname_include_list, dbname); parray_append(datname_include_list, dbname);

View File

@ -91,6 +91,13 @@ typedef struct db_map_entry
char *datname; char *datname;
} db_map_entry; } db_map_entry;
typedef enum PartialRestoreType
{
NONE,
INCLUDE,
EXCLUDE,
} PartialRestoreType;
typedef enum CompressAlg typedef enum CompressAlg
{ {
NOT_DEFINED_COMPRESS = 0, NOT_DEFINED_COMPRESS = 0,
@ -348,7 +355,7 @@ typedef struct pgRestoreParams
bool skip_block_validation; bool skip_block_validation;
/* options for partial restore */ /* options for partial restore */
bool is_include_list; PartialRestoreType partial_restore_type;
parray *partial_db_list; parray *partial_db_list;
} pgRestoreParams; } pgRestoreParams;
@ -512,8 +519,9 @@ extern pgRecoveryTarget *parseRecoveryTargetOptions(
const char *target_inclusive, TimeLineID target_tli, const char* target_lsn, const char *target_inclusive, TimeLineID target_tli, const char* target_lsn,
const char *target_stop, const char *target_name, const char *target_stop, const char *target_name,
const char *target_action); const char *target_action);
extern parray *get_dbOid_exclude_list(pgBackup *backup, parray *files, extern parray *get_dbOid_exclude_list(pgBackup *backup, parray *files,
parray *datname_list, bool partial_restore_type); parray *datname_list, PartialRestoreType partial_restore_type);
/* in merge.c */ /* in merge.c */
extern void do_merge(time_t backup_id); extern void do_merge(time_t backup_id);

View File

@ -459,7 +459,7 @@ do_restore_or_validate(time_t target_backup_id, pgRecoveryTarget *rt,
*/ */
if (params->partial_db_list) if (params->partial_db_list)
dbOid_exclude_list = get_dbOid_exclude_list(dest_backup, dest_files, params->partial_db_list, dbOid_exclude_list = get_dbOid_exclude_list(dest_backup, dest_files, params->partial_db_list,
params->is_include_list); params->partial_restore_type);
/* /*
* Restore dest_backup internal directories. * Restore dest_backup internal directories.
@ -1183,7 +1183,7 @@ parseRecoveryTargetOptions(const char *target_time,
*/ */
parray * parray *
get_dbOid_exclude_list(pgBackup *backup, parray *files, get_dbOid_exclude_list(pgBackup *backup, parray *files,
parray *datname_list, bool is_include_list) parray *datname_list, PartialRestoreType partial_restore_type)
{ {
int i; int i;
int j; int j;
@ -1233,9 +1233,9 @@ get_dbOid_exclude_list(pgBackup *backup, parray *files,
* So we have a list of datnames and a database_map for it. * So we have a list of datnames and a database_map for it.
* We must construct a list of dbOids to exclude. * We must construct a list of dbOids to exclude.
*/ */
if (is_include_list) if (partial_restore_type == INCLUDE)
{ {
/* For 'include' keep dbOid of every datname NOT specified by user */ /* For 'include', keep dbOid of every datname NOT specified by user */
for (i = 0; i < parray_num(datname_list); i++) for (i = 0; i < parray_num(datname_list); i++)
{ {
bool found_match = false; bool found_match = false;
@ -1270,9 +1270,9 @@ get_dbOid_exclude_list(pgBackup *backup, parray *files,
parray_append(dbOid_exclude_list, &db_entry->dbOid); parray_append(dbOid_exclude_list, &db_entry->dbOid);
} }
} }
else else if (partial_restore_type == EXCLUDE)
{ {
/* For exclude job is easier, find dbOid for every specified datname */ /* For exclude, job is easier - find dbOid for every specified datname */
for (i = 0; i < parray_num(datname_list); i++) for (i = 0; i < parray_num(datname_list); i++)
{ {
bool found_match = false; bool found_match = false;

View File

@ -109,7 +109,7 @@ pgBackupValidate(pgBackup *backup, pgRestoreParams *params)
if (params && params->partial_db_list) if (params && params->partial_db_list)
dbOid_exclude_list = get_dbOid_exclude_list(backup, files, params->partial_db_list, dbOid_exclude_list = get_dbOid_exclude_list(backup, files, params->partial_db_list,
params->is_include_list); params->partial_restore_type);
/* setup threads */ /* setup threads */
for (i = 0; i < parray_num(files); i++) for (i = 0; i < parray_num(files); i++)