如题,由于项目需要,研究并实现了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。