此文章是基于

  1. 搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台

  2. jquery+springMVC实现文件上传

一. 简介

  备份和导入是一个互逆的过程。 
  备份:程序调用mysql的备份命令,读出控制台输入流信息,写入.sql文件; 
  导入:程序调用mysql的导入命令,把从.sql文件中读出的信息写入控制台的输出流 
  注意:用Java执行,每次只能执行一条command命令,重定向符">"和"<"是不能用的

二. 相关程序代码介绍

  1. BackupRestoreBSImpl.java

package com.ims.service.sys.impl;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
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.util.HashMap;
import java.util.Map; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.ims.service.sys.DataBaseBS;
import com.ims.common.DateUtil;
import com.ims.common.FileUtil;
import com.ims.service.sys.BackupRestoreBS; @Service("backupRestoreBS")
public class BackupRestoreBSImpl implements BackupRestoreBS{
private static Log logger = LogFactory.getLog(BackupRestoreBSImpl.class); private static final String uploadPath = System.getProperty("webapp.root")+"uploadFile\\backupRestore\\"; @Autowired
public DataBaseBS dataBaseBS; /**
* 备份单个数据库
* @param dbName 数据库名称
* @return 备份成功或者失败
*/
@Override
public boolean backup(String dbName){
InputStream in = null;
InputStreamReader inReader = null;
BufferedReader br = null;
OutputStreamWriter writer = null;
FileOutputStream fout = null; try {
logger.info(dbName + "开始备份!");
// mysqldump的安装路径,支持带空格
String cmd = "\"\" \""+dataBaseBS.getInstallPath() +"bin\\mysqldump\" -hlocalhost -uroot -p123456 " + dbName;
// cmd命令在后台执行,没有命令窗口出现或者一闪而过的情况
Process process = Runtime.getRuntime().exec("cmd /c start /b " + cmd);
// 把进程执行中的控制台输出信息写入.sql文件,即生成了备份文件。
// 注:如果不对控制台信息进行读出,则会导致进程堵塞无法运行
in = process.getInputStream();// 控制台的输出信息作为输入流
inReader = new InputStreamReader(in, "utf8");// 设置输出流编码为utf8。这里必须是utf8,否则从流中读入的是乱码 String inStr;
StringBuffer sb = new StringBuffer("");
String outStr;
// 组合控制台输出信息字符串
br = new BufferedReader(inReader);
while ((inStr = br.readLine()) != null) {
sb.append(inStr + "\r\n");
}
outStr = sb.toString(); // 要用来做导入用的sql目标文件:
fout = new FileOutputStream(uploadPath + dbName + ".sql");
writer = new OutputStreamWriter(fout, "utf8");
writer.write(outStr);
// 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免
writer.flush(); } catch (Exception e) {
logger.error(dbName + "备份失败!",e);
return false;
} finally{
// 别忘记关闭输入输出流
try {
in.close();
inReader.close();
br.close();
writer.close();
fout.close();
} catch (Exception e) {
logger.error(dbName + "备份失败!",e);
return false;
}
}
logger.info(dbName + "备份成功!");
return true;
} /**
* 备份所有的数据库
*/
@Override
public Map<String, Object> backupAll(){
Map<String, Object> result = new HashMap<String, Object>();
String[] dataBases = dataBaseBS.getDataBases();
if(FileUtil.deleteAll(uploadPath)){
File[] srcfile = new File[dataBases.length];
for(int i=0;i<dataBases.length;i++){
if(backup(dataBases[i])){
srcfile[i] = new File(uploadPath+dataBases[i]+".sql");
}else{
result.put("status", false);
result.put("msg", dataBases[i] + "数据备份失败");
return result;
}
}
String filename = DateUtil.getCurrDate() + "_backup.zip";
File zipfile = new File(uploadPath + filename);
if(FileUtil.zip(srcfile, zipfile)){
result.put("status", true);
result.put("msg", filename);
}else{
result.put("status", false);
result.put("msg", "文件压缩失败");
}
}else{
result.put("status", false);
result.put("msg", "文件夹清空失败");
}
return result;
} /**
* 还原单个数据库
* @param dbName 数据库名称
* @return 还原成功或者失败
*/
@Override
public boolean restore(String dbName){
OutputStream out = null;
BufferedReader br = null;
OutputStreamWriter writer = null; try {
logger.info(dbName + "开始还原!");
// mysql的安装路径,支持带空格
String cmd = "\"\" \""+dataBaseBS.getInstallPath() +"bin\\mysql\" -hlocalhost -uroot -p123456 " + dbName;
// cmd命令在后台执行,没有命令窗口出现或者一闪而过的情况
Process process = Runtime.getRuntime().exec("cmd /c start /b " + cmd);
out = process.getOutputStream();//控制台的输入信息作为输出流
String inStr;
StringBuffer sb = new StringBuffer("");
String outStr;
br = new BufferedReader(new InputStreamReader(
new FileInputStream(uploadPath + dbName + ".sql"), "utf8"));
while ((inStr = br.readLine()) != null) {
sb.append(inStr + "\r\n");
}
outStr = sb.toString(); writer = new OutputStreamWriter(out, "utf8");
writer.write(outStr);
// 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免
writer.flush();
} catch (Exception e) {
logger.error(dbName + "还原失败!",e);
return false;
} finally {
// 别忘记关闭输入输出流
try {
out.close();
br.close();
writer.close();
} catch (IOException e) {
logger.error(dbName + "还原失败!",e);
return false;
}
}
logger.info(dbName + "还原成功!");
return true;
} /**
* 还原所有的数据库
*/
@Override
public Map<String, Object> restoreAll(String zipFile){
Map<String, Object> result = new HashMap<String, Object>();
String[] dataBases = dataBaseBS.getDataBases();
if(zipFile.length()>0&&checkFile(zipFile)){
if(FileUtil.unZip(new File(uploadPath+zipFile), uploadPath)){
for(int i=0;i<dataBases.length;i++){
if(!restore(dataBases[i])){
result.put("status", false);
result.put("msg", dataBases[i] + "数据还原失败");
return result;
}
}
System.gc();// 强制回收内存垃圾,否则zip文件一直被占用删除不了
result.put("status", true);
result.put("msg", "数据还原成功");
}else{
result.put("status", false);
result.put("msg", "解压缩包失败");
}
}else{
result.put("status", false);
result.put("msg", "没有找到可还原的数据压缩文件");
}
return result;
} /**
* 根据文件名验证文件是否合法
* @param fileName
* @return
*/
public boolean checkFile(String fileName){
String[] strs = fileName.split("_");
if(strs.length>1){
String checkStr = strs[strs.length-1];
if("backup.zip".equals(checkStr)){
return true;
}else{
return false;
}
}else{
return false;
}
} @Override
public String getUploadpath() {
return uploadPath;
}
}

  2. DataBaseBSImpl.java,可设置要备份的数据库名称,如:sys

