springboot 人大金仓 kingbase-备份还原,命令中带密码,支持window和linux

命令带密码参考

Java代码实现国产人大金仓数据库备份还原需求-CSDN博客文章浏览阅读818次,点赞16次,收藏12次。本人在一次项目中,遇到了需要在系统管理中提供给用户备份还原系统数据的功能,由于项目特殊性,项目底层数据库使用了国产人大金仓数据库(版本V8)。由于本人也是第一次使用金仓数据库,所以在功能实现过程中,踩到了一些坑,特此记录一下,共大家参考,避免踩到和我一样的坑。所以:sys_dump -d 数据库名 -h 127.0.0.1 -p 54321 -U root -W 123456 这个指令是有问题的,于是我又打开了命令窗口,调试了指令发现指令语法错误 -W 123456。于是我get到了,便优化了我的指令。https://blog.csdn.net/weixin_44329740/article/details/135764084

导出和导入分sql和dmp ,推荐用dmp,用代码-ksql 命令导入 sql 一旦报错,程序会一直卡 process.waitFor() 那。

官方参数:直接在页面搜相应命令节课

13. sys_dump — KingbaseES产品手册 icon-default.png?t=N7T8https://help.kingbase.com.cn/v8/admin/reference/ref-client/sys_dump.html?highlight=sys_dump

6. 附录B:imp导入参数说明 — KingbaseES产品手册 icon-default.png?t=N7T8https://help.kingbase.com.cn/v8/admin/reference/exp-imp/appendix-b.html?highlight=imp

一、导出sql版(不推荐)

导入一旦报错,则子线程无返回值,则程序会一直到超时,所以建议采用导出dmp的方式

1、工具类-导出sql

根据驱动类型,选择执行的命令

1)DatabaseUtil 工具类

import cn.hutool.core.util.StrUtil;
import cn.hutool.system.SystemUtil;
import com.fisec.common.enums.DatabaseTypeEnum;

import java.util.HashMap;

public class DatabaseUtil {

    /**
     * 根据数据库驱动类型,获取数据库类型
     *
     * @param dbDriver
     * @return
     */
    public static DatabaseTypeEnum getDbType(String dbDriver) {
        if (dbDriver.startsWith("com.mysql")) {
            return DatabaseTypeEnum.Mysql;
        }

        if (dbDriver.startsWith("com.kingbase")) {
            return DatabaseTypeEnum.KingBase;
        }

        return DatabaseTypeEnum.Unknown;
    }

