@@ -46,6 +46,7 @@ static char *target_xid;
46
46
static char * target_inclusive ;
47
47
static TimeLineID target_tli ;
48
48
static bool is_hard_copy = false;
49
+ static bool backup_validate = false;
49
50
50
51
/* show configuration */
51
52
static bool show_all = false;
@@ -56,33 +57,34 @@ static void parse_range(pgBackupRange *range, const char *arg1, const char *arg2
56
57
static pgut_option options [] =
57
58
{
58
59
/* directory options */
59
- { 's' , 'D' , "pgdata" , & pgdata , SOURCE_ENV },
60
- { 's' , 'A' , "arclog-path" , & arclog_path , SOURCE_ENV },
61
- { 's' , 'B' , "backup-path" , & backup_path , SOURCE_ENV },
62
- { 's' , 'S' , "srvlog-path" , & srvlog_path , SOURCE_ENV },
60
+ { 's' , 'D' , "pgdata" , & pgdata , SOURCE_ENV },
61
+ { 's' , 'A' , "arclog-path" , & arclog_path , SOURCE_ENV },
62
+ { 's' , 'B' , "backup-path" , & backup_path , SOURCE_ENV },
63
+ { 's' , 'S' , "srvlog-path" , & srvlog_path , SOURCE_ENV },
63
64
/* common options */
64
- { 'b' , 'v' , "verbose" , & verbose },
65
- { 'b' , 'c' , "check" , & check },
65
+ { 'b' , 'v' , "verbose" , & verbose },
66
+ { 'b' , 'c' , "check" , & check },
66
67
/* backup options */
67
- { 'f' , 'b' , "backup-mode" , opt_backup_mode , SOURCE_ENV },
68
- { 'b' , 's' , "with-serverlog" , & current .with_serverlog , SOURCE_ENV },
69
- { 'b' , 'Z' , "compress-data" , & current .compress_data , SOURCE_ENV },
70
- { 'b' , 'C' , "smooth-checkpoint" , & smooth_checkpoint , SOURCE_ENV },
68
+ { 'f' , 'b' , "backup-mode" , opt_backup_mode , SOURCE_ENV },
69
+ { 'b' , 's' , "with-serverlog" , & current .with_serverlog , SOURCE_ENV },
70
+ { 'b' , 'Z' , "compress-data" , & current .compress_data , SOURCE_ENV },
71
+ { 'b' , 'C' , "smooth-checkpoint" , & smooth_checkpoint , SOURCE_ENV },
71
72
/* options with only long name (keep-xxx) */
72
- { 'i' , 1 , "keep-data-generations" , & keep_data_generations , SOURCE_ENV },
73
- { 'i' , 2 , "keep-data-days" , & keep_data_days , SOURCE_ENV },
74
- { 'i' , 3 , "keep-arclog-files" , & keep_arclog_files , SOURCE_ENV },
75
- { 'i' , 4 , "keep-arclog-days" , & keep_arclog_days , SOURCE_ENV },
76
- { 'i' , 5 , "keep-srvlog-files" , & keep_srvlog_files , SOURCE_ENV },
77
- { 'i' , 6 , "keep-srvlog-days" , & keep_srvlog_days , SOURCE_ENV },
73
+ { 'i' , 1 , "keep-data-generations" , & keep_data_generations , SOURCE_ENV },
74
+ { 'i' , 2 , "keep-data-days" , & keep_data_days , SOURCE_ENV },
75
+ { 'i' , 3 , "keep-arclog-files" , & keep_arclog_files , SOURCE_ENV },
76
+ { 'i' , 4 , "keep-arclog-days" , & keep_arclog_days , SOURCE_ENV },
77
+ { 'i' , 5 , "keep-srvlog-files" , & keep_srvlog_files , SOURCE_ENV },
78
+ { 'i' , 6 , "keep-srvlog-days" , & keep_srvlog_days , SOURCE_ENV },
78
79
/* restore options */
79
- { 's' , 7 , "recovery-target-time" , & target_time , SOURCE_ENV },
80
- { 's' , 8 , "recovery-target-xid" , & target_xid , SOURCE_ENV },
81
- { 's' , 9 , "recovery-target-inclusive" , & target_inclusive , SOURCE_ENV },
82
- { 'u' , 10 , "recovery-target-timeline" , & target_tli , SOURCE_ENV },
83
- { 'b' , 11 , "hard-copy" , & is_hard_copy , SOURCE_ENV },
80
+ { 's' , 7 , "recovery-target-time" , & target_time , SOURCE_ENV },
81
+ { 's' , 8 , "recovery-target-xid" , & target_xid , SOURCE_ENV },
82
+ { 's' , 9 , "recovery-target-inclusive" , & target_inclusive , SOURCE_ENV },
83
+ { 'u' , 10 , "recovery-target-timeline" , & target_tli , SOURCE_ENV },
84
+ { 'b' , 11 , "hard-copy" , & is_hard_copy , SOURCE_ENV },
85
+ { 'b' , 12 , "validate" , & backup_validate , SOURCE_ENV },
84
86
/* catalog options */
85
- { 'b' , 'a' , "show-all" , & show_all },
87
+ { 'b' , 'a' , "show-all" , & show_all },
86
88
{ 0 }
87
89
};
88
90
@@ -178,14 +180,25 @@ main(int argc, char *argv[])
178
180
else if (pg_strcasecmp (cmd , "backup" ) == 0 )
179
181
{
180
182
pgBackupOption bkupopt ;
181
- bkupopt .smooth_checkpoint = smooth_checkpoint ;
182
- bkupopt .keep_arclog_files = keep_arclog_files ;
183
- bkupopt .keep_arclog_days = keep_arclog_days ;
184
- bkupopt .keep_srvlog_files = keep_srvlog_files ;
185
- bkupopt .keep_srvlog_days = keep_srvlog_days ;
186
- bkupopt .keep_data_generations = keep_data_generations ;
187
- bkupopt .keep_data_days = keep_data_days ;
188
- return do_backup (bkupopt );
183
+ int res ;
184
+ bkupopt .smooth_checkpoint = smooth_checkpoint ;
185
+ bkupopt .keep_arclog_files = keep_arclog_files ;
186
+ bkupopt .keep_arclog_days = keep_arclog_days ;
187
+ bkupopt .keep_srvlog_files = keep_srvlog_files ;
188
+ bkupopt .keep_srvlog_days = keep_srvlog_days ;
189
+ bkupopt .keep_data_generations = keep_data_generations ;
190
+ bkupopt .keep_data_days = keep_data_days ;
191
+
192
+ /* Do the backup */
193
+ res = do_backup (bkupopt );
194
+ if (res != 0 )
195
+ return res ;
196
+
197
+ /* If validation has been requested, do it */
198
+ range .begin = current .start_time ;
199
+ range .end = current .start_time + 1 ;
200
+ if (backup_validate )
201
+ do_validate (& range );
189
202
}
190
203
else if (pg_strcasecmp (cmd , "restore" ) == 0 ){
191
204
return do_restore (target_time , target_xid ,
@@ -230,6 +243,7 @@ pgut_help(bool details)
230
243
printf (_ (" -s, --with-serverlog also backup server log files\n" ));
231
244
printf (_ (" -Z, --compress-data compress data backup with zlib\n" ));
232
245
printf (_ (" -C, --smooth-checkpoint do smooth checkpoint before backup\n" ));
246
+ printf (_ (" --validate validate backup after taking it\n" ));
233
247
printf (_ (" --keep-data-generations=N keep GENERATION of full data backup\n" ));
234
248
printf (_ (" --keep-data-days=DAY keep enough data backup to recover to DAY days age\n" ));
235
249
printf (_ (" --keep-arclog-files=NUM keep NUM of archived WAL\n" ));
0 commit comments