首页 > 数据库 >傻瓜式Java操作MySQL数据库备份(使用mysqldump命令)

傻瓜式Java操作MySQL数据库备份(使用mysqldump命令)

时间:2023-03-13 11:13:03浏览次数:38  
标签:Java String 备份 傻瓜式 备份文件 mysqldump MySQL new backup

傻瓜式Java操作MySQL数据库备份(使用mysqldump命令)

注释都是由chatGPT生成,有什么问题可以评论交流

    @Value("${backup.sql.database}")
    private String databases;

    @Value("${backup.sql.host}")
    private String host;

    @Value("${backup.sql.username}")
    private String username;

    @Value("${backup.sql.password}")
    private String password;

    private static final int MAX_BACKUP_COUNT = 7; // 最多保存备份文件的数量

/**
 * 备份MySQL数据库
 *
 * @return 备份文件的绝对路径
 */
public void backupSql() { // 定义备份 MySQL 数据库的方法
    String[] split = databases.split(","); // 根据逗号分隔符,将要备份的数据库名称拆分成数组
    for (String database : split) { // 遍历每个数据库名称
        String backup_path = ContentsUtil.TEMP_BACKUPSQL + database + "/"; // 备份文件存放目录
        String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); // 当前日期
        String currentTime = new SimpleDateFormat("HH-mm-ss").format(Calendar.getInstance().getTime()); // 当前时间
        String backupFileName = database + "-" + currentDate + "-" + currentTime + ".sql"; // 备份文件名
        String backupFilePath = backup_path + backupFileName; // 备份文件路径
        new File(backup_path).mkdirs(); // 创建备份文件存放目录,如果已经存在则不创建

        try { // 尝试备份数据库

            List<String> command = new ArrayList<>(); // 新建命令列表
            command.add("mysqldump"); // 添加命令:备份 MySQL 数据库
            command.add("--host=" + host); // 添加命令参数:MySQL 服务器地址
            command.add("--user=" + username); // 添加命令参数:MySQL 用户名
            command.add("--result-file=" + backupFilePath); // 添加命令参数:备份文件路径
            command.add("--databases"); // 添加命令参数:指定要备份的数据库
            command.add(database); // 添加要备份的数据库名称

            ProcessBuilder pb = new ProcessBuilder(command); // 创建进程构建器
            pb.environment().put("MYSQL_PWD", password); // 设置 MySQL 密码

            pb.redirectErrorStream(true); // 合并标准错误输出和标准输出
            Process runtimeProcess = pb.start(); // 启动进程

            InputStream inputStream = runtimeProcess.getInputStream(); // 读取进程的标准输出
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); // 创建输入流读取器

            int processComplete = runtimeProcess.waitFor(); // 等待进程结束

            if (processComplete == 0) { // 如果进程成功结束
                deleteOldBackups(backup_path); // 删除多余的备份文件
                System.out.println("Backup Success: " + backupFilePath); // 输出备份成功信息
            } else { // 如果进程没有成功结束
                System.out.println("Backup Failed"); // 输出备份失败信息
            }

        } catch (IOException | InterruptedException ex) { // 如果出现异常
            System.out.println("Error: " + ex.getMessage()); // 输出异常信息
        }
    }
}

只保留七个周期内的备份数据
/**
 * 删除多余的备份文件,最多只保留 MAX_BACKUP_COUNT 个文件
 */
private static void deleteOldBackups(String backup_path) {
    // 创建文件夹对象
    File backupDir = new File(backup_path);
    // 获取该文件夹下的所有文件对象
    File[] backupFiles = backupDir.listFiles();
    // 将文件对象数组转换成 List,方便排序和删除
    List<File> backupList = Arrays.asList(backupFiles);
    // 对 List 中的文件对象按照修改时间进行升序排序
    Collections.sort(backupList, new Comparator<File>() {
        public int compare(File f1, File f2) {
            return Long.compare(f1.lastModified(), f2.lastModified());
        }
    });

    // 计算需要删除的文件数量
    int excessCount = backupList.size() - MAX_BACKUP_COUNT;
    // 如果需要删除的文件数量大于 0,则循环删除文件
    if (excessCount > 0) {
        for (int i = 0; i < excessCount; i++) {
            backupList.get(i).delete();
        }
    }
}

标签:Java,String,备份,傻瓜式,备份文件,mysqldump,MySQL,new,backup
From: https://www.cnblogs.com/ComfortableM/p/17210646.html

相关文章

  • JSch - Java实现的SFTP(文件上传下载)
    JSch-SFTP文件上传下载目录JSch-SFTP文件上传下载1.JSch简介2.ChannelSftp常用ApiJSch支持三种文件传输模式文件上传put()方法文件下载get()方法3.SFTP上传......
  • 一个demo学会java
    全栈工程师开发手册(作者:栾鹏)快捷链接:​java开发大全这篇demo较长,包含了java基本的内容,若不是出于校验自己java基础能力的朋友,建议按照上面的链接分章节学习。本demo包含了j......
  • 【Java】知识点汇总(1)
    周末重新整理了一下过往的笔记,发现以前有很多Java相关的经验都用txt或者word记录起来,于是稍微整理了一下全部打包放上网,做个记录也好。1.包装类用equals,基础类就用==结论In......
  • java反射
    1.反射机制的概念及作用(原文链接:https://blog.csdn.net/lililuni/article/details/83449088)   JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属......
  • 【面试系列1】Java基础
    1.面向对象三大特征封装   1. 属性与方法:属性描述同一类事务的特征、方法描述同一类事务的操作。封装就是将同一类事务的属性、方法归结到同一个类里面。  2. ......
  • java初识
    一java简介二开发环境搭建三开发第一个java程序四使用Eclipse进行java程序开发  Java简介java是一门面向对象的程序设计语言1995年由sun公司发布2010......
  • java学习日记20230312-构造方法
    构造方法/构造器基本语法[修饰符]方法名(形参列表){方法体;}构造器的修饰符可以是默认;构造器没有返回值;方法名和类名字必须一样;参数列表和成员方法一样的规则;构......
  • Java基础知识点(集合、ArrayList集合、基本数据类型对应的包装类及
    1.为什么要有集合?集合它可以自动扩容。2.集合存储数据类型的特点:不能直接存基本数据类型,需要将其变为包装类再存入,可以存引用数据类型。二:集合和数组的对比长度:数组的长度固......
  • 学习java第三周
    前言:这周过的很充实,因为对之前的内容没有很好理解本周一部分时间消化之前内容,经过三周的学习,对Java开始有了自己的认知,长路漫漫对自己的学习情况并不是很满意.对本周内......
  • java学习日记20230311-方法重载/可变参数/作用域
    方法重载java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致:System.out.println();减轻了起名的麻烦减轻了记名的麻烦方法名必须相同形参列表必须不同(个......