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

}

执行结果:

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

相关推荐
独行soc42 分钟前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain1 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship1 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站1 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶1 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
梦想平凡3 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
TianyaOAO3 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql
Ewen Seong3 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存
码农老起4 小时前
企业如何通过TDSQL实现高效数据库迁移与性能优化
数据库·性能优化
夏木~5 小时前
Oracle 中什么情况下 可以使用 EXISTS 替代 IN 提高查询效率
数据库·oracle