package com.ims.service.sys.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.ims.persistence.base.SqlXmlParser;
import com.ims.persistence.dao.sys.DataBaseDao;
import com.ims.service.sys.DataBaseBS; @Service("dataBaseBS")
public class DataBaseBSImpl implements DataBaseBS{
private static final String sqlXml = "sys/dataBase.xml";
private static final String[] dataBases = new String[]{"sys"}; @Autowired
private DataBaseDao dataBaseDao; @Override
public String getInstallPath() {
String installPath = (String)dataBaseDao.findUniqueResultBySql(new SqlXmlParser(sqlXml).parse("installPath", null));
return installPath;
} @Override
public String[] getDataBases() {
return dataBases;
}
}

  3. TestController.java

package com.ims.web.controller;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView; import com.alibaba.fastjson.JSON;
import com.ims.common.FileUtil;
import com.ims.service.sys.BackupRestoreBS; @Controller
@RequestMapping("test")
public class TestController extends BaseController{
@Autowired
private BackupRestoreBS backupRestoreBS; @RequestMapping("view")
public ModelAndView test(){
ModelAndView view = new ModelAndView("test.jsp");
return view;
} @RequestMapping("backupRestore!backup")
public void backup(){
Map<String, Object> result = backupRestoreBS.backupAll();
ajaxJson((Boolean)result.get("status")?STATUS_SUCCESS:STATUS_ERROR, result.get("msg"));
} @RequestMapping("backupRestore!download")
public void download(@RequestParam Map<String, Object> params){
InputStream in=null;
OutputStream out=null;
String fileName = (String)params.get("fileName");
try{
response.setContentType("application/x-download;charset=GBK");
response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("GBK"),"ISO8859_1"));
out=response.getOutputStream();
//将内容写入输出流并把缓存的内容全部发出去
in=new BufferedInputStream(new FileInputStream(backupRestoreBS.getUploadpath()+fileName));
int len = 0;
byte[] buffer = new byte[1024];
while((len = in.read(buffer)) > 0) {
out.write(buffer,0,len);
}
out.flush();
}catch(Exception e){
ajaxJson(STATUS_ERROR, "文件下载失败");
}finally{
if(in!=null){
try{
in.close();
}catch(IOException e){
ajaxJson(STATUS_ERROR, "输入流关闭失败");
}
} if(out!=null){
try{
out.close();
}catch(IOException e){
ajaxJson(STATUS_ERROR, "输出流关闭失败");
}
}
}
} @RequestMapping("backupRestore!restore")
public void restore(@RequestParam Map<String, String> params,
MultipartHttpServletRequest multipartRequest){
Map<String, Object> result = new HashMap<String, Object>();
try {
if(FileUtil.deleteAll(backupRestoreBS.getUploadpath())){
MultipartFile restoreFile = multipartRequest.getFile("restoreFile");
String fileName = restoreFile.getOriginalFilename();
if(FileUtil.saveFileFromInputStream(restoreFile.getInputStream(),
backupRestoreBS.getUploadpath()+fileName)){
Map<String, Object> restoreResult = backupRestoreBS.restoreAll(fileName);
result.put("status", STATUS_SUCCESS);
result.put("message", restoreResult.get("msg"));
}else{
result.put("status", STATUS_ERROR);
result.put("message", "文件保存失败");
}
}else{
result.put("status", STATUS_ERROR);
result.put("message", "文件夹清空失败");
}
} catch (IOException e) {
result.put("status", STATUS_ERROR);
result.put("message", "数据还原失败");
}
ajax(JSON.toJSONString(result),"text/html");
}
}

 

  4. backupRestore.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试</title>
