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…

微信小程序前端获取OpenID和session_key

微信小程序前端获取OpenID和session_key code2Session: https://api.weixin.qq.com/sns/jscode2session?appidAPPID&secretSECRET&js_codeJSCODE&grant_typeauthorization_code wx.login({success: (res) > {console.log(res.code) //拿到codeuni.request({u…

docker搭建Medusa

Medusa 是一个为 Apache Cassandra 和 Scylla 数据库设计的数据备份工具&#xff0c;它支持多种存储后端&#xff0c;包括本地存储和云存储服务&#xff0c;如 Google Cloud Storage 和 Amazon S3。Medusa 使得数据库备份和恢复过程更加灵活和可靠。 功能介绍 高性能备份&…

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

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

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

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

请求的数据类型{ }{[ ]} 解析

一、案例区别 1.1源码 var saveInBrowserDeviceInfoStr localStorage.getItem(SaveInBrowserDeviceInfo); var saveInBrowserDeviceInfo;if (saveInBrowserDeviceInfoStr) {console.log(存放在浏览器的设备信息&#xff08;字符串&#xff09;&#xff1a; saveInBrowserDe…

黄仁勋最新访谈: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、从代…

Rust---泛型(Generics)

目录 泛型和多态泛型参数泛型的使用结构体中使用枚举中使用方法中使用函数中使用为特定的类型参数提供特定的方法实现泛型和多态 泛型允许在编写代码时使用抽象类型来代替具体类型,可以在不同的数据类型上工作,同时避免代码重复。通过泛型,我们可以编写一次代码,然后在需要…

AI编程工具助手

随着人工智能技术的发展&#xff0c;AI编程工具助手应运而生。 AI编程工具助手通过利用人工智能技术&#xff0c;尤其是机器学习和自然语言处理&#xff0c;来辅助软件开发过程中的代码编写、调试、优化等工作。这些工具通过提供代码补全、代码生成、代码审查、性能优化等功能…

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服务。用来处理用户登录请求…

eNSP 静态路由综合实验

eNSP静态路由综合实验涉及的知识点包括但不限于&#xff1a;IP地址配置、环回地址配置、合理进行子网汇总、缺省路由、空路由接口、浮动静态路由、ACL表规则撰写、动态NAT网络地址转换、端口映射、远程登陆等。在实验过程中&#xff0c;可能需要根据给定的拓扑结构和要求&#…

Flume配置案例@Source:端口,Channel:内存,Sink:控制台

vim /opt/module/flume/job/port_to_console.conf ------------------------- 在nc-flume-log.conf文件中添加如下内容。 # Name the components on this agent a1.sources r1 a1.sinks k1 a1.channels c1# Describe/configure the source a1.sources.r1.type netcat a1.so…

XGB-26:model

切片树模型|Slice tree model 当XGBoost中的 booster 参数设置为 gbtree 或 dart 时&#xff0c;算法构建了一个由多棵树组成的树模型。这个树模型可以被切片成多个子模型&#xff0c;每个子模型包含原始模型中一部分树。这个切片过程允许创建更小、更专业的模型&#xff0c;专…

每日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数据集上的图像分…