葡京娱乐总站平台java实现mysql的备份还原

此文章是因

     
作为同一叫屌丝giser的自,刚接触gis专业是2007年的大一,好悲催,当时gis这个标准是让调剂的,我压根都未亮gis为何物,那时候gis冷门的同一逼,报名者正式的微乎其微。记得那时候得知被调剂到是正式的时光,心情失落到绝点,曾就打算放弃就读,回去复读一年,以为gis是设到野外跑的那种,后面经过上网百度搜索gis以及查找本科院校的gis专业,才知并无是如此一扭事。本科学校把gis安排在电脑学院下面,这是较少发之,主要是偏于gis开发方,有接触类似百度地图的电子地图之类,如今冷的庆幸,当初从不放弃,不然就从未后面的点点滴滴gis经历,更没有今天之自。从2007年接触gis以来,我没有悟出一起吧这么多年,一直守候着gis,跟gis作伴,中间起关键作用的凡读研的老三年(依然是gis专业),其中不少本科同学毕业之后如果弄java或者C#支付,要是就是转行了,坚守gis的死去活来少好少,毕竟2011年本科毕业的时刻,gis依然是那的冷,屌丝一枚。

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

     
大一深二片年都是模糊中度过,属于混日子的,应付式的试验,顺利的将到学分就了专司,学了一致坏推进的gis基础课,都是死记硬背,比如经济地理学(1,2),地理信息体系导论,地图学,遥感导论等等,现在自就淡忘光了,幸好还模仿了计算机编程C语言以及C++,让自家好有点编程的底,为之后学习gis开发打下了基础,尽管后面做gis二次开发的当儿不是为此c、c++来编写的。除了电脑编程语言之外,还有就是是数据结构以及数据库,这简单门课程对自身之援吗够呛可怜,尤其是对准开发者来说。期间还摆了零星差婚恋,然而并从未啊鸟儿用,傻乎乎的,谈了与没有讲一样,来呢匆匆去吧急忙,如过客一般的是,并不知道为何恋爱,也就是是经验了如此一掉事过了,当时呢时有发生跟风的元素在吧。

  2. jquery+springMVC实现公文上传

     
大学的紧要关头在大二暑假,之前虽然上了电脑的主导语言,但是没系统化的学习上机操作,更没有经过项目之实战,刚好暑假有诸如此类一个机,这里我要感谢自己之好基友小黄,当时要不是没有他的能动为先生建议我,让自己及他协同与导师的品类来说,我啊未曾机会上。小黄为是gis的,他编程能力只是高,在业内是名列前茅的,我之gis编程之路就是于外的带领下,慢慢的入门,慢慢的熟悉起来的。记得这大型是基于遥感影像内容的探寻,属于遥感影像识别的,简单的吧即使是为同帧影像来配合配影像库相似度的眼前20的影像图,我们实现的凡冲三栽办法来寻觅,分别是依据文本、基于影像之纹理特征值以及因影像的相搜索。其中,我当比较简单的根据文本以及依据影像之纹理特征值,小黄负责的凡复杂度较高之因影像形状特征检索。那同样仿是为此C++来实现,用到MFC,当时苏的故MFC模式设计界面方式好福利,初家都是爱慕那种拖拉控件布局界面吧,虽说我实现的意义,相对来说蛮简单的,但是本着立即的自己的话,也磨之非常漫长,不断的请教小黄,还有就是是主动的上网搜资源,百度搜索,csdn,那时候不了解发生博客园,是稍稍黄推荐csdn。我以csdn论坛里问了许多题材,里面的大神回答的呢殊积极的,从中,我找到了解决问题之方案或思路,真的挺管用底。

 

     
这个暑假真忙,中地MapGIS来到我们学培训MapGIS开发,培训学员参加他们组办的MapGIS大赛,当时而是微黄,拉自,还有点儿个同学共同成立一个团组织到培训。那是第一蹩脚接触C#和.Net,MapGIS的塑造内容就是。net平台,开发语言是C#
的二次开发,MapGIS是自个儿点的第一个GIS软件,当时苏的装置MapGIS好辛苦,安装上360凡是使禁用的,不然安装不达标,还有即使是咱们不得不用习版本,试用期是一个月,满期之后要重挂号,当时吗并未想那么基本上,而且觉的。net平台设计界面真的好福利,培训用之凡windowform,直接就是简单拖拉来布局界面,当时搭建之界面真的不敢恭维。这次的MapGIS培训点的学识,一切都是那么的生,幸好这有个队长带领我们,也亏这之集团氛围够好,一起交流座谈,一起化解技术难题。当时之我们是多的GIS菜鸟,现在回忆起来而想笑又清醒的好囧,记得我们当下团入到一个mapgis群里,培训时她们为的,刚开我们多的还不懂mapgis,也无什么经验,遇到不明白的,直接走去群里问,不论mapgis软件或者gis编程问题,比如地图加载出无来,图层直接报错为空对象,甚至刚开连断点跟踪都非会见,不掌握程序哪步出错了,唉,问的大都矣,群里的她们都厌倦了咱们,说怎么不错过百度先找一下,咋的咋的……但是我们或逐渐的入门了,懂的了vs软件的调式,断点跟踪,排错,也掌握了,遇到题目,先仔细分析,利用网络资源搜索,实在非常再至群里请教,慢慢的啊如数家珍了mapgis
api的调用。经过这次培训的积累与我们团的奋力,在后的mapgis全国大赛,我们组获得了尖端开发组二等奖,作品之主题是校园地理信息体系平台,哈哈,当时我们的团体还细风光了同管,校园挂于了横幅,还为老我们去吃GIS的师弟师妹做讲座,传授我们的心得体会以及上GIS开发之办法。

