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);
    }

}

执行结果:

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

相关推荐
桶将军T27 分钟前
SEAFARING靶场渗透
数据库·web安全
Data 31744 分钟前
经典sql题(二)求连续登录最多天数用户
大数据·数据库·数据仓库·sql·mysql
服装学院的IT男1 小时前
【Android 13源码分析】WindowContainer窗口层级-3-实例分析
android·数据库
小王是个弟弟2 小时前
HQL-计算不一样的 MUV
数据库·hive·sql
自身就是太阳2 小时前
深入理解 Spring 事务管理及其配置
java·开发语言·数据库·spring
不惑_2 小时前
初识 performance_schema:轻松掌握MySQL性能监控
数据库·mysql
Gauss松鼠会3 小时前
GaussDB关键技术原理:高弹性(四)
java·大数据·网络·数据库·分布式·gaussdb
Aries2633 小时前
Spring事务传播行为详解
java·数据库·spring
code.song4 小时前
电影评论|基于springBoot的电影评论网站设计与实现(附项目源码+论文+数据库)
数据库·spring boot·后端
Dovir多多4 小时前
渗透测试入门学习——php与mysql数据库连接、使用session完成简单的用户注册、登录
前端·数据库·后端·mysql·安全·html·php