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

}

执行结果:

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

相关推荐
wno7045 小时前
postgresSQL压缩版安装与基本命令
数据库·postgresql
聚美智数7 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
瀚高PG实验室7 小时前
瀚高数据库常用系统表查询入门指南(附常用SQL)
数据库·sql·postgresql·瀚高数据库
ben9518chen7 小时前
mysql数据库基本操作
数据库·mysql
2603_965148117 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
土豆.exe8 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
缓慢更新8 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Web3&Basketball10 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
xiaogai_gai10 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
注塑机数据采集联网10 小时前
注塑机数据采集网关对接MES系统数字化技术方案
大数据·网络·数据库·物联网·数据挖掘·数据分析