<%@ include file="/common/basePath.jsp"%>
</head>
<body>
~~~~~~~~~~~~~~~~~~~~~~mysql数据库的备份与还原~~~~~~~~~~~~~~~~~~~~~~~~
<br><br>
数据备份:<button type="button" onclick="backup();">备份</button>
<br><br>
数据选择:<input type="file" id="restoreFile" style="width: 350px;"/>
<br><br>
导入还原:<button type="button" onclick="restore();">还原</button>
<br><br><br>
<script type="text/javascript" src="content/js/jquery/jquery-1.8.1.min.js"></script>
<script type="text/javascript" src="content/js/core/utils.js"></script>
<script type="text/javascript" src="content/js/core/common.js"></script>
<script type="text/javascript" src="content/js/jquery-plugin/fileUpload/jquery.ajaxFileUpload.js"></script>
<script type="text/javascript"> function backup(){
$.ajax({
async:true,
url: rootPath+"/test/backupRestore!backup.do",
success: function (d) {
if(d.status=='success'){
var exporter = com.exporter();
exporter.params.action = rootPath+"/test/backupRestore!download.do?fileName="+d.message;
exporter.download('zip');
alert("备份成功!");
} else {
alert(d.message);
}
}
});
} function restore() {
$.ajaxFileUpload({
url:rootPath+"/test/backupRestore!restore.do",
secureuri:false,
fileElementId: ['restoreFile'],
dataType: 'json',
success: function (data){
if(data.status=='success'){
alert('还原成功!');
} else {
alert(data.message);
}
},
error: function(data){
}
});
}
</script>
</body>
</html>

三. 测试

  访问:http://localhost:8080/ims/test/backupRestore.do

  1. 备份:点击 备份 按钮,浏览器会下载压缩后的备份文件,格式如:2017-03-16_backup.zip

  2. 还原:选择刚下载的压缩后的备份文件,点击 还原 按钮,数据库被成功还原