    /**
     * 获取mysql备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlBackLinuxCmd(String dbHost, String dbName, String username, String pwd) {
        return String.format("mysqldump -h%s -u%s -p%s -R %s", dbHost,
                username, pwd, dbName);
    }

    /**
     * 获取mysql备份命令
     * 切换磁盘需要添加,并奇幻盘符下命令执行
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlBackWindowsCmd(String dbHost, String dbName, String username, String pwd) {
        return String.format("d: && cd D:/Program Files/MySQL/MySQL Server 8.0/bin && .\\mysqldump.exe -h%s -u%s -p%s -R %s", dbHost,
                username, pwd, dbName);
    }

    /**
     * 获取 人大金仓数据备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlBackCmd(String dbHost, String dbName, String username, String pwd) {
        if (SystemUtil.getOsInfo().isWindows()) {
            return mysqlBackWindowsCmd(dbHost, dbName, username, pwd);
        }
        return mysqlBackLinuxCmd(dbHost, dbName, username, pwd);
    }

    /**
     * 获取mysql备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlRecoveryWindowsCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return String.format("d: && cd D:/Program Files/MySQL/MySQL Server 8.0/bin && .\\mysql.exe -h%s -u%s -p%s %s < %s", dbHost,
                username, pwd, dbName, sqlPath);
    }


    /**
     * 获取mysql备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlRecoveryLinuxCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return String.format("mysql -h%s -u%s -p%s %s < %s", dbHost,
                username, pwd, dbName, sqlPath);
    }

    /**
     * 获取 人大金仓数据备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlRecoveryCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        if (SystemUtil.getOsInfo().isWindows()) {
            return mysqlRecoveryWindowsCmd(dbHost, dbName, username, pwd, sqlPath);
        }
        return mysqlRecoveryLinuxCmd(dbHost, dbName, username, pwd, sqlPath);
    }

    /**
     * 获取人大金仓的备份命令
     * 注:这里路径为 windows 默认路径 ,注版本为 V008R006C008B0014 路径需根据实际情况替换
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseBackWindowsCmd(String dbHost, String dbName, String username, String pwd) {
        return StrUtil.format("cd C:/Program Files/Kingbase/ES/V8/KESRealPro/V008R006C008B0014/ClientTools/bin && sys_dump.exe \"host={dbHost} port=54321 user={username} password={pwd} dbname={dbName}\"",
                new HashMap<>() {{
                    put("dbHost", dbHost);
                    put("dbName", dbName);
                    put("username", username);
                    put("pwd", pwd);
                }});
    }

    /**
     * 获取人大金仓的备份命令 - windows 默认路径 ,注版本为 V008R006C008B0014
     * 路径需根据实际情况替换
     * 所有 java 执行 linux命令需添加前缀 /bin/bash -c
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseBackLinuxCmd(String dbHost, String dbName, String username, String pwd) {
        return StrUtil.format("cd /opt/Kingbase/ES/V8/KESRealPro/V008R006C008B0014/ClientTools/bin && sys_dump \"host={dbHost} port=54321 user={username} password={pwd} dbname={dbName}\"",
                new HashMap<>() {{
                    put("dbHost", dbHost);
                    put("dbName", dbName);
                    put("username", username);
                    put("pwd", pwd);
                }});
    }

    /**
     * 获取人大金仓的恢复数据库命令
     * 注:这里路径为 windows 默认路径 ,注版本为 V008R006C008B0014 路径需根据实际情况替换
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseRecoveryWindowsCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return StrUtil.format("cd C:/Program Files/Kingbase/ES/V8/KESRealPro/V008R006C008B0014/ClientTools/bin && ksql.exe -f {sqlPath} \"host={dbHost} port=54321 user={username} password={pwd} dbname={dbName}\"",
                new HashMap<>() {{
                    put("dbHost", dbHost);
                    put("dbName", dbName);
                    put("username", username);
                    put("pwd", pwd);
                    put("sqlPath", sqlPath);
                }});
    }

    /**
     * 获取人大金仓的备份命令 - windows 默认路径 ,注版本为 V008R006C008B0014
     * 路径需根据实际情况替换
     * 所有 java 执行 linux命令需添加前缀 /bin/bash -c
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseRecoveryLinuxCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return StrUtil.format("cd /opt/Kingbase/ES/V8/KESRealPro/V008R006C008B0014/ClientTools/bin && ksql -f {} \"host={dbHost} port=54321 user={username} password={pwd} dbname={dbName}\"",
                new HashMap<>() {{
                    put("dbHost", dbHost);
                    put("dbName", dbName);
                    put("username", username);
                    put("pwd", pwd);
                    put("sqlPath", sqlPath);
                }});
    }

    /**
     * 获取 人大金仓数据备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseBackCmd(String dbHost, String dbName, String username, String pwd) {
        if (SystemUtil.getOsInfo().isWindows()) {
            return kingBaseBackWindowsCmd(dbHost, dbName, username, pwd);
        }
        return kingBaseBackLinuxCmd(dbHost, dbName, username, pwd);
    }

    /**
     * 获取 人大金仓数据备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseRecoveryCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        if (SystemUtil.getOsInfo().isWindows()) {
            return kingBaseRecoveryWindowsCmd(dbHost, dbName, username, pwd, sqlPath);
        }
        return kingBaseRecoveryLinuxCmd(dbHost, dbName, username, pwd, sqlPath);
    }

    /**
     * 根据数据类型 获取执行的命令
     *
     * @param databaseTypeEnum
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String getDbBackCmd(DatabaseTypeEnum databaseTypeEnum, String dbHost, String dbName, String username, String pwd) {
        return switch (databaseTypeEnum) {
            case Mysql -> mysqlBackCmd(dbHost, dbName, username, pwd);
            case KingBase -> kingBaseBackCmd(dbHost, dbName, username, pwd);
            case Unknown -> null;
        };
    }

    /**
     * 获取数据的的备份命令
     *
     * @param dbDriver
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String getDbBackCmd(String dbDriver, String dbHost, String dbName, String username, String pwd) {
        return getDbBackCmd(getDbType(dbDriver), dbHost, dbName, username, pwd);
    }

    /**
     * 根据数据类型 获取执行的命令
     *
     * @param databaseTypeEnum
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String getDbRecoveryCmd(DatabaseTypeEnum databaseTypeEnum, String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return switch (databaseTypeEnum) {
            case Mysql -> mysqlRecoveryCmd(dbHost, dbName, username, pwd, sqlPath);
            case KingBase -> kingBaseRecoveryCmd(dbHost, dbName, username, pwd, sqlPath);
            case Unknown -> null;
        };
    }

    /**
     * 获取数据的的备份命令
     *
     * @param dbDriver
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String getDbRecoveryCmd(String dbDriver, String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return getDbRecoveryCmd(getDbType(dbDriver), dbHost, dbName, username, pwd, sqlPath);
    }

}

依赖枚举 DatabaseTypeEnum 

public enum DatabaseTypeEnum {
    /**
     * mysql 数据库
     */
    Mysql("mysql"),
    /**
     * 人大金仓数据
     */
    KingBase("kingBase"),
    /**
     * 未知的数据库类型
     */
    Unknown("unknown");

