我想在 mysql 5.6 中备份数据库。
为此,我使用这种方法:
public boolean backupDB(String dbName, String dbUserName, String dbPassword, String path) {
String executeCmd = "D://mysql-5.6.11-win32/bin/mysqldump -u " + dbUserName + " -p" + dbPassword
+ " --add-drop-database -B " + dbName + " -r " + path;
Process runtimeProcess;
try {
runtimeProcess = Runtime.getRuntime().exec(executeCmd);
// any error message?
StreamGobbler errorGobbler = new StreamGobbler(runtimeProcess.getErrorStream(), "ERR");
// any output?
StreamGobbler outputGobbler = new StreamGobbler(runtimeProcess.getInputStream(), "OUT");
// kick them off
errorGobbler.start();
outputGobbler.start();
int processComplete = runtimeProcess.waitFor();
if (processComplete == 0) {
System.out.println("Backup created successfully");
return true;
} else {
System.out.println("Could not create the backup");
}
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
StreamGobbler 是包装runtimeProcess.getErrorStream()
并runtimeProcess.getInputStream()
进入 BufferedReader 的线程。readLine()
BufferedReader 只是使用方法逐行读取。这是我在这篇文章中得到的提示。
我的问题是方法 backupDB 挂在这一行:
int processComplete = runtimeProcess.waitFor();
如果我用 exitValue 替换 waitFor 方法,我会收到错误
java.lang.IllegalThreadStateException: process has not exited
因此我必须使用 waitFor 方法。不幸的是,它永远运行。我必须按 Eclipse 控制台上的红色图标来停止 JVM。
如何使过程完成并备份mysql数据库?这个解决了谢谢!
编辑要启动 mysqldump.exe 我需要写完整的路径:
String executeCmd = "D://mysql-5.6.11-win32/bin/mysqldump -u "
你不知道如何摆脱完整的路径。我想在计算机上的 mysqldump.exe 位置独立启动 mysqldump。
也许有一种方法可以获取具有所有连接详细信息的 mysqldump.exe 的路径。
编辑如果我尝试使用没有完整路径的 mysqldump 到 mysqldump.exe 我收到此异常:
java.io.IOException: Cannot run program "mysqldump": CreateProcess error=2, Íå óäàåòñÿ íàéòè óêàçàííûé ôàéë
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
at java.lang.Runtime.exec(Runtime.java:615)
at java.lang.Runtime.exec(Runtime.java:448)
at java.lang.Runtime.exec(Runtime.java:345)
at dbViewer.model.ConnectionManager.backupDB(ConnectionManager.java:273)
at dbViewer.model.ConnectionManager.main(ConnectionManager.java:337)
Caused by: java.io.IOException: CreateProcess error=2, Íå óäàåòñÿ íàéòè óêàçàííûé ôàéë
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(ProcessImpl.java:189)
at java.lang.ProcessImpl.start(ProcessImpl.java:133)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1021)
... 5 more
谢谢!