java实现mysql的备份还原的更多相关文章

  1. Java实现MySQL数据库备份(二)

    权声明:本文为博主原创文章,未经博主允许不得转载. 博客<Java实现MySQL数据库备份(一)>使用I/O流的方式实现了MySQL数据库的备份,这种方法比较繁杂,下面介绍另一种备份MyS ...

  2. Java实现mysql数据库备份

    Runtime是一个与JVM运行时环境有关的类,这个类是Singleton的. Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法. ...

  3. MySQL数据库备份还原(基于binlog的增量备份)

    MySQL数据库备份还原(基于binlog的增量备份) 一.简介 1.增量备份      增量备份 是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件.这就意味 ...

  4. Java达到MySQL数据库备份(两)

    博客<Java实现MySQL数据库备份(一)>使用I/O流的方式实现了MySQL数据库的备份,这样的方法比較繁杂.以下介绍还有一种备份MySQL数据库的方法: import java.io ...

  5. c# Process cmd 执行完回调 Proc_OutputDataReceived mysql mysqldump mysql source备份还原数据

    c# Process 执行完回调 Proc_OutputDataReceived mysql mysqldump mysql source备份还原数据 直接贴代码 前提:mysql5.7 vs2017 ...

  6. Java实现MySQL数据库备份(一)

    下班了,利用闲暇时间总结一下如何使用Java语言实现MySQL数据库备份: import java.io.BufferedReader; import java.io.File; import jav ...

  7. 使用mysqldump进行mysql数据库备份还原

    mysqldump是mysql自带的备份还原工具,默认在安装目录的bin下 可通过cmd命令行启动,然后运行: 还原一个数据库: mysql -h 主机 -u 用户名 -p密码 数据库名 < 指 ...

  8. MySql的备份还原

    备份数据是数据库管理最常用的操作.为了保证数据库中数据的安全,数据管理员需要定期进行数据备份.一旦数据库遭到破坏,便可通过备份的文件来还原数据库.因此,数据备份是一项很重要的工作. 数据备份 使用my ...

  9. ubuntu docker 搭建 mongodb,开启授权访问 redis,mysql mssql 备份还原

    命令安装docker 如果您想从Ubuntu存储库安装docker版本,则可以运行下面的apt命令. sudo apt install docker.io等到安装完成后,您可以启动Docker并使用s ...

随机推荐

  1. bzoj 3669: [Noi2014]魔法森林(并查集+LCT)

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  2. [译文]casperjs 的API-casper模块

    Casper class: 可以通过这个模块的create()方法来获取这个模块的一个实例,这是最容易的: var casper = require('casper').create(); 我们也可以 ...

  3. mysql 快照读MVCC

    mysql的读分快照读和当前读 快照读 是指写的同时,读不阻塞,达到并发的作用 这时候的读 是 记录的历史版本,存在于undo里,当然回滚时就的也是这个undo 当执行一条update语句时,记录本身 ...

  4. PHP将多维数组变成一维数组

    function reduceArray($array) { $return = []; array_walk_recursive($array, function ($x) use (&$r ...

  5. bootstrap table 超链接的添加 <a>标签

    后台管理页面采用 bootstrap table 页面样式: 现在需要在操作中添加一个<a>标签,跳转到不同的页面 { title: '操作', align: 'center', form ...

  6. 高阶篇:4.3)FTA故障树分析法-DFMEA的另外一张脸

    本章目的:明确什么是FTA,及与DFMEA的关系. 1.FTA定义 故障树分析(FTA) 其一:故障树分析(Fault Tree Analysis,简称FTA)又称事故树分析,是安全系统工程中最重要的 ...

  7. springboot(十一)-为什么要用springboot

    前言 学习了一段时间springboot,一般都可以在项目中使用springboot开发了.因为springboot的东西并不多,或者说,springboot根本就没有新东西. 好了,现在问一句,我们 ...

  8. laravel5.5打印sql语句

    额.其实laravel很不方便的地方就是sql写错之后不是很好调试. 上方法. //DB::connection()->enableQueryLog(); // 开启QueryLog//$rep ...

  9. MB Star C3 vs MB Star C4

    New Mercedes Benz Star C3 is a professional diagnostic tool specially for mercedes benz cars. Merced ...

  10. js Object.keys 用法

    Object.keys()   可以将对象里的所以的键取出来放到一个数组中 1.传入对象, 返回 包含对象可枚举属性和方法的数组 var obj = {'a': 'Beijing', 'b': 'Ha ...