如题,由于项目需要,研究并实现了java web的 mysql数据库的备份、下载、恢复功能,中间遇到一些问题,耗费了不少时间,下面让我一一道来:
背景介绍:
window 7系统
mysql 5.7
eclipse
spring mvc
tomcat 7
jdk 1.7
先上代码:
使用mysql的mysqldump 命令进行备份。
/**
* Java代码实现MySQL数据库备份
*
* @author lgc
* @param hostIP
* MySQL数据库所在服务器地址IP
* @param userName
* 进入数据库所需要的用户名
* @param password
* 进入数据库所需要的密码
* @param savePath
* 数据库导出文件保存路径
* @param fileName
* 数据库导出文件文件名
* @param databaseName
* 要导出的数据库名
* @return 返回true表示导出成功,否则返回false。
*/
public static boolean exportDatabaseTool(String hostIP, String userName, String password, String savePath,
String fileName, String databaseName) throws InterruptedException {
boolean fa = false;
File saveFile = new File(savePath);
if (!saveFile.exists()) {// 如果目录不存在
saveFile.mkdirs();// 创建文件夹
}
if (!savePath.endsWith(File.separator)) {
savePath = savePath + File.separator;
}
PrintWriter printWriter = null;
try {
printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(savePath + fileName), "utf8"));
String backup = "mysqldump -h" + hostIP + " -u" + userName + " -p" + password + " " + databaseName
+ " --set-charset=UTF8 ";
String path = "E:\\";//这里是你复制的mysqldump.exe所在的文件目录下
String commad = "cmd /c " + path + backup + ">" + savePath + fileName;
System.out.println(commad);
Runtime.getRuntime().exec(commad);
fa = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (printWriter != null) {
printWriter.close();
}
}
return fa;
}
恢复备份:
// 数据库恢复
public static void load(String filename) {
try {
String path = "E:\\";
String commad = "cmd /c " + path+"mysql -u root -pcisoft jeecms ";
Runtime rt = Runtime.getRuntime();
// 调用 mysql 的 cmd:
Process child = rt.exec(commad);
OutputStream out = child.getOutputStream();//控制台的输入信息作为输出流
String inStr;
StringBuffer sb = new StringBuffer("");
String outStr;
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(filename), "utf8"));
while ((inStr = br.readLine()) != null) {
sb.append(inStr + "\r\n");
}
outStr = sb.toString();
OutputStreamWriter writer = new OutputStreamWriter(out, "utf8");
writer.write(outStr);
// 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免
writer.flush();
// 别忘记关闭输入输出流
out.close();
br.close();
writer.close();
System.out.println("/* Load OK! */");
} catch (Exception e) {
e.printStackTrace();
}
}
坑一:
mysql 安装在c盘默认路径下,Program Files 文件夹名称之间有空格,导致程序明明运行一切正常,就是无法导出数据,文件大小始终为0kb。
解决办法: