项目实训11——对数据库的定时备份

  上一篇博客中讲到如何对特定数据库进行备份,本篇博客来讨论如何对一些数据库进行定时备份。
  定时备份使用的方法和之前的方法一样,使用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";

注意文件名中不能有空格和冒号,要使用其他字符替代,否则不会有文件生成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值