    private final String value;

    DatabaseTypeEnum(String value) {
        this.value = value;
    }
}

2、备份调用

参数获取

@Value("${spring.datasource.driver-class-name}")
private String dbDriver;
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String dbUsername;
@Value("${spring.datasource.password}")
 private String pwd;

执行内容
String dbHost = dbUrl.split("//")[1].split(":")[0];
        String dbName = dbUrl.split("/")[3];
        // 去除问号及其后面的参数
        if (dbName.contains("?")) {
            dbName = dbName.split("\\?")[0];
        }

        String command = DatabaseUtil.getDbBackCmd(dbDriver, dbHost, dbName, dbUsername, pwd);
        log.info("数据备份命令:{}", command);

        // 创建进程构建器
        ProcessBuilder processBuilder = new ProcessBuilder();
        // window 用 cmd、linux 用 bash
        if (SystemUtil.getOsInfo().isWindows()) {
            processBuilder.command("cmd.exe", "/C", command); // 设置工作目录
        } else {
            processBuilder.command("/bin/bash", "-c", command); // 设置工作目录
        }
        // 启动进程
        Process process = processBuilder.start();

        InputStream errorStream = process.getErrorStream();
        InputStreamReader isr = new InputStreamReader(errorStream, "GBK");

        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
            log.info(line);
        }
        br.close();
        isr.close();
        errorStream.close();
        if (process.waitFor() != 0) {
            log.error("数据备份失败");
            throw new Exception("备份失败");
        }

3、数据库恢复调用

恢复失败了,数据sql 脚本被执行,但是恢复失败了

