java实现mysql数据库的一键备份,还原

    最近项目里要实现一个数据库一键备份的功能,在网上找了好多类似的教程,也做了很多测试,发现网上好多教程都没有通过测试,也不符合实际的用途,于是整理了一个工具类,把他分享出来,希望能帮助到各位道友

package com.lanyuan.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 数据库一键备份的工具类
 * 实现数据库的一键备份和还原
 * 
 */
public class DataBaseUtil {

	/*
	 * @功能说明:数据库一键备份
	 * @作者:郑智聪
	 * @时间:2018-9-6
	 */
	public static void backup() {
		  try {
			//为了区分,把上一次备份的sql文件改名,文件名后面加时间  
			File oldfile = new File("d:/ssi_spring_security.sql");
			// 文件所在路径(一定要写,否则改名操作将把原文件删除)
		   	String p = oldfile.getParent();   
		   	SimpleDateFormat sdf = new SimpleDateFormat("HH-mm-ss");
		   	Date date = new Date();
		   	String time=sdf.format(date);
		    System.out.println(time);
	        File nf = new File(p + File.separatorChar+"ssi_spring_security"+time+".sql");   
	        if(oldfile.renameTo(nf))   
	        {   
	          System.out.println("修改成功!");   
	        }   
	        else   
	        {   
	          System.out.println("修改失败");   
	        }  
		  
	
		   Runtime rt = Runtime.getRuntime();

		   // 调用mysql的安装目录的命令,这里的root是数据库用户名,123456是数据库密码
           //注:在这里使用的mysql命令,必须配置mysql的环境变量,否则不成功,配置环境变量的方法可以自行百度,这里不做赘述
		   Process child = rt
		     .exec("mysqldump -u root -p123456 -R -c --set-charset=utf8 ssi_spring_security");
		   // 设置导出编码为utf-8。这里必须是utf-8
		   // 把进程执行中的控制台输出信息写入.sql文件,即生成了备份文件。注:如果不对控制台信息进行读出,则会导致进程堵塞无法运行
		   InputStream in = child.getInputStream();// 控制台的输出信息作为输入流

		   InputStreamReader xx = new InputStreamReader(in, "utf-8");
		   // 设置输出流编码为utf-8。这里必须是utf-8,否则从流中读入的是乱码

		   String inStr;
		   StringBuffer sb = new StringBuffer("");
		   String outStr;
		   // 组合控制台输出信息字符串
		   BufferedReader br = new BufferedReader(xx);
		   while ((inStr = br.readLine()) != null) {
		    sb.append(inStr + "\r\n");
		   }
		   outStr = sb.toString();

		   // 要用来做导入用的sql目标文件:
		   String sqlFile = "d:/ssi_spring_security.sql";
		   FileOutputStream fout = new FileOutputStream(sqlFile);
		   OutputStreamWriter writer = new OutputStreamWriter(fout, "utf-8");
		   
		   writer.write(outStr);
		   // 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免
		   writer.flush();
		   
		   //关闭输入输出流
		   in.close();
		   xx.close();
		   br.close();
		   writer.close();
		   fout.close();
		   System.out.println("数据库备份成功");
		   }catch (Exception e) {
			  e.printStackTrace();
		  	}
	}

		/*
		 * @功能说明:数据库一键备份
		 * @作者:郑智聪
		 * @时间:2018-9-6
		 */
		 public static void load() {
		  try {
		   //数据库备份的sql文件的地址
		   String fPath = "d:/ssi_spring_security.sql";
		   Runtime rt = Runtime.getRuntime();

		   // 调用 mysql命令行
		   Process child = rt.exec("mysql -u root -p123456 --default-character-set=utf8 ssi_spring_security"); 
		   //控制台的输入信息作为输出流
		   OutputStream out = child.getOutputStream();
		   String inStr;
		   
		   StringBuffer sb = new StringBuffer("");
		   String outStr;
		   
		   BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fPath), "utf-8"));
		   
		   while ((inStr = br.readLine()) != null) {
			   	sb.append(inStr + "\r\n");
		   }
		   
		   outStr = sb.toString();
		   
		   OutputStreamWriter writer = new OutputStreamWriter(out, "utf-8");
		   //将读取出的输出流写进去
		   writer.write(outStr);
		   // 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免
		   writer.flush();
		   //关闭输入输出流
		   out.close();
		   br.close();
		   writer.close();
		   System.out.println("数据库恢复成功");
		  } catch (Exception e) {
		   e.printStackTrace();
		  }
		 }

}

亲自测试,能够正常使用,导入项目后,在接口里调用即可。

你可能感兴趣的:(数据库,Java)