当前位置: 首页 > article >正文

springboot对数据库进行备份+对一个文件夹内的文件按时间排序,只保留最近的8个文件

首先,对数据库进行备份,用到的命令:

mysqldump --opt -h 192.168.1.200 --user=root --password=xxx --result-file=E://data//20240911141400.sql --default-character-set=utf8 xxx(数据库名)

直接上代码

配置文件部分代码

代码部分两个类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Component
public class BackUpDataBaseManager {
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String userName;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${data.url}")
    private String sqlPath;

    /**
     * 获取数据库名
     */
    public String getDataBaseName() {
        return url.substring(url.indexOf("3306"), url.indexOf("?")).replaceAll("/", "").replaceAll("3306", "");
    }

    /**
     * 获取主机地址
     */
    private String getHost() {
        return url.substring(url.indexOf("mysql"), url.indexOf("3306")).replace(":", "").replace("//", "").replace("mysql", "");
    }

    /**
     * 导出 sql 并返回相关信息
     */
    public void exportSql(String time) {
        // 指定导出的 sql 存放的文件夹
        File saveFile = new File(sqlPath);
        if (!saveFile.exists()) {
            saveFile.mkdirs();
        }
        String host = getHost();
        String dataBaseName = getDataBaseName();
        //创建当月的文件夹
        String fileName = time + ".sql";
        StringBuilder sb = new StringBuilder();
        // 拼接备份命令
        sb.append("mysqldump").append(" --opt").append(" -h ").append(host).append(" --user=").append(userName).append(" --password=").append(password);
        sb.append(" --result-file=").append(sqlPath + fileName).append(" --default-character-set=utf8 ").append(dataBaseName);
        try {
            System.out.println("执行语句:" + sb.toString());
            Process exec = Runtime.getRuntime().exec(sb.toString());
            if (exec.waitFor() == 0) {
                //删除前期的文件
                this.deleteDir();
                System.out.println("数据库备份成功,保存路径:" + sqlPath);
            } else {
                System.out.println("process.waitFor()=" + exec.waitFor());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            System.out.println("备份 数据库 出现 线程中断异常 ");
        } catch (Exception e) {
            System.out.println("备份 数据库 出现 其他异常 ");
        }
    }

    /**
    * @Description: 循环文件夹下的文件,删除指定的文件
    * @param
    * @author zlw
    * @date 2024/9/11 11:21
    */
    public void deleteDir() {
        // 替换为你的文件夹路径
        String folderPath = sqlPath;
        // 要保留的最新文件数量
        int numberToKeep = 8;

        File folder = new File(folderPath);
        File[] files = folder.listFiles();

        if (files != null) {
            List<File> fileList = Arrays.asList(files);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
            //list倒序排列
            fileList.sort((f1, f2) -> {
                Date d1 = null;
                Date d2 = null;
                try {
                    d1 = sdf.parse(extractDateTime(f1.getName()));
                    d2 = sdf.parse(extractDateTime(f2.getName()));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return d1.compareTo(d2);
            });
            System.out.println("fileList的数据是"+fileList);
            for (int i = 0; i < fileList.size() - numberToKeep; i++) {
                fileList.get(i).delete();
            }
        }
    }

    private static String extractDateTime(String fileName) {
        // 假设文件名的前14个字符包含日期时间信息
        return fileName.length() >= 14 ? fileName.substring(0, 14) : "";
    }
}

定时任务的类

public class ScheduledTasks {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
    @Autowired
    private BackUpDataBaseManager backUpDataBaseManager;

    /**
     * 每天下午4点50分30秒执行
     */
    // 每一分钟执行一次
//     @Scheduled(cron = "0 0/1 * * * ? ")
    //每周三和周日上午9点执行去备份数据库
     @Scheduled(cron = "0 0 9 ? * WED,SUN")
    public void reportCurrentTime() {
        String format = dateFormat.format(System.currentTimeMillis());
        System.out.println("The time is now {}"+format);
        backUpDataBaseManager.exportSql(format);
    }

}

执行结果:

会定时删除一个月前的数据,只保留最近一个月的数据库备份文件


http://www.kler.cn/a/303864.html

相关文章:

  • 用MVVM设计模式提升WPF开发体验:分层架构与绑定实例解析
  • HBase 安装与基本操作指南
  • 阿里云centos7.9服务器磁盘挂载,切换服务路径
  • 阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势
  • 基于微信小程序的农场管理系统的设计与实现,LW+源码+讲解
  • flutter下拉刷新上拉加载的简单实现方式三
  • 基于鸿蒙API10的RTSP播放器(四:沉浸式播放窗口)
  • 五星级可视化页面(23):污水处理、防汛可视化大屏
  • 自闭症摘帽流程解析:从诊断到摘帽的完整指南
  • graphQL 参数使用报错问题
  • Node.js学习记录(二)
  • 鸿蒙(API 12 Beta6版)GPU加速引擎服务【自适应VRS】
  • C语言 条件编译
  • 【2024】前端学习笔记5-表单标签使用
  • leaflet【十】实时增加轨迹点轨迹回放效果实现
  • 2024/9/11学校教的响应式前端能学到什么?
  • 【路径规划】APF算法、Vortex APF算法、Safe APF算法和动态Windows方法的比较
  • AI教你学Python 第3天:函数和模块
  • ai智能语电销机器人有哪些功能?
  • 初识软件测试
  • 数据结构——单链表基本操作的实现
  • 我与Linux的爱恋:自动化构建工具-make/Makefile
  • 测试-Gatling 与性能测试
  • 98、RS485全自动收发电路入坑笔记
  • Gmtracker_深度学习驱动的图匹配多目标跟踪项目启动与算法流程
  • ES机制原理