String dbHost = dbUrl.split("//")[1].split(":")[0];
            String dbName = dbUrl.split("/")[3];
            // 去除问号及其后面的参数
            if (dbName.contains("?")) {
                dbName = dbName.split("\\?")[0];
            }

            assert file != null;
            String command = DatabaseUtil.getDbRecoveryCmd(dbDriver, dbHost, dbName, dbUsername, pwd, file.getAbsolutePath());

            // 创建进程构建器
            ProcessBuilder processBuilder = new ProcessBuilder();
            // window 用 cmd、linux 用 bash
            if (SystemUtil.getOsInfo().isWindows()) {
                processBuilder.command("cmd.exe", "/C", command); // 设置工作目录
            } else {
                processBuilder.command("/bin/bash", "-c", command); // 设置工作目录
            }
            // 启动进程
            Process process = processBuilder.start();

            InputStream errorStream = process.getErrorStream();
            InputStreamReader isr = new InputStreamReader(errorStream, StandardCharsets.UTF_8);

            BufferedReader br = new BufferedReader(isr);
            String line;
            while ((line = br.readLine()) != null) {
                log.info(line);
            }
            br.close();
            isr.close();
            errorStream.close();

            if (process.waitFor() != 0) {
                return CommonResult.fail("数据恢复失败");
            }

二、导出dmp版(推荐)

1、工具类-导出 dmp

1)DatabaseUtil 工具类

package com.fisec.common.util;

import cn.hutool.core.util.StrUtil;
import cn.hutool.system.SystemUtil;
import com.fisec.common.enums.DatabaseTypeEnum;

import java.util.HashMap;

public class DatabaseUtil {

    /**
     * 根据数据库驱动类型,获取数据库类型
     *
     * @param dbDriver
     * @return
     */
    public static DatabaseTypeEnum getDbType(String dbDriver) {
        if (dbDriver.startsWith("com.mysql")) {
            return DatabaseTypeEnum.Mysql;
        }

        if (dbDriver.startsWith("com.kingbase")) {
            return DatabaseTypeEnum.KingBase;
        }

        return DatabaseTypeEnum.Unknown;
    }

    /**
     * 获取备份文件的扩展名
     *
     * @param dbDriver
     * @return
     */
    public static String getFileExtension(String dbDriver) {
        if (dbDriver.startsWith("com.mysql")) {
            return ".sql";
        }

        if (dbDriver.startsWith("com.kingbase")) {
            return ".dmp";
        }

        return "";
    }