一. 简介

     
让自身思不交之凡,自从进入大三的话,我几都尚未因此过C++,一直到现在,这点于遗憾,大三至研三,都是于跟C#和。net平台打交道了。自从到MapGIS大赛之后,自己的编程能力得到更的升迁,对MapGIS软件与软件之运用来必然的垂询及摆布,本以为自己会直接开mapgis二次开发,但是同样坏的偶然机会,接触了arcgis之后,竟然后面和mapgis越行愈远,后面一直绝缘了,转向arcgis。那是同个研三的师兄的毕业设计,他好忙不过来,然后要我们还原帮助,顺便让我们,带领我们做他的毕业设计,这点我非常感激他,那么的耐心的点我们。师兄的毕业设计主题室关于地震紧急疏散路径的钻研,里面的算法是他协调打出的,GIS基本功能交给我们来落实,但是比较好之凡他协调预先增建筑好了网的框架,基于arcgis
for
silverlight的webgis,当时师兄还用力的引进我们去学学silverlight,还确实转说,当时2010时候,silverlight挺火的,谁知道后几年它夭折了,唉,说起来就是坑啊,害我背后几年阅读一直都是做arcgis
for
silverlight。不过这真正是被silverlight做的界面吸引到了,做的那炫酷,动态效果,还有即使是webgis这种模式,bs的,不是前面mapgis学的cs模式。通过师兄的毕业设计,自己学会了安装arcgis
desktop跟arcgis
server,那时候是9.3.1本子,安装arcgis环境还充分累的,尤其是新手,不像现在设置这么简单了。学会了arcgis
api for
silverlight的地形图基本力量以及部分简单的gis分析,比如地图缩放,属性查询,空间查询,buffer分析以及最好缺路径分析等等。这等同年为起有限只gis专业的开销教程,关于webgis和arcgis
engine的,当时webgis有flex方向以及js方向,后悔没有选js的。通过arcgis
engine的学科,自己用vs2008开发工具练习搭建了一个简单的arcgis
engine桌面系统,实现了有简约的地图开发成效,比较的拖沓控件布局界面。整体而言,大二暑假和大三立刻段时了之较充实。

  备份和导入是一个互逆的过程。 
  备份:程序调用mysql的备份命令,读来控制高输入流信息,写入.sql文件; 
  导入:程序调用mysql的导入命令,把从.sql文件中读来的音信写副控制台的出口流 
  小心:用Java执行,每次只能实行同样条command命令,重定向符”>”和”<“是免克用之

     
进入大四的自己,面临找工作或考研之取舍,当时尚未悟出出保研的名额,结果超过我奇怪,争取到均等名为保研GIS的名额,在那么之前自己吗面试了几乎寒GIS的小卖部,比如广州奥格,广州诚信所,都市圈,当时结果莫极端满意,当时广大同学都转行了,或者是开计算机编程,比如前面提到的小黄,有些女生做gis应用之,总的做gis开发的比较少。综合考虑了瞬间,还是选择保研继续求学去矣,延续自己的GIS旅途……大四底这无异于年,没有课可学,不是寻觅工作便是编制毕业论文的备,其中尚扶师妹师弟指导一下他们之gis技术问题,他们的gis课程设计需要采取,哈哈,记得这发生只师妹貌似特别敬佩我一般,经常找我解决问题,时不时邀请自己共用餐的,有时候去散散步什么的,感觉校园生活都是那的美好,出来工作才察觉,唉!

 

     
就这么的度过了自之季年gis生活,没有多好之抱负,没有多生的精粹同要,一切都是的那的平庸,等待进入研究生的gis生活……

二. 相关程序代码介绍

      

  1. BackupRestoreBSImpl.java

葡京娱乐总站平台 1葡京娱乐总站平台 2

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;
    }
}

View Code

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

葡京娱乐总站平台 3葡京娱乐总站平台 4

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;
    }
}

View Code

  3. TestController.java

葡京娱乐总站平台 5葡京娱乐总站平台 6

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");    
    }
}

View Code

 

  4. backupRestore.jsp

葡京娱乐总站平台 7葡京娱乐总站平台 8

<!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>

View Code

三. 测试

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

葡京娱乐总站平台 9

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

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