如何用Java实现MySQL数据库的备份和恢复

MySQL的一些前台工具是有备份恢复功能的,可是如何在我们的应用程序中实现这一功能呢?本文提供了示例代码来说明如何使用Java代码实现MySQL数据库的备份恢复。

 

本次实现是使用了MySQL数据库本身提供的备份命令mysqldump和恢复命令mysql,在java代码中通过从命令行调用这两条命令来实现备份和恢复。备份和恢复所使用的文件都是sql文件。

 

本代码是参照网上某网友提供的源码完成的。

package xxx.utils; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; /** * MySQL数据库的备份与恢复 缺陷:可能会被杀毒软件拦截 * * @author xxx * @version xxx */ public class DatabaseBackup { /** MySQL安装目录的Bin目录的绝对路径 */ private String mysqlBinPath; /** 访问MySQL数据库的用户名 */ private String username; /** 访问MySQL数据库的密码 */ private String password; public String getMysqlBinPath() { return mysqlBinPath; } public void setMysqlBinPath(String mysqlBinPath) { this.mysqlBinPath = mysqlBinPath; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public DatabaseBackup(String mysqlBinPath, String username, String password) { if (!mysqlBinPath.endsWith(File.separator)) { mysqlBinPath = mysqlBinPath + File.separator; } this.mysqlBinPath = mysqlBinPath; this.username = username; this.password = password; } /** * 备份数据库 * * @param output * 输出流 * @param dbname * 要备份的数据库名 */ public void backup(OutputStream output, String dbname) { String command = "cmd /c " + mysqlBinPath + "mysqldump -u" + username + " -p" + password + " --set-charset=utf8 " + dbname; PrintWriter p = null; BufferedReader reader = null; try { p = new PrintWriter(new OutputStreamWriter(output, "utf8")); Process process = Runtime.getRuntime().exec(command); InputStreamReader inputStreamReader = new InputStreamReader(process .getInputStream(), "utf8"); reader = new BufferedReader(inputStreamReader); String line = null; while ((line = reader.readLine()) != null) { p.println(line); } p.flush(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } if (p != null) { p.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 备份数据库,如果指定路径的文件不存在会自动生成 * * @param dest * 备份文件的路径 * @param dbname * 要备份的数据库 */ public void backup(String dest, String dbname) { try { OutputStream out = new FileOutputStream(dest); backup(out, dbname); } catch (FileNotFoundException e) { e.printStackTrace(); } } /** * 恢复数据库 * * @param input * 输入流 * @param dbname * 数据库名 */ public void restore(InputStream input, String dbname) { String command = "cmd /c " + mysqlBinPath + "mysql -u" + username + " -p" + password + " " + dbname; try { Process process = Runtime.getRuntime().exec(command); OutputStream out = process.getOutputStream(); String line = null; String outStr = null; StringBuffer sb = new StringBuffer(""); BufferedReader br = new BufferedReader(new InputStreamReader(input, "utf8")); while ((line = br.readLine()) != null) { sb.append(line + "/r/n"); } outStr = sb.toString(); OutputStreamWriter writer = new OutputStreamWriter(out, "utf8"); writer.write(outStr); writer.flush(); out.close(); br.close(); writer.close(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 恢复数据库 * * @param dest * 备份文件的路径 * @param dbname * 数据库名 */ public void restore(String dest, String dbname) { try { InputStream input = new FileInputStream(dest); restore(input, dbname); } catch (FileNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) { Configuration config = HibernateSessionFactory.getConfiguration(); String binPath = config.getProperty("mysql.binpath"); String userName = config.getProperty("connection.username"); String pwd = config.getProperty("connection.password"); DatabaseBackup bak = new DatabaseBackup(binPath, userName, pwd); bak.backup("c:/ttt.sql", "ttt"); bak.restore("c:/ttt.sql", "ttt"); } }

 

最后的main方法只是一个简单的使用方法的示例代码。

本人所做的项目是使用了hibernate的,而这里需要提供MySQL的bin路径和用户名、密码,而hibernate.cfg.xml中本身就是需要配置数据库的用户名和密码,所以我把MySQL的bin路径也直接配置到了这个文件里面,也不需要创建专门的配置文件,不需要写读取配置文件的接口了。

如果不明白,可以去看hibernate.cfg.xml的说明,里面是可以配置其他的property的。

 

 

 

你可能感兴趣的:(Database)