前几天应用户需求,用户可以手动进行数据库的备份,并且需要适配达梦数据库。
因为需要调用数据库的驱动来进行数据库的备份以及还原,所以这里我是通过脚本的方式来操作,并且使用了ProcessBuilder processBuilder = new ProcessBuilder();
来执行脚本,
dm的备份语句为:D:\DM\bin\dexp.exe data/data@LOCALHOST:5236 DIRECTORY=E:\data\base FILE=full.dmp SCHEMAS="test"
D:\DM\bin\是数据库所在的目录,
data/data 是数据库的账号和密码,
@LOCALHOST:5236 IP地址以及端口号
DIRECTORY= 备份的路劲
FILE= 备份文件的名称
SCHEMAS= 备份的数据库名称
这里为了避免在Linux环境下,文件夹没有权限,所以这里通过这种方式来赋给文件访问权限。
详细代码如下,也希望大神们给我一些优化的建议嘿嘿嘿
dexp 逻辑导出 | 达梦技术文档 (dameng.com)
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("chmod","777",patch.get("fileBackupPath"));
processBuilder.start().waitFor();
StringBuilder stringBuilder = new StringBuilder();
String scriptFile = null;
String fileBackupPath = null;
if (patch.get("osName").contains("Windows")) {
scriptFile = stringBuilder.append(patch.get("databasePath"))
.append("dexp.exe ")
.append(hostUrl.get("userName"))
.append("/")
.append(hostUrl.get("password"))
.append("@")
.append(hostUrl.get("host"))
.append(":")
.append(hostUrl.get("port"))
.append(" DIRECTORY=")
.append(patch.get("fileBackupPath"))
.append(" FILE=")
.append(patch.get("FileBackupName"))
.append(" SCHEMAS=")
.append("\"")
.append(hostUrl.get("databaseName"))
.append("\"")
.toString();
fileBackupPath=patch.get("fileBackupPath")+"/temporary/dexp.bat";
patch.put("scriptFilePath",fileBackupPath);
FileWriter script = new FileWriter(fileBackupPath);
script.write(scriptFile);
script.close();
} else if (patch.get("osName").contains("Linux")) {
// 防止没有权限先进行授权
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("chmod","777",patch.get("fileBackupPath"));
processBuilder.start().waitFor();
scriptFile = stringBuilder.append(patch.get("databasePath"))
.append("dexp ")
.append(hostUrl.get("userName"))
.append("/")
.append(hostUrl.get("password"))
.append("@")
.append(hostUrl.get("host"))
.append(":")
.append(hostUrl.get("port"))
.append(" DIRECTORY=")
.append(patch.get("fileBackupPath"))
.append(" FILE=")
.append(patch.get("FileBackupName"))
.append(" SCHEMAS=")
.append("\"")
.append(hostUrl.get("databaseName"))
.append("\"")
.toString();
fileBackupPath=patch.get("fileBackupPath")+"/temporary/dexp.sh";
patch.put("scriptFilePath",fileBackupPath);
FileWriter script = new FileWriter(fileBackupPath);
script.write(scriptFile);
script.close();
} else {
throw new RuntimeException("其他版本没有进行适配");
}
System.out.println("开始执行备份命令");
ProcessBuilder processBuilder = new ProcessBuilder(fileBackupPath);
Process process = processBuilder.start();
processBuilder.redirectErrorStream(true);
processBuilder.inheritIO(); // 将输出流和错误流合并到当前Java进程
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
StringBuilder errorOutput = new StringBuilder();
while ((line = reader.readLine()) != null) {
errorOutput.append(line).append("\n");
}
//启动进程并等待执行完成
int execute = process.waitFor();
if(execute!=0){
throw new RuntimeException("数据库还原失败"+execute+"\nError output"+errorOutput.toString());
}