上一篇博客中讲到如何对特定数据库进行备份,本篇博客来讨论如何对一些数据库进行定时备份。
定时备份使用的方法和之前的方法一样,使用Runtime.getRuntime().exec(command)执行命令行语句,备份的sql文件存储在指定的路径的文件夹内。调用DBService即数据库服务对象可获得存储在系统数据库内的用户数据库,将其存储在List中。循环List.size()次数,根据List的index每次备份一个数据库。现在的问题是如何定时执行任务。实现方法为先开启一个线程再对一个数据库进行备份。使用cron存储定时的周期,以"0 30 9 * * ?"
为例,第一位0表示0秒,第二位30表示30分钟,第三位9表示上午9时,其余位用其他符号代替表示每天的9:30。下面是定时的代码:
@Configuration //标记配置类,兼备Component的效果
@EnableScheduling //开启定时任务
public class SimpleScheduleConfig implements SchedulingConfigurer{
@Autowired
private DBService dbService;
@SneakyThrows
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
List<DB> dbList=dbService.findDBList();
Thread thread = new Thread(){
@SneakyThrows
@Override
public void run() {
super.run();
int dbid;
for(int i=0; i<dbList.size(); i++){
dbid=dbList.get(i).getId();
dbService.backupDB(dbid);
}
}
};
taskRegistrar.addTriggerTask(
thread,
triggerContext -> {
//执行周期每天9点30分
String cron = "0 30 9 * * ?";
//非空校验
if(StringUtils.isEmpty(cron)){
//TODO
}
//返回执行周期
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
}
控制台运行结果:
文件夹中的显示:
之前sql文件的命名格式为数据库名+当前日期+.sql,如果备份周期非常频繁,一天之内多次备份,则会造成后备份的文件覆盖之前的文件,会影响数据。所以我改变了命名格式,现在为数据库名+当前日期+当前时间+.sql。命名代码如下:
Date date = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dt=df.format(date);
String datetime1=dt.replace(" ","_");
String datetime2=datetime1.replace(":","-");
// 备份文件名称
String fileName = dbName+datetime2+ ".sql";
注意文件名中不能有空格和冒号,要使用其他字符替代,否则不会有文件生成。