springboot 人大金仓 kingbase-备份还原,命令中带密码

命令带密码参考

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

1、工具类

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

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("数据恢复失败");
            }

 

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

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

相关文章

【漏洞复现】WordPress LayerSlider插件SQL注入漏洞复现

声明&#xff1a;亲爱的读者&#xff0c;我们诚挚地提醒您&#xff0c;Aniya网络安全的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失&#xff0c;均由使用者自行承担责任。Aniya网络安全及作者对此概不负责。如有侵权&#…

PostgreSQL入门到实战-第二十七弹

PostgreSQL入门到实战 PostgreSQL中数据分组操作(二)官网地址PostgreSQL概述PostgreSQL中HAVING命令理论PostgreSQL中HAVING命令实战更新计划 PostgreSQL中数据分组操作(二) 使用PostgreSQL HAVING子句来指定组或聚合的搜索条件 官网地址 声明: 由于操作系统, 版本更新等原因…

驾校驾考全科语音矩阵版h5微信抖音QQ快手小程序app开源版开发

驾校驾考全科语音矩阵版h5微信抖音QQ快手小程序app开源版开发 支持SAAS、支持独立加密、支持独立开源、价格不同。 自带数据&#xff0c;后台一键初始。 驾考系统 微信公众号微信小程序抖音小程序可打包APP 所有车型全覆盖、2024全科题目、语音讲解、模拟考试等等 这是一款什…

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

NL2SQL实践系列(1)&#xff1a;深入解析Prompt工程在text2sql中的应用技巧 NL2SQL基础系列(1)&#xff1a;业界顶尖排行榜、权威测评数据集及LLM大模型&#xff08;Spider vs BIRD&#xff09;全面对比优劣分析[Text2SQL、Text2DSL] NL2SQL基础系列(2)&#xff1a;主流大模型…

OSPF动态路由实验(思科)

华为设备参考&#xff1a; 一&#xff0c;技术简介 OSPF&#xff08;Open Shortest Path First&#xff09;是一种内部网关协议&#xff0c;主要用于在单一自治系统内决策路由。它是一种基于链路状态的路由协议&#xff0c;通过链路状态路由算法来实现动态路由选择。 OSPF的…

蓝桥杯真题演练:2023B组c/c++

日期统计 小蓝现在有一个长度为 100 的数组&#xff0c;数组中的每个元素的值都在 0 到 9 的范围之内。 数组中的元素从左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 …

LeetCode 热题 HOT 100(P31~P40)

系列文章&#xff1a; LeetCode 热题 HOT 100(P1~P10)-CSDN博客 LeetCode 热题 HOT 100(P11~P20)-CSDN博客 LeetCode 热题 HOT 100(P21~P30)-CSDN博客 LeetCode 热题 HOT 100(P31~P40)-CSDN博客 LC76minimum_window . - 力扣&#xff08;LeetCode&#xff09; 题目&…

设计一个通知系统

设计的系统支持不同类型消息的发送&#xff0c;例如push消息&#xff0c;sms消息和邮箱消息&#xff0c;能够支持千万级别的发送&#xff0c;保证消息推送的幂等性。系统结构图如下&#xff1a; 系统架构图中各组件作用说明&#xff1a; device/setting/user info&#xff1a;…

反向迭代器的底层

文章目录 1.迭代器分类2.迭代器使用3.模拟实现迭代器3.1 各个类的迭代器3.2 所有容器的迭代器(迭代器适配器) 1.迭代器分类 迭代器按照定义方式分成以下四种。 正向迭代器&#xff0c;定义方法如下&#xff1a; 容器类名::iterator 迭代器名; 常量正向迭代器&#xff0c;定…

Swagger转换成Excel文件

1、添加swagger解析依赖包&#xff1a; <dependency><groupId>io.swagger.parser.v3</groupId><artifactId>swagger-parser</artifactId><version>2.1.12</version></dependency>2、示例代码&#xff1a; package com.rlclou…

第十四届蓝桥杯题解:平方差 ,更小的数,买瓜,网络稳定性(货车运输)

目录 平方差 更小的数 买瓜 网络稳定性&#xff08;货车运输&#xff09; 货车运输 平方差 这道题就是数论的题&#xff0c;不难想到一个数m可以拆成(a-b)(ab)&#xff0c;其实(a-b)和(ab)就是m的一对因子&#xff0c;不妨设为x和y。 则有&#xff1a; abx; a-by; x*ym; 联…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.7 总账模块报表 -2.7.1 对外报表:资产负债表及利润表

总账模块报表既包括对外报告的资产负债表、损益表、现金流量表&#xff0c;也包括企业自身用于查询和分析的各类报表&#xff0c;如科目余额表等。 2.7.1 对外报表&#xff1a;资产负债表及利润表 在SAP中&#xff0c;出具资产负债表和利润表的标准方法是先在后台建立一套“会…

大模型化身数据魔法师,降低NLP高置信误判

关注公众号【AI论文解读】回复: 论文解读 获取本文论文 引言&#xff1a;NLP模型的高置信错误与脆弱性问题 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;模型的预测性能优化往往伴随着高置信错误&#xff08;high confidence errors&#xff09;的产生&#x…

【MATLAB源码-第49期】基于蚁群算法(ACO)算法的栅格路径规划,输出最佳路径图和算法收敛曲线图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚁群算法是一种模拟自然界蚂蚁觅食行为的启发式优化算法。在蚁群系统中&#xff0c;通过模拟蚂蚁之间通过信息素沟通的方式来寻找最短路径。 在栅格路径规划中&#xff0c;蚁群算法的基本步骤如下&#xff1a; 1. 初始化: …

LeetCode-热题100:104. 二叉树的最大深度

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a; root [3,9,20,null,null,15,7] 输出&#xff1a; 3 示例 2&#xff1a; 输入&#xff1a; root …

直驱式风电机组的发电机和双馈风电机组的发电机发电机generator的区别

直驱式风电机组的发电机和双馈风电机组的发电机在结构和工作原理上有明显的区别&#xff1a; 直驱式风电机组的发电机&#xff1a; 结构简单&#xff0c;通常由永磁同步发电机构成。直接将风轮的转动与发电机的转子连接&#xff0c;无需传动系统。没有齿轮箱&#xff0c;因此减…

GPT图解:大模型是怎样构建的,书籍PDF分享

今天又来给大家推荐一本大模型方面的书籍<GPT图解:大模型是怎样构建的>本书将以生动活泼的笔触&#xff0c;将枯燥的技术细节化作轻松幽默的故事和缤纷多彩的图画&#xff0c;引领读者穿梭于不同技术的时空&#xff0c;见证自然语言处理技术的传承、演进与蜕变。 在这本…

求存款本息和(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;double P 1000, r1 0.015, r2 0.021, r3 0.0275, r4 0.03, r5 0.0035;int judge 0;//…

【C语言】——字符串函数的使用与模拟实现(上)

【C语言】——字符串函数 前言一、 s t r l e n strlen strlen 函数1.1、函数功能1.2、函数的使用1.3、函数的模拟实现&#xff08;1&#xff09;计数法&#xff08;2&#xff09;递归法&#xff08;3&#xff09;指针 - 指针 二、 s t r c p y strcpy strcpy 函数2.1、函数功能…

Go语言开发工具Vscode配置

Go语言开发工具Vscode配置方法分享&#xff1a; 1.下载安装vscode https://code.visualstudio.com/ 2.汉化vscode 3.vscode中安装Go语言插件 源自&#xff1a;大地老师Golang语言beego入门实战视频教程下载地址