• 【工具类】mysqldump命令java中实现数据库的备份与恢复


    思路:通过mysqldump将数据库数据指定目录生成sql文件,通过mysql命令可以将其恢复,实现数据传输;

    工具类如下:

    import lombok.extern.slf4j.Slf4j;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Arrays;
    
    /**
     * ---------------------------
     * MySQL备份与还原工具类
     * ---------------------------
     */
    @Slf4j
    public class MySQLDBUtil {
    
        private MySQLDBUtil() {
        }
    
        /**
         * 备份数据库所有表数据
         *
         * @param host         IP地址
         * @param username     数据库的用户名
         * @param password     数据库的密码
         * @param savePath     备份文件的地址
         * @param fileName     备份文件名称
         * @param databaseName 需要备份的数据库的名称
         * @return 备份成功返回true, 否则返回false
         */
        public static boolean backup(String host, String port, String username, String password, String savePath, String fileName, String databaseName) {
            File saveFile = new File(savePath);
            if (!saveFile.exists()) {// 如果目录不存在
                saveFile.mkdirs();// 创建文件夹
            }
            if (!savePath.endsWith("/")) {
                savePath = savePath + "/";
            }
    
            //拼接命令行的命令
            // mysqldump --opt -u用户名 -p密码 -hIP地址 -P端口号 --default-character-set=utf8  -B 数据库名 -r文件地址+文件名称
            StringBuilder cmd = new StringBuilder();
            cmd.append("mysqldump").append(" --opt")
                    .append(" -u").append(username)
                    .append(" -p").append(password)
                    .append(" -h").append(host)
                    .append(" -P").append(port)
                    .append(" --default-character-set=utf8 ")
                    .append(" -B ").append(databaseName)
                    .append(" -r").append(savePath + fileName);
            try {
                //调用外部执行exe文件的javaAPI
                Process process = Runtime.getRuntime().exec(getCommand(cmd.toString()));
                if (process.waitFor() == 0) {// 0 表示线程正常终止
                    log.info("数据备份成功,备份路径为:" + savePath);
                    return true;
                }
            } catch (IOException | InterruptedException e) {
                log.error("MySQL数据库进行备份,备份命令执行错误!" + e.getMessage());
            }
            return false;
        }
    
        /**
         * 将备份的数据库sql文件导入到指定数据库
         *
         * @param filePath     数据库备份的sql文件路径
         * @param host         IP地址
         * @param databaseName 数据库名称
         * @param username     用户名
         * @param password     密码
         * @return 数据导入成功为true, 否则为false
         */
        public static boolean recover(String host, String port, String username, String password, String filePath, String fileName, String databaseName) {
            //拼接命令行的命令
            // mysql -u用户名 -p密码 -hIP地址 -P端口号 --default-character-set=utf8  -B 数据库名 < 文件地址+文件名称
            //mysql -uroot -proot -h192.268.1.123 -P3306 --default-character-set=utf8  -B testdb < ./conf_sql/recover_db/conf.sql
            StringBuilder cmd = new StringBuilder();
            cmd.append("mysql")
                    .append(" -u").append(username)
                    .append(" -p").append(password)
                    .append(" -h").append(host)
                    .append(" -P").append(port)
                    .append(" --default-character-set=utf8 ")
                    .append(" -B ").append(databaseName)
                    .append(" < ").append(filePath + fileName);
            try {
                Process process = Runtime.getRuntime().exec(getCommand(cmd.toString()));
                if (process.waitFor() == 0) {// 0 表示线程正常终止
                    log.info("数据已从 " + filePath + " 导入到数据库中");
                    return true;
                }
            } catch (IOException | InterruptedException e) {
                log.error("Mysql数据导入数据库发生异常" + e.getMessage());
            }
            return false;
        }
    
        private static String[] getCommand(String command) {
            String os = System.getProperty("os.name");
            String shell = "/bin/bash";
            String c = "-c";
            if (os.toLowerCase().startsWith("win")) {
                shell = "cmd";
                c = "/c";
            }
            String[] cmd = {shell, c, command};
            log.info("...数据库备份过程中,执行的sql恢复命令为:" + Arrays.toString(cmd));
            return cmd;
        }
    }

    输出示例:

    [cmd, /c, mysqldump --opt -uaaa -pzzz -h10.110.10.xxx -P3306 --default-character-set=utf8  -B dbname t1 t2 t3 -r./sql/1603966233/V1.0.0/db.sql]

  • 相关阅读:
    引擎设计跟踪(九.10) Max插件更新,地形问题备忘
    引擎设计跟踪(九.9) 文件包系统(Game Package System)
    [原] Android上使用native IO
    [原] GLES在iOS和Android上的不同
    [原] perforce 获取本地最近更新的Changelist
    [转]GLES 3.0 新特性
    [原]android不支持命名的semaphore
    [原]android 链接错误
    引擎设计跟踪(九.8) Gizmo helper实现与多国语言
    [原]游戏引擎与游戏逻辑
  • 原文地址:https://www.cnblogs.com/songjn/p/13862896.html
Copyright © 2020-2023  润新知