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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue实现文字转语音的组件,class类封装,实现项目介绍文字播放(2024-04-17)

1、项目界面截图 2、封装class类方法&#xff08;实例化调用&#xff09; // 语音播报的函数 export default class SpeakVoice {constructor(vm, config) {let that thisthat._vm vmthat.config {text: 春江潮水连海平&#xff0c;海上明月共潮生。滟滟随波千万里&#xf…

开展在即!中银富登邀您共赴雄安2024数字城市展览会(雄安建博会)

中银富登村镇银行&#xff1a;雄安新区金融创新的领航者 在即将举办的2024雄安数字城市建设展览会上&#xff0c;中银富登村镇银行将以其在金融创新和普惠金融服务领域的卓越表现&#xff0c;成为展会的一大亮点。作为雄安新区首家全国性银行业金融机构总部&#xff0c;中银富…

DolphinScheduler 调度工作流报错 Host key verification failed.

文章目录 出现问题错误原因及解决方法1.SSH 免密登录配置失败、失效2.不存在该租户 建议 出现问题 在执行调度任务时&#xff0c;失败了&#xff0c;查看日志发现错误 —— Host key verification failed. 错误原因及解决方法 1.SSH 免密登录配置失败、失效 这种情况就检查…

黄仁勋最新访谈:GPU性能的革命性提升与AI未来

近期&#xff0c;英伟达CEO黄仁勋与美国CNBC知名主持人、股评人吉姆克莱默&#xff08;Jim Cramer&#xff09;在《Mad Money》节目中展开了一场关于技术未来和人工智能的对话。访谈里&#xff0c;黄仁勋不仅提到了英伟达在过去八年中将AI算力性能提高1000倍&#xff0c;还预言…

程序中调用DB存储过程记得异常处理时尝试回滚可能存在的事务

程序中调用DB过程要注意这种情况&#xff1a; 有些存储过程需要执行比较久&#xff0c;在数据库中直接跑本身没有出错&#xff0c;但从程序中调用该存储过程会由于超时进入程序异常处理&#xff0c;这时数据库后台依然在跑着该存储过程&#xff0c;如果该存储过程中有启用事务…

Linux:如何删除指定时间之前修改的文件

1、与文件有关的时间 在说明如何删除符合这种要求的文件之前&#xff0c;先来看看与文件有关的有哪些时间 简名全名中文名含义atimeaccess time访问时间文件中的数据最后被访问的时间mtimemodify time修改时间文件中的数据最后被修改的时间ctime change time变化时间文件的元…

对装饰器模式的理解

目录 一、场景二、面对场景中的新需求&#xff0c;我们怎么办&#xff1f;1、暴力法&#xff1a;直接修改原有的代码。2、子类继承法&#xff1a;既然要增强行为&#xff0c;那我搞一个子类&#xff0c;覆写不就完事了&#xff1f;3、装饰器模式 三、对装饰器模式的思考1、从代…

Linux中进程和计划任务

一.程序 1.什么是程序 &#xff08;1&#xff09;是一组计算机能识别和执行的指令&#xff0c;运行于电子计算机上&#xff0c;满足人们某种需求的信息化工具 &#xff08;2&#xff09;用于描述进程要完成的功能&#xff0c;是控制进程执行的指令集 二.进程 1.什么是进程…

Go 单元测试之HTTP请求与API测试

文章目录 一、httptest1.1 前置代码准备1.2 介绍1.3 基本用法 二、gock2.1介绍2.2 安装2.3 基本使用2.4 举个例子2.4.1 前置代码2.4.2 测试用例 一、httptest 1.1 前置代码准备 假设我们的业务逻辑是搭建一个http server端&#xff0c;对外提供HTTP服务。用来处理用户登录请求…

每日OJ题_01背包④_力扣1049. 最后一块石头的重量 II

目录 力扣1049. 最后一块石头的重量 II 问题解析 解析代码 滚动数组优化代码 力扣1049. 最后一块石头的重量 II 1049. 最后一块石头的重量 II 难度 中等 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从…

数字乳腺癌组织病理学图像分类的Vision Transformer及其变体

Vision Transformer作为一种基于自注意力机制的高效图像分类工具被提出。近年来出现了基于Poolingbased Vision Transformer (PiT)、卷积视觉变压器(CvT)、CrossFormer、CrossViT、NesT、MaxViT和分离式视觉变压器(SepViT)等新模型。 它们被用于BreakHis和IDC数据集上的图像分…

软件项目管理 - PERT 图

文章目录 1 概述1.1 PERT 图1.2 基础概念 2 相关计算2.1 最早时刻2.2 最迟时刻2.3 关键路径2.4 松弛时间 1 概述 1.1 PERT 图 PERT&#xff1a;Program Evaluation and Review Technique&#xff08;项目评估与评审技术&#xff09; PERT 图是一个有向图&#xff0c;图中的箭…

【c++】stack和queue使用 stack和queue模拟实现

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1. stack的介绍和使用 1.1 stack的介绍 1.2 stack的使用 1.3 stack的模拟实现 2. queue的介绍和使用 2.1 queue的介绍 2.2 queue的…

SpringBoot之JWT令牌校验

SpringBoot之JWT令牌校验 本文根据黑马b站springboot3vue3课程 JWT &#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在不同实体之间安全地传输信息。它由三个部分组成&#xff1a;头部&#xff08;Header&#xff09;…

如何实现音乐音频合并?分享3种简单的合并技巧!音频合并的方法

音乐合并&#xff0c;作为一种音乐创作与编辑的手法&#xff0c;已经逐渐在音乐制作领域占据了一席之地。音乐合并不仅是对音乐元素的重新组合&#xff0c;更是对音乐内涵的深化和拓展。它可以将不同的音乐风格和元素巧妙地融合在一起&#xff0c;创造出全新的听觉体验。 一&a…

DonkeyDocker-v1-0渗透思路

MY_BLOG https://xyaxxya.github.io/2024/04/13/DonkeyDocker-v1-0%E6%B8%97%E9%80%8F%E6%80%9D%E8%B7%AF/ date: 2024-04-13 19:15:10 tags: 内网渗透Dockerfile categories: 内网渗透vulnhub 靶机下载地址 https://www.vulnhub.com/entry/donkeydocker-1,189/ 靶机IP&a…

芯片设计围炉札记

文章目录 语言Verilog 和 VHDL 区别 芯片验证 语言 System Verilog的概念以及与verilog的对比 IC 设计软件分析 Verilog 和 VHDL 区别 Verilog HDL 和 VHDL 的区别如下&#xff1a; 语法结构&#xff1a;Verilog的语法结构类似于C语言&#xff0c;而VHDL的语法结构则更接近…

苍穹外卖学习记录(一)

1.JWT令牌认证 JSON Web Token (JWT)是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。 JWT是目前最常用的一种令牌规范&#xff0c;它最…

QT-编译报库错误(LF/CRLF)

QT-安装后环境问题记录 版本和环境问题 版本和环境 QT5.15.2 Windows10 QT Creator 问题 在QT夸端开发的项目中 &#xff0c;使用QTCreator打开项目pro文件&#xff0c;编译报出很多系统库 及本地文件中的一些问题&#xff0c;具体如图&#xff1a; 后续&#xff0c;我以为…