    /**
     * 获取mysql备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlBackLinuxCmd(String dbHost, String dbName, String username, String pwd, String saveSqlFile) {
        return String.format("mysqldump -h%s -u%s -p%s -R %s > %s", dbHost,
                username, pwd, dbName, saveSqlFile);
    }

    /**
     * 获取mysql备份命令
     * 切换磁盘需要添加,并奇幻盘符下命令执行
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlBackWindowsCmd(String dbHost, String dbName, String username, String pwd, String saveSqlFile) {
        return String.format("d: && cd D:/Program Files/MySQL/MySQL Server 8.0/bin && .\\mysqldump.exe -h%s -u%s -p%s -R %s > %s", dbHost,
                username, pwd, dbName, saveSqlFile);
    }

    /**
     * 获取 人大金仓数据备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlBackCmd(String dbHost, String dbName, String username, String pwd, String saveSqlFile) {
        if (SystemUtil.getOsInfo().isWindows()) {
            return mysqlBackWindowsCmd(dbHost, dbName, username, pwd, saveSqlFile);
        }
        return mysqlBackLinuxCmd(dbHost, dbName, username, pwd, saveSqlFile);
    }

    /**
     * 获取mysql备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlRecoveryWindowsCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return String.format("d: && cd D:/Program Files/MySQL/MySQL Server 8.0/bin && .\\mysql.exe -h%s -u%s -p%s %s < %s", dbHost,
                username, pwd, dbName, sqlPath);
    }


    /**
     * 获取mysql备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlRecoveryLinuxCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return String.format("mysql -h%s -u%s -p%s %s < %s", dbHost,
                username, pwd, dbName, sqlPath);
    }

    /**
     * 获取 人大金仓数据备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String mysqlRecoveryCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        if (SystemUtil.getOsInfo().isWindows()) {
            return mysqlRecoveryWindowsCmd(dbHost, dbName, username, pwd, sqlPath);
        }
        return mysqlRecoveryLinuxCmd(dbHost, dbName, username, pwd, sqlPath);
    }

    /**
     * 获取人大金仓的备份命令
     * 注:这里路径为 windows 默认路径 ,注版本为 V008R006C008B0014 路径需根据实际情况替换
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseBackWindowsCmd(String dbHost, String dbName, String username, String pwd, String saveSqlFile) {
        return StrUtil.format("cd C:/Program Files/Kingbase/ES/V8/KESRealPro/V008R006C008B0014/ClientTools/bin && .\\exp.exe host={dbHost} port=54321 dbname={dbName} user={username} password={pwd} OWNER=public FILE={saveSqlFile}",
                new HashMap<>() {{
                    put("dbHost", dbHost);
                    put("dbName", dbName);
                    put("username", username);
                    put("pwd", pwd);
                    put("saveSqlFile", saveSqlFile);
                }});
    }

    /**
     * 获取人大金仓的备份命令 - windows 默认路径 ,注版本为 V008R006C008B0014
     * 路径需根据实际情况替换
     * 所有 java 执行 linux命令需添加前缀 /bin/bash -c
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseBackLinuxCmd(String dbHost, String dbName, String username, String pwd, String saveSqlFile) {
        return StrUtil.format("cd /opt/Kingbase/ES/V8/KESRealPro/V008R006C008B0014/ClientTools/bin && exp host={dbHost} port=54321 dbname={dbName} user={username} password={pwd} OWNER=public FILE={saveSqlFile}",
                new HashMap<>() {{
                    put("dbHost", dbHost);
                    put("dbName", dbName);
                    put("username", username);
                    put("pwd", pwd);
                    put("saveSqlFile", saveSqlFile);
                }});
    }

    /**
     * 获取人大金仓的恢复数据库命令
     * 注:这里路径为 windows 默认路径 ,注版本为 V008R006C008B0014 路径需根据实际情况替换
     * CLEAN=y:imp程序先删掉数据库对象,再执行导入操作,默认值为n
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseRecoveryWindowsCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return StrUtil.format("cd C:/Program Files/Kingbase/ES/V8/KESRealPro/V008R006C008B0014/ClientTools/bin && .\\imp.exe host={dbHost} port=54321 user={username} password={pwd} dbname={dbName} FROMUSER=public CLEAN=y FILE={sqlPath}",
                new HashMap<>() {{
                    put("dbHost", dbHost);
                    put("dbName", dbName);
                    put("username", username);
                    put("pwd", pwd);
                    put("sqlPath", sqlPath);
                }});
    }

    /**
     * 获取人大金仓的备份命令 - windows 默认路径 ,注版本为 V008R006C008B0014
     * 路径需根据实际情况替换
     * 所有 java 执行 linux命令需添加前缀 /bin/bash -c
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseRecoveryLinuxCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return StrUtil.format("cd /opt/Kingbase/ES/V8/KESRealPro/V008R006C008B0014/ClientTools/bin && imp host={dbHost} port=54321 user={username} password={pwd} dbname={dbName} FROMUSER=public CLEAN=y FILE={sqlPath}",
                new HashMap<>() {{
                    put("dbHost", dbHost);
                    put("dbName", dbName);
                    put("username", username);
                    put("pwd", pwd);
                    put("sqlPath", sqlPath);
                }});
    }

    /**
     * 获取 人大金仓数据备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseBackCmd(String dbHost, String dbName, String username, String pwd, String saveSqlFile) {
        if (SystemUtil.getOsInfo().isWindows()) {
            return kingBaseBackWindowsCmd(dbHost, dbName, username, pwd, saveSqlFile);
        }
        return kingBaseBackLinuxCmd(dbHost, dbName, username, pwd, saveSqlFile);
    }

    /**
     * 获取 人大金仓数据备份命令
     *
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String kingBaseRecoveryCmd(String dbHost, String dbName, String username, String pwd, String sqlPath) {
        if (SystemUtil.getOsInfo().isWindows()) {
            return kingBaseRecoveryWindowsCmd(dbHost, dbName, username, pwd, sqlPath);
        }
        return kingBaseRecoveryLinuxCmd(dbHost, dbName, username, pwd, sqlPath);
    }

    /**
     * 根据数据类型 获取执行的命令
     *
     * @param databaseTypeEnum
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String getDbBackCmd(DatabaseTypeEnum databaseTypeEnum, String dbHost, String dbName, String username, String pwd, String saveSqlFile) {
        return switch (databaseTypeEnum) {
            case Mysql -> mysqlBackCmd(dbHost, dbName, username, pwd, saveSqlFile);
            case KingBase -> kingBaseBackCmd(dbHost, dbName, username, pwd, saveSqlFile);
            case Unknown -> null;
        };
    }

    /**
     * 获取数据的的备份命令
     *
     * @param dbDriver
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String getDbBackCmd(String dbDriver, String dbHost, String dbName, String username, String pwd, String saveSqlFile) {
        return getDbBackCmd(getDbType(dbDriver), dbHost, dbName, username, pwd,saveSqlFile);
    }

    /**
     * 根据数据类型 获取执行的命令
     *
     * @param databaseTypeEnum
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String getDbRecoveryCmd(DatabaseTypeEnum databaseTypeEnum, String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return switch (databaseTypeEnum) {
            case Mysql -> mysqlRecoveryCmd(dbHost, dbName, username, pwd, sqlPath);
            case KingBase -> kingBaseRecoveryCmd(dbHost, dbName, username, pwd, sqlPath);
            case Unknown -> null;
        };
    }

    /**
     * 获取数据的的备份命令
     *
     * @param dbDriver
     * @param dbHost
     * @param dbName
     * @param username
     * @param pwd
     * @return
     */
    public static String getDbRecoveryCmd(String dbDriver, String dbHost, String dbName, String username, String pwd, String sqlPath) {
        return getDbRecoveryCmd(getDbType(dbDriver), dbHost, dbName, username, pwd, sqlPath);
    }

}

