之前写过一篇关于java mysql数据库备份与恢复的文章,但是在恢复数据库的时候有bug。在数据稍微多一点的时候,会出现恢复导入的数据不完整的情况。
不完整的原因线程过早的结束了,没有完全导入数据。其根本原因是什么呢?在网上收集了很多资料,都没有解释清楚,所以这里不讨论,知道的朋友可以留言告知,谢谢!
现在给出一种解决方案,就是建一个脚本或者批处理文件,用Java程序执行这个文件,通过读取程序输入流来判断数据是否导入结束,及脚本是否执行完成,拿window批处理文件举例:
命名为:import.bat,内容如下,其中%?%为参数。
set host=%1% set username=%2% set password=%3% set port=%4% set database=%5% set file=%6% mysql -h%host% -u%username% -p%password% -P%port% %database% < %file%
Java程序直接执行这个批处理文件,其中参数不要传错了,以批处理文件中的参数对齐:
public boolean recovery(Map<String, String> params) throws Exception {
String filePath = "需要恢复导入的sql文件全路径";
Process process = null;
try {
Runtime runtime = Runtime.getRuntime();
process = runtime.exec("批处理文件.bat全路径"
+ " " + host
+ " " + username
+ " " + password
+ " " + port
+ " " + database
+ " " + filePath
);
StringBuilder sb = new StringBuilder();
InputStream in = process.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = bufferedReader.readLine()) != null) {
sb.append(line + "\n");
}
in.close();
try {
process.waitFor();
} catch (InterruptedException e) {
System.out.println(e);
}
System.out.println(sb.toString());
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (process != null) {
process.destroy();
}
}
}
有兴趣的朋友可以研究一下,给出更好的解决方案。