@@ -46,6 +46,7 @@ static char *target_xid;
4646static char * target_inclusive ;
4747static TimeLineID target_tli ;
4848static bool is_hard_copy = false;
49+ static bool backup_validate = false;
4950
5051/* show configuration */
5152static bool show_all = false;
@@ -56,33 +57,34 @@ static void parse_range(pgBackupRange *range, const char *arg1, const char *arg2
5657static pgut_option options []=
5758{
5859/* 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 },
6364/* common options */
64- {'b' ,'v' ,"verbose" , & verbose },
65- {'b' ,'c' ,"check" , & check },
65+ {'b' ,'v' ,"verbose" , & verbose },
66+ {'b' ,'c' ,"check" , & check },
6667/* 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 },
7172/* 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 },
7879/* 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 },
8486/* catalog options */
85- {'b' ,'a' ,"show-all" , & show_all },
87+ {'b' ,'a' ,"show-all" , & show_all },
8688{0 }
8789};
8890
@@ -178,14 +180,25 @@ main(int argc, char *argv[])
178180else if (pg_strcasecmp (cmd ,"backup" )== 0 )
179181{
180182pgBackupOption 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 );
189202}
190203else if (pg_strcasecmp (cmd ,"restore" )== 0 ){
191204return do_restore (target_time ,target_xid ,
@@ -230,6 +243,7 @@ pgut_help(bool details)
230243printf (_ (" -s, --with-serverlog also backup server log files\n" ));
231244printf (_ (" -Z, --compress-data compress data backup with zlib\n" ));
232245printf (_ (" -C, --smooth-checkpoint do smooth checkpoint before backup\n" ));
246+ printf (_ (" --validate validate backup after taking it\n" ));
233247printf (_ (" --keep-data-generations=N keep GENERATION of full data backup\n" ));
234248printf (_ (" --keep-data-days=DAY keep enough data backup to recover to DAY days age\n" ));
235249printf (_ (" --keep-arclog-files=NUM keep NUM of archived WAL\n" ));