2、备份调用

// 1 备份的临时文件、清空,并创建备份的文件
        String sqlPath = uploadDir + File.separator + "sqlBack";
        FileUtil.del(sqlPath);
        String saveSqlName = fileName + DatabaseUtil.getFileExtension(dbDriver);
        String saveSqlFile = sqlPath + File.separator + saveSqlName;
        FileUtil.touch(saveSqlFile);

// 3 获取备份命令,根据数据参数
        String dbHost = dbUrl.split("//")[1].split(":")[0];
        String dbName = dbUrl.split("/")[3];
        // 去除问号及其后面的参数
        if (dbName.contains("?")) {
            dbName = dbName.split("\\?")[0];
        }

        String command = DatabaseUtil.getDbBackCmd(dbDriver, dbHost, dbName, dbUsername, pwd, saveSqlFile);
        log.info("数据备份命令:{}", command);

        // 4 创建进程构建器,执行命令
        ProcessBuilder processBuilder = new ProcessBuilder();
        // window 用 cmd、linux 用 bash
        if (SystemUtil.getOsInfo().isWindows()) {
            processBuilder.command("cmd.exe", "/C", command); // 设置工作目录
        } else {
            processBuilder.command("/bin/bash", "-c", command); // 设置工作目录
        }
        // 5 启动进程
        Process process = processBuilder.start();
        // 6 打印输出
        InputStream errorStream = process.getErrorStream();
        InputStreamReader isr = new InputStreamReader(errorStream, "GBK");
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
            log.info(line);
        }
        br.close();
        isr.close();
        errorStream.close();
        if (process.waitFor() != 0) {
            log.error("数据备份失败");
            throw new Exception("备份失败");
        }

