implement partial validate. add db-include and db-exclude options to validate command

This commit is contained in:
Anastasia
2019-08-08 17:55:23 +03:00
parent f36d81dc08
commit 6179808d23
6 changed files with 34 additions and 12 deletions
+1 -1
View File
@@ -778,7 +778,7 @@ do_backup(time_t start_time, bool no_validate)
write_backup(&current);
if (!no_validate)
pgBackupValidate(&current);
pgBackupValidate(&current, NULL);
/* Notify user about backup size */
pretty_size(current.data_bytes, pretty_data_bytes, lengthof(pretty_data_bytes));
+7
View File
@@ -359,6 +359,7 @@ help_restore(void)
printf(_(" [-T OLDDIR=NEWDIR] [--progress]\n"));
printf(_(" [--external-mapping=OLDDIR=NEWDIR]\n"));
printf(_(" [--skip-external-dirs]\n"));
printf(_(" [--db-include dbname | --db-exclude dbname]\n"));
printf(_(" [--remote-proto] [--remote-host]\n"));
printf(_(" [--remote-port] [--remote-path] [--remote-user]\n"));
printf(_(" [--ssh-options]\n\n"));
@@ -396,6 +397,8 @@ help_restore(void)
printf(_(" --external-mapping=OLDDIR=NEWDIR\n"));
printf(_(" relocate the external directory from OLDDIR to NEWDIR\n"));
printf(_(" --skip-external-dirs do not restore all external directories\n"));
printf(_(" --db-include dbname restore only specified databases\n"));
printf(_(" --db-exclude dbname do not restore specified databases\n"));
printf(_("\n Logging options:\n"));
printf(_(" --log-level-console=log-level-console\n"));
@@ -440,6 +443,7 @@ help_validate(void)
printf(_(" [--recovery-target-timeline=timeline]\n"));
printf(_(" [--recovery-target-name=target-name]\n"));
printf(_(" [--skip-block-validation]\n\n"));
printf(_(" [--db-include dbname | --db-exclude dbname]\n"));
printf(_(" -B, --backup-path=backup-path location of the backup storage area\n"));
printf(_(" --instance=instance_name name of the instance\n"));
@@ -458,6 +462,9 @@ help_validate(void)
printf(_(" the named restore point to which recovery will proceed\n"));
printf(_(" --skip-block-validation set to validate only file-level checksum\n"));
printf(_(" --db-include dbname restore only specified databases\n"));
printf(_(" --db-exclude dbname do not restore specified databases\n"));
printf(_("\n Logging options:\n"));
printf(_(" --log-level-console=log-level-console\n"));
printf(_(" level for console logging (default: info)\n"));
+3 -3
View File
@@ -146,7 +146,7 @@ do_merge(time_t backup_id)
merge_backups(full_backup, from_backup);
}
pgBackupValidate(full_backup);
pgBackupValidate(full_backup, NULL);
if (full_backup->status == BACKUP_STATUS_CORRUPT)
elog(ERROR, "Merging of backup %s failed", base36enc(backup_id));
@@ -198,7 +198,7 @@ merge_backups(pgBackup *to_backup, pgBackup *from_backup)
if (to_backup->status == BACKUP_STATUS_OK ||
to_backup->status == BACKUP_STATUS_DONE)
{
pgBackupValidate(to_backup);
pgBackupValidate(to_backup, NULL);
if (to_backup->status == BACKUP_STATUS_CORRUPT)
elog(ERROR, "Interrupt merging");
}
@@ -211,7 +211,7 @@ merge_backups(pgBackup *to_backup, pgBackup *from_backup)
from_backup->status == BACKUP_STATUS_DONE ||
from_backup->status == BACKUP_STATUS_MERGING ||
from_backup->status == BACKUP_STATUS_DELETING);
pgBackupValidate(from_backup);
pgBackupValidate(from_backup, NULL);
if (from_backup->status == BACKUP_STATUS_CORRUPT)
elog(ERROR, "Interrupt merging");
+3 -1
View File
@@ -512,6 +512,8 @@ extern pgRecoveryTarget *parseRecoveryTargetOptions(
const char *target_inclusive, TimeLineID target_tli, const char* target_lsn,
const char *target_stop, const char *target_name,
const char *target_action);
extern parray *get_dbOid_exclude_list(pgBackup *backup, parray *files,
parray *datname_list, bool partial_restore_type);
/* in merge.c */
extern void do_merge(time_t backup_id);
@@ -556,7 +558,7 @@ extern void help_pg_probackup(void);
extern void help_command(char *command);
/* in validate.c */
extern void pgBackupValidate(pgBackup* backup);
extern void pgBackupValidate(pgBackup* backup, pgRestoreParams *params);
extern int do_validate_all(void);
/* in catalog.c */
+1 -4
View File
@@ -44,9 +44,6 @@ static void create_recovery_conf(time_t backup_id,
pgRestoreParams *params);
static parray *read_timeline_history(TimeLineID targetTLI);
static void *restore_files(void *arg);
static parray *get_dbOid_exclude_list(pgBackup *backup, parray *files,
parray *datname_list, bool partial_restore_type);
static void set_orphan_status(parray *backups, pgBackup *parent_backup);
/*
@@ -376,7 +373,7 @@ do_restore_or_validate(time_t target_backup_id, pgRecoveryTarget *rt,
}
}
pgBackupValidate(tmp_backup);
pgBackupValidate(tmp_backup, params);
/* After pgBackupValidate() only following backup
* states are possible: ERROR, RUNNING, CORRUPT and OK.
* Validate WAL only for OK, because there is no point
+19 -3
View File
@@ -30,6 +30,7 @@ typedef struct
uint32 checksum_version;
uint32 backup_version;
BackupMode backup_mode;
parray *dbOid_exclude_list;
/*
* Return value from the thread.
@@ -42,7 +43,7 @@ typedef struct
* Validate backup files.
*/
void
pgBackupValidate(pgBackup *backup)
pgBackupValidate(pgBackup *backup, pgRestoreParams *params)
{
char base_path[MAXPGPATH];
char external_prefix[MAXPGPATH];
@@ -54,6 +55,7 @@ pgBackupValidate(pgBackup *backup)
pthread_t *threads;
validate_files_arg *threads_args;
int i;
parray *dbOid_exclude_list = NULL;
/* Check backup version */
if (parse_program_version(backup->program_version) > parse_program_version(PROGRAM_VERSION))
@@ -105,6 +107,10 @@ pgBackupValidate(pgBackup *backup)
pgBackupGetPath(backup, path, lengthof(path), DATABASE_FILE_LIST);
files = dir_read_file_list(base_path, external_prefix, path, FIO_BACKUP_HOST);
if (params && params->partial_db_list)
dbOid_exclude_list = get_dbOid_exclude_list(backup, files, params->partial_db_list,
params->is_include_list);
/* setup threads */
for (i = 0; i < parray_num(files); i++)
{
@@ -130,6 +136,7 @@ pgBackupValidate(pgBackup *backup)
arg->stop_lsn = backup->stop_lsn;
arg->checksum_version = backup->checksum_version;
arg->backup_version = parse_program_version(backup->program_version);
arg->dbOid_exclude_list = dbOid_exclude_list;
/* By default there are some error */
threads_args[i].ret = 1;
@@ -193,6 +200,15 @@ pgBackupValidateFiles(void *arg)
if (!S_ISREG(file->mode))
continue;
/*
* If in partial validate, check if the file belongs to the database
* we exclude. Only files from pgdata can be skipped.
*/
if (arguments->dbOid_exclude_list && file->external_dir_num == 0
&& parray_bsearch(arguments->dbOid_exclude_list,
&file->dbOid, pgCompareOid))
continue;
/*
* Currently we don't compute checksums for
* cfs_compressed data files, so skip them.
@@ -498,7 +514,7 @@ do_validate_instance(void)
continue;
}
/* Valiate backup files*/
pgBackupValidate(current_backup);
pgBackupValidate(current_backup, NULL);
/* Validate corresponding WAL files */
if (current_backup->status == BACKUP_STATUS_OK)
@@ -593,7 +609,7 @@ do_validate_instance(void)
continue;
}
/* Revalidate backup files*/
pgBackupValidate(backup);
pgBackupValidate(backup, NULL);
if (backup->status == BACKUP_STATUS_OK)
{