前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库的定期备份

数据库的定期备份

作者头像
时光潜流
发布2023-10-22 16:20:21
1720
发布2023-10-22 16:20:21
举报
文章被收录于专栏:博客专栏博客专栏

这两天完成了数据库的定期备份业务实现,以及一些无需提及的前端页面bug更正。

因为以后可能会有不少的定期任务,如果仍然放在service目录层级下,会显得比较乱,所以决定放在了新的包schedule中。以后所有的schedule都放在这个目录层级下,方便管理,顺便截了一张当前项目的目录结构:

接下来是看一下这节的主题给springboot设置定期计划,首先,在启动类也就是DreamcenterApplication加上注解@EnableScheduling来启动定时计划的功能。然后对于mysql的定时备份代码如下:

代码语言:javascript
复制
package top.dreamcenter.dreamcenter.schedule;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import top.dreamcenter.dreamcenter.entity.ServerProperties;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;

@Component
public class MysqlSchedule {

    private ServerProperties properties;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Autowired
    public MysqlSchedule(ServerProperties properties) {
        this.properties = properties;
    }

    // save data to imgBaseLocPath / mysql_bak / ...
    @Scheduled(cron = "0 0 3 * * ?")
    public void dump() {
        System.out.println("schedule [dump] run ...");

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String time = sdf.format(Calendar.getInstance().getTime());

        String path = properties.getLocalImgPath() + "mysql_bak/";
        String fileName = time + ".sql";
        File file = new File(path);

        if (file.exists() || file.mkdirs()) {
            BufferedReader bufferedReader = null;
            FileOutputStream fos = null;
            try {
                String cmd = String.format("mysqldump -u%s -p%s dreamcenter",
                        username, password);
                Process exec = Runtime.getRuntime().exec(cmd);

                System.out.println("schedule [dump] write result ...");

                bufferedReader = new BufferedReader(
                        new InputStreamReader(exec.getInputStream()));
                String temp;
                StringBuilder sb = new StringBuilder();
                while((temp = bufferedReader.readLine())!=null){
                    sb.append(temp).append("\n");
                }

                fos = new FileOutputStream(path + fileName);
                fos.write(sb.toString().getBytes());

                bufferedReader.close();
                fos.close();

                System.out.println("schedule [dump] write done!");
            } catch (IOException e) {
                System.out.println("schedule [dump] write failed!");
                if (bufferedReader != null) {
                    try {
                        bufferedReader.close();
                    } catch (IOException ioException) {
                        System.out.println("--schedule [dump] bufferedReader");
                    }
                }
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException ioException) {
                        ioException.printStackTrace();
                    }
                }
            }
        }
    }
}

使用java的exec()来执行命令mysqldump【前提是该命令已经在全局环境变量中,否则需要配置填写详细的mysqldump地址执行】,然后将结果从输入流读取并且写入本地的文件中。目前导出的文件大小约莫200k,不算很大,所以就不实现自动删除久远日志的功能了,直接我全都要!

当然光就是这些的话会有非常严重的问题,因为该保存的基准路径被设置成了静态资源路径(本地图片备份后备路径需要),所以如果不对mysql_bak/进行拦截,那么这些备份文件将会被别人轻易的拿到,虽然现在没有什么特别重要的数据在库中,但是如果还是不能留下不必要的开放接口。所以同样的,需要给一个拦截注册器添加一个拦截路由,即 register.addPathPatterns("/mysql_bak/*"); 这样来防范一些意外的产生。

目前在本地测试通过了,可以实现定期备份,服务器上是否生效需要等明天凌晨三点,一定要成功欸!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-05-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档