3、数据库恢复调用

String dbHost = dbUrl.split("//")[1].split(":")[0];
            String dbName = dbUrl.split("/")[3];
            // 去除问号及其后面的参数
            if (dbName.contains("?")) {
                dbName = dbName.split("\\?")[0];
            }

            assert file != null;
            String command = DatabaseUtil.getDbRecoveryCmd(dbDriver, dbHost, dbName, dbUsername, pwd, file.getAbsolutePath());

            // 创建进程构建器
            ProcessBuilder processBuilder = new ProcessBuilder();
            // window 用 cmd、linux 用 bash
            if (SystemUtil.getOsInfo().isWindows()) {
                processBuilder.command("cmd.exe", "/C", command); // 设置工作目录
            } else {
                processBuilder.command("/bin/bash", "-c", command); // 设置工作目录
            }
            // 启动进程
            Process process = processBuilder.start();
            log.info("还原执行命令:{}", command);

            // 获取子进程输出流、读取输出流内容
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            // 获取子进程输错误输出流、读取输出流内容
            BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                log.info(line);
            }
            String errorline;
            while ((errorline = errorReader.readLine()) != null) {
                log.warn(errorline);
            }
            if (process.waitFor() != 0) {
                return CommonResult.fail("数据恢复失败");
            }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/551668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day:007(3) | Python爬虫:高效数据抓取的编程技术(scrapy框架使用)

Scrapy 保存数据案例-小说保存 spider import scrapyclass XiaoshuoSpiderSpider(scrapy.Spider):name xiaoshuo_spiderallowed_domains [zy200.com]url http://www.zy200.com/5/5943/start_urls [url 11667352.html]def parse(self, response):info response.xpath(&qu…

react v18 项目初始化

按照以下命令进行傻瓜式操作即可&#xff1a; 全局安装脚手架工具&#xff1a; npm install -g create-react-app创建项目my-react-app&#xff1a; create-react-app my-react-app安装 antd: yarn add antd安装 react-router-dom&#xff1a; yarn add react-router-dom启动项…

幻兽帕鲁老板公开发声:腾讯正在制作幻兽帕鲁克隆版

昨天&#xff0c;Pocketpair的老板出来指责中国游戏公司抄袭了他们的游戏Palworld&#xff0c;说这简直是太不可思议了。 Pocketpair的CEO Takuro Mizobe发布了一个叫Auroria的游戏的截图&#xff0c;然后说&#xff1a;“腾讯正在制作Palworld的克隆游戏&#xff01;在中国&a…

10个你可能没听过但很好用的建筑设计AI工具

在之前的文章中我给大家介绍了很多Midjourney、Stable Diffusion的使用方法和对应的功能&#xff1a; Midjourney vs Stable Diffusion&#xff1a;提示相同&#xff0c;出图差距竟这么大&#xff01;哪个更适配你的工作&#xff1f;https://news.vsochina.com/cn/industry/64…

Java 基于微信小程序的医院预约挂号小程序(V3)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

基于SpringBoot的“商务安全邮箱”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“商务安全邮箱”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构 收件箱效果图 草稿箱效果图 已发送…

计算机网络实验实验之VLAN的配置与分析

实验目的 了解什么是带内管理&#xff1b;熟练掌握如何使用telnet方式管理交换机&#xff1b;熟练掌握如何为交换机设置web方式管理&#xff1b;熟练掌握如何进入交换机web管理方式&#xff1b;了解交换机web配置界面&#xff0c;并能进行部分操作。 (6)了解VLAN原理&#xf…

OpenHarmony南向开发案例:【智能门锁】

一. 简介 本demo是基于Openharmony 3.1 Beta本版开发&#xff0c;不仅可以接收数字管家应用下发的指令来控制门锁开启&#xff0c;而且还可以通过数字管家设置不同的开锁密码以及一次性密码&#xff0c;实现给临时用户一个临时密码&#xff0c;保证门户安全。当然除了开锁的功…

