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

傻瓜式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();
        }
    }
}
posted @ 2023-03-13 11:01  Comfortable  阅读(438)  评论(0编辑  收藏  举报