mirror of
https://github.com/postgrespro/pg_probackup.git
synced 2026-06-21 01:34:15 +02:00
implement partial validate. add db-include and db-exclude options to validate command
This commit is contained in:
+1
-1
@@ -778,7 +778,7 @@ do_backup(time_t start_time, bool no_validate)
|
||||
write_backup(¤t);
|
||||
|
||||
if (!no_validate)
|
||||
pgBackupValidate(¤t);
|
||||
pgBackupValidate(¤t, NULL);
|
||||
|
||||
/* Notify user about backup size */
|
||||
pretty_size(current.data_bytes, pretty_data_bytes, lengthof(pretty_data_bytes));
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user