Shopee虾皮批量上传全球产品指南

当shopee虾皮需要大量上架新产品时&#xff0c;批量工具可以更好的提升效率。通过本指南&#xff0c;你将了解如何批量上传全球商品&#xff0c;本指南适用于所有站点。 一、什么是批量上传&#xff1f; 您可以通过【中国卖家中心>>全球商品>>批量上传】功能&…

部署ssm项目时遇到的一些错误

问题一&#xff1a;项目使用maven&#xff0c;打包完之后在idea启动不了 打包完之后在idea里面运行报错&#xff0c;提示找不到springmvc.xml配置文件。 再次clean后又可以运行了。 这是因为maven打包只会打包java文件&#xff0c;配置文件不进行打包&#xff0c;导致target-…

P1157 组合的输出 (dfs深搜)

题目连接&#xff1a;P1157 组合的输出 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a; AC代码&#xff1a; #include<iostream> #include<cstring>using namespace std;const int N 30; int st[N];//用来存这个数用没用过&#xff08;1~n个…

redmibook 14 2020 安装 ubuntu

1. 参考博客 # Ubuntu20.10系统安装 -- 小米redmibook pro14 https://zhuanlan.zhihu.com/p/616543561# ubuntu18.04 wifi 问题 https://blog.csdn.net/u012748494/article/details/105421656/# 笔记本电脑安装了Ubuntu系统设置关盖/合盖不挂起/不睡眠 https://blog.csdn.net/…

智慧公厕:打造城市品质生活的必备设施

公共厕所一直是城市管理中不可忽视的一环&#xff0c;而随着智慧科技的发展&#xff0c;智慧公厕逐渐成为改善城市品质生活的利器。智慧公厕作为一种创新的公共卫生设施&#xff0c;其带来的好处不仅体现在对公共厕所的全面监测和高效智慧化管理&#xff0c;更是为市民提供了更…

蓝桥杯第十五届javab组个人总结

javab组 额今天早上打完了得对自己此次比赛做总结&#xff0c;无论是明年还参赛还是研究生蓝桥杯&#xff0c;体验感有点差&#xff0c;第一题其实一开始想手算但怕进位导致不准确还是让代码跑了&#xff0c;但跑第202420242024个数&#xff08;被20和24整除&#xff09;一直把…

算法练习第18天|111.二叉树的最小深度

111.二叉树的最小深度 111. 二叉树的最小深度 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/ 题目描述&#xff1a; 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最…

bootstrap-select 搜索过滤输入中文问题,前2个字母输入转成空格

bootstrap是v3.3.7的 v1.6.3版本的bootstrap-select,注释以下2行 //that.$menu.find(li).filter(:visible:not(.divider)).eq(0).addClass(active).find(a).focus(); // $(this).focus();

Dryad Girl Fawnia

一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色,幻想或装扮游戏。 🔥 Dryad Girl | Fawnia 一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色…

工业控制(ICS)---COTP协议

COTP 可以理解为基于TCP的工控TCP&#xff0c;主要有五种类型&#xff1a; CR Connect Request (0x0e)——握手&#xff0c;发送方发送 CC Connect Confirm (0x0d)——握手&#xff0c;接收方发送 DT Data (0x0f)——传正常数据 UD User Data (0x04)——少见&#xff0c;传…

mysql多表查询时与子表的关系

力扣题目链接 如果最后一句代码不把a与两个表都进行连接的话会出现结果重复的问题

全网短剧搜索源码+短剧API接口 短剧下载 热门短剧 全开源可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 pc端h5手机端全网短剧搜索前端源码分享 内含7000短剧资源(不支持在线播放&#xff09; 搜索API接口&#xff1a;文件内查看 全部短剧API接口&#xff1a;文件内查看 每日更新API接…