@@ -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" ));