Java备份还原Mysql数据库

时间:2022-07-11 08:22:09

参考网络多处资料,最总自己总结
环境要求:Mysql 5.0以上数据库,配置Mysql的环境变量


///实体类

package com.ews.util;
/**
 * 系统备份展示对象
 * 
 * */
public class DataFile {
 private String fileName;//备份文件的名称
 private String fileDate;//备份文件的日期
 private String filePath;//备份文件的地址
 private String fileSize;//备份文件的大小
 public String getFileSize() {
  return fileSize;
 }
 public void setFileSize(String fileSize) {
  this.fileSize = fileSize;
 }
 public String getFileName() {
  return fileName;
 }
 public void setFileName(String fileName) {
  this.fileName = fileName;
 }
 public String getFileDate() {
  return fileDate;
 }
 public void setFileDate(String fileDate) {
  this.fileDate = fileDate;
 }
 public String getFilePath() {
  return filePath;
 }
 public void setFilePath(String filePath) {
  this.filePath = filePath;
 }
}


///实现备份代码
package com.ews.action;


import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.sql.Date;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;


import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.fileupload.FileItem;
import org.apache.struts2.ServletActionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


import com.ews.util.DataFile;


public class DataAction extends EwsAction{
 private String username;
 private String password;
 private String host;
 private String PORT;
 private String dbname;
 private List dataFiles = new ArrayList();
 private File reductionFile;
 public File getReductionFile() {
  return reductionFile;
 }
 public void setReductionFile(File reductionFile) {
  this.reductionFile = reductionFile;
 }
 public List getDataFiles() {
  return dataFiles;
 }
 public void setDataFiles(List dataFiles) {
  this.dataFiles = dataFiles;
 }
 public String getHost() {
  return host;
 }
 public void setHost(String host) {
  this.host = host;
 }
 public String getPORT() {
  return PORT;
 }
 public void setPORT(String pORT) {
  PORT = pORT;
 }
 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 String getDbname() {
  return dbname;
 }
 public void setDbname(String dbname) {
  this.dbname = dbname;
 }
 /**
  * 删除
  * */
 public String delete(){
  String fileName = request.getParameter("fileName");
  System.out.println(fileName);
  String backPath = ServletActionContext.getServletContext().getRealPath("/")+"ewssite/back/"+fileName;
  File file = new File(backPath);
  file.delete();
  return "delete";
 }
 /**
  * 得到备份文件的List集合
  * 
  * */
 public String findList(){
  String backPath = ServletActionContext.getServletContext().getRealPath("/")+"ewssite/back/";
  File file = new File(backPath);
  if (!file.exists())
   return "findListData";
  File[] file1 = file.listFiles();
  for (int i = 0; i < file1.length; i++) {
   if(file1[i].getName().equals("ramdit.txt")) continue;
   SimpleDateFormat sdf= new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
   //前面的lSysTime是秒数,先乘1000得到毫秒数,再转为java.util.Date类型
   java.util.Date dt = new Date(file1[i].lastModified());  
   String sDateTime = sdf.format(dt);  //得到精确到秒的表示:08/31/2006 21:08:00
   DataFile dataFile = new DataFile();
   dataFile.setFileName(file1[i].getName());
   dataFile.setFileDate(sDateTime);
   String path = request.getContextPath();
   String filePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/ewssite/back/"+file1[i].getName();
   dataFile.setFilePath(filePath);
   DecimalFormat   df   =   new   DecimalFormat( ".## "); 
   dataFile.setFileSize(df.format(file1[i].length()/1024000f));
   dataFiles.add(dataFile);
  }
  return "findListData";
 }
 /**
  * 配置  Mysql bin目录
  * */
 public void getConfig(){
  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  BasicDataSource ba = (BasicDataSource)context.getBean("dataSource");
  setUsername(ba.getUsername());
  setPassword(ba.getPassword());
  String url = ba.getUrl();
  url = url.substring(13, url.length());
  String[] temp = url.split("/");
  String[] temp1 = temp[0].split(":");
  setHost(temp1[0]);
  setPORT(temp1[1]);
  for (int i = 0; i < temp[1].length(); i++) {
   String temp2 = temp[1].charAt(i)+"";
   if(temp2.equals("?")){
    setDbname(temp[1].substring(0,5));
   }
  }
 }
 /**
  * 备份
  * */
 public String backup(){
  getConfig();
  //得到配置文件
  try {
   Runtime rt = Runtime.getRuntime();
   String backPath = ServletActionContext.getServletContext().getRealPath("/")+"ewssite/back/"+System.currentTimeMillis()+".sql";   
   String mysql = "mysqldump -u" + getUsername()+ " -p" + getPassword() + " --default-character-set=utf8 -h"+getHost()+" -P"+getPORT()+" " + getDbname() +" >"+"\""+backPath+"\"";   
   Process proc = rt.exec("cmd.exe /c "+mysql);// 设置导出编码为utf8。这里必须是utf8
   //String backExe = ServletActionContext.getServletContext().getRealPath("/")+"bin/mysqldump.exe"; 
   //String mysql = getDbname()+ " -u" + getUsername()+ " -p" + getPassword() + " --default-character-set=utf8 -h"+getHost()+" -P"+getPORT()+" >"+"\""+backPath+"\""; 
   int tag = proc.waitFor();// 等待进程终止  
  } catch (Exception e) {
   e.printStackTrace();
  }
  return "backup";
 }
 /**
  * 还原
  * */
 public String load(){
  String sqlPath="";
  if(request.getParameter("selectName")!=null)
   sqlPath = request.getParameter("selectName");
  if(reductionFile!=null){
   String name = upload(reductionFile);
   sqlPath = ServletActionContext.getServletContext().getRealPath("/")+"ewssite/back/" + name;
  }
//  System.out.println(sqlPath);
  if(sqlPath.substring(sqlPath.lastIndexOf(".")+1).equals("sql")){
   getConfig();
   setHost("127.0.0.1");
   setUsername("root");
   setPassword("root");
   setDbname("test");
   //得到配置文件
   try {
    Runtime rt = Runtime.getRuntime();
    String createDb = "mysqladmin -u" + getUsername()+ " -p" + getPassword() + " create "+getDbname();
    String mysql = "mysql -u" + getUsername()+ " -p" + getPassword() + " "+getDbname()+" <"+"\""+ sqlPath+"\"";//+"\""+backPath+"\""
    rt.exec("cmd.exe /c "+createDb);
    Process proc  = rt.exec("cmd.exe /c "+mysql);
    int tag = proc.waitFor();// 等待进程终止
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  return "load";
 }
 /**
  * 把本地的数据库备份文件上传到服务器上
  * file:从前台获取的file
  * */
 public String upload(File file ){
  String name = "";
  try {
   DataInputStream in = new DataInputStream(new FileInputStream(file));
//   FileInputStream in = new FileInputStream(file);
   
   String backPath = ServletActionContext.getServletContext().getRealPath("/")+"ewssite/back/";
   name = System.currentTimeMillis()+".sql";
   backPath = backPath + name;
//   FileOutputStream out = new FileOutputStream(new File(backPath));
   DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(backPath)));
   int b = -1;
   while ((b = in.read()) != -1) {
    out.write(b);
   }
   out.close();
   in.close();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return name;
 }
}