java - 从 java 应用程序备份 MySQL 数据库
问题描述
我正在尝试从我的 Java 应用程序备份我的 MySQL 数据库。这是代码:
String executeCmd = "mysqldump.exe -u " + dbUser + " -p" + dbPass;
executeCmd += " --all-databases > " + savePath;
System.out.println(executeCmd);
Runtime.getRuntime().exec(executeCmd);
但它什么也没做。如果我复制 System.out.println 的输出并将其粘贴到 cmd 中,它可以正常工作。有人可以说Java有什么问题吗?
解决方案
我强烈建议您阅读JavaWorld 上有关Runtime.getRuntime()
. 长话短说,您的代码有两个主要问题。首先,您没有等待流程完成,其次您没有处理该流程的输出。从上面的文章中提取以下部分代码,我们可以编写一个应该可以工作的版本:
try {
Runtime rt = Runtime.getRuntime();
String executeCmd = "mysqldump.exe -u " + dbUser + " -p" + dbPass;
executeCmd += " --all-databases > " + savePath;
Process proc = rt.exec(executeCmd);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<ERROR>");
while ( (line = br.readLine()) != null)
System.out.println(line);
System.out.println("</ERROR>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
}
catch (Throwable t) {
t.printStackTrace();
}
如果如您所说,从您运行此代码的同一台机器上调用mysqldump
成功,则不应出现错误警告。如果有任何错误,那么上面的代码片段应该能让你很好地了解它们是什么,并处理它们。
推荐阅读
- c# - 空列表上的模型验证失败
- lua - D/Dlang:Lua 接口,有什么方法可以强制用户无法访问中间对象?
- r - R plotly,将刻度更改为斜体
- css - 如何将 textarea 和 text inut 放在收音机旁边?
- reactjs - gatsby-plugin-transition-link AniLink Cover 选项没有足够快地隐藏上一页
- tensorflow - 如何在 gpflow 中打印输出(张量值、形状)?
- angular - routerLink时如何不绕过必填字段
- pdftables - 是否可以在 PDFTables 包中转换图像 pdf
- php - 用php创建json数组
- java - 检查列是否包含缺失值