Java备份Mysql数据库_别了_不想说的博客-程序员宅基地

技术标签: Java  Java数据库备份  mysql备份  

这里是将mysql生成的备份文件放在项目中,列表读取项目中文件的sql文件来进行还原功能。

DataBaseBackupController.java

import java.io.File;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.google.common.collect.Lists;
import com.alun.common.config.Global;
import com.alun.common.utils.DateUtils;
import com.alun.common.utils.FileUtils;
import com.alun.common.utils.mysql.DatabaseBackup;
import com.alun.common.web.BaseController;
import com.alun.modules.sys.entity.DataBase;

/**
 * 数据库备份处理
 * @author ALun
 * @version 2017-06-29
 */
@Controller
@RequestMapping(value = "${adminPath}/sys/database")
public class DataBaseBackupController extends BaseController {
    

    private static String path = "database";

    @RequestMapping(value = "")
    public String showDataBase(HttpServletRequest request,Model model){
        String realPath=request.getServletContext().getRealPath("/");//项目绝对路径
        List<DataBase> list = Lists.newArrayList();
        File file = new File(realPath+path);
        if(file.exists()){
            File[] files = file.listFiles();
            for(File f:files){
                if(!f.isDirectory()){
                    String name = f.getName();
                    if("sql".equals(name.substring(name.lastIndexOf(".")+1))){
                        DataBase d = new DataBase();
                        d.setName(name);
                        d.setUpdatedate(f.lastModified());
                        d.setLength(f.length()/1024+"KB");
                        list.add(d);
                    }
                }
            }
        }else{
            file.mkdir();
        }
        if(list.size()>1){
            Collections.sort(list,new Comparator<DataBase>(){
                 public int compare(DataBase o1, DataBase o2) {  
                    //按照学生的年龄进行升序排列  
                    if(o1.getUpdatedate() < o2.getUpdatedate()){  
                        return 1;  
                    }  
                    if(o1.getUpdatedate() == o2.getUpdatedate()){  
                        return 0;  
                    }  
                    return -1;  
                }  
            });
        }
        model.addAttribute("list", list);
        return "modules/sys/databaseList";
    }

    /**
     * 数据库备份
     * @return
     */
    @RequiresPermissions("sys:database:add")
    @RequestMapping(value = "backup")
    public String backup(HttpServletRequest request,RedirectAttributes redirectAttributes){
        String realPath=request.getServletContext().getRealPath("/")+path;//项目绝对路径
        String filename = realPath +"/"+Global.getConfig("jdbc.database")+"_"+DateUtils.getDateTimes()+".sql";
        try {
        // 账号、密码、数据库名我这边是从配置文件中获取的
            DatabaseBackup.backup(Global.getConfig("jdbc.username"), Global.getConfig("jdbc.password"), Global.getConfig("jdbc.database"),filename);
            addMessage(redirectAttributes, "备份数据库成功!");
        } catch (Exception e) {
            //e.printStackTrace();
            addMessage(redirectAttributes, "备份数据库失败!");
        }
        return "redirect:" + adminPath + "/sys/database/";
    }

    /**
     * 数据库还原
     * @param request
     * @param response
     * @param redirectAttributes
     * @return
     */
    @RequiresPermissions("sys:database:edit")
    @RequestMapping(value = "restore")
    public String restore(HttpServletRequest request, HttpServletResponse response,RedirectAttributes redirectAttributes){
        String sqlname = request.getParameter("sqlname");
        String realPath=request.getServletContext().getRealPath("/")+path;//项目绝对路径
        String sqlfile = realPath+"/"+sqlname; 
        try {
            DatabaseBackup.recover(Global.getConfig("jdbc.database"), Global.getConfig("jdbc.username"), Global.getConfig("jdbc.password"), sqlfile);
            addMessage(redirectAttributes, "数据库还原成功!");
        } catch (Exception e) {
            e.printStackTrace();
            addMessage(redirectAttributes, "数据库还原失败!");
        }
        return "redirect:" + adminPath + "/sys/database/";
    }

    /**
     * 删除数据库备份
     * @param request
     * @param response
     * @param redirectAttributes
     * @return
     */
    @RequiresPermissions("sys:database:edit")
    @RequestMapping(value = "delete")
    public String delete(HttpServletRequest request, HttpServletResponse response,RedirectAttributes redirectAttributes){
        String sqlname = request.getParameter("sqlname");
        String realPath=request.getServletContext().getRealPath("/")+path;//项目绝对路径
        if(FileUtils.deleteFile(realPath+"/"+sqlname)){
            addMessage(redirectAttributes, "数据库备份删除成功!");
        }else{
            addMessage(redirectAttributes, "数据库备份删除失败!");
        }
        return "redirect:" + adminPath + "/sys/database/";
    }


}

DataBase.java 实体类

import com.alun.common.persistence.DataEntity;

public class DataBase extends DataEntity<DataBase>{

    private static final long serialVersionUID = 1L;
    private String name;    //sql名称
    private Long updatedate;    //文件最后修改时间
    private String length;  //文件大小

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getUpdatedate() {
        return updatedate;
    }
    public void setUpdatedate(Long updatedate) {
        this.updatedate = updatedate;
    }
    public String getLength() {
        return length;
    }
    public void setLength(String length) {
        this.length = length;
    }
}

DatabaseBackup.java 数据库备份工具类

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * mysql数据库备份
 * @author ALun
 *
 */
public class DatabaseBackup {
    

    private static Logger logger = LoggerFactory.getLogger("Mysql数据库备份");

    /**
     * 备份数据库
     * @param user  数据库用户名
     * @param pwd   数据库密码
     * @param dataname 数据库名
     * @param savePath 保存的路径
     * @return
     * @throws Exception
     */
    public static void backup(String user,String pwd,String dataname,String savePath) throws Exception {  
        String[] execCMD = new String[] {
   "mysqldump", "-uroot", "-proot", "powergrid",  
                "-r" + savePath, "--skip-lock-tables"};  
        Process process = Runtime.getRuntime().exec(execCMD);  

        int processComplete = process.waitFor();  
        if (processComplete == 0) {  
            logger.info(savePath+"备份成功。");
        } else {  
            throw new RuntimeException("备份数据库失败.");
        }  
    }  

    /**
     * 还原数据库  
     * @param database
     * @param user
     * @param pwd
     * @param sqlfile
     * @throws IOException
     */
    public static void recover(String database,String user,String pwd, String sqlfile) throws IOException{
        Runtime runtime = Runtime.getRuntime();
        //-u后面是用户名,-p是密码-p后面最好不要有空格,-family是数据库的名字,--default-character-set=utf8,这句话一定的加
        //注意程序的和数据库的编码必须要一致。
        Process process = runtime.exec("mysql -u "+user+" -p"+pwd+" --default-character-set=utf8 "+database);
        OutputStream outputStream = process.getOutputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(sqlfile)));
        String str = null;
        StringBuffer sb = new StringBuffer();
        while((str = br.readLine()) != null){
            sb.append(str+"\r\n");
        }
        str = sb.toString();
        System.out.println(sqlfile);
        //System.out.println(str);
        OutputStreamWriter writer = new OutputStreamWriter(outputStream,"utf-8");
        writer.write(str);
        writer.flush();
        outputStream.close();
        br.close();
        writer.close();
    }


    public static void main(String[] args) {
        try {
            recover("a", "root", "root", "E:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/webapps/a/database/a_20170629160042.sql");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

效果图
这里写图片描述
这里写图片描述
其中用到了自己写的时间和文件处理工具类就没有写出来了~。~!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014718731/article/details/75305516

智能推荐

OpenCV的setTo函数及Mat mat=labels==1详解_小伟锅的博客-程序员宅基地_cv::setto

opencv的setTo函数是将图像设置为某个值,比如有一个Mat src,想将他的值全部设置成0,则可以src.setTo(0)  另外,setTo还有更为高级的用法:1.对于一个已知的src,我们要将其中大于或者小于某个值的像素值设置为指定的值,则可以如下:src.setTo(0,src 2.src.setTo(颜色值,mat);这里的意思是,将mat矩阵中值为255位置与其相

统一建模语言(UML)_qdzx2008的博客-程序员宅基地

一 UML概述1 基本概念UML(统一建模语言,Unified Modeling Language)是OMG(Object Management Group)组织在1997年发表的图标式软件设计语言,是一个绘制软件概念图的图形化记法(notation)。人们可以用它绘制图形,用这些图形来表示一个计划进行的软件设计的问题域,或者用这些图来表示一个已经完成的软件实现。 UML综合了当时

【xml】异常:不应有 xml xmlns=''。_石头@很想你~的博客-程序员宅基地

异常信息:错误原因:类名和根节点的名字不一致解决方法:namespace Sthxn.Model.weixin{ [XmlRoot("xml")]//此处标记根节点名称 public class ReceiveBase { public string ToUserName { get; set; } public string F...

Gitlab之docker容器介绍参考文档_泰勒朗斯的博客-程序员宅基地

HelpGitLab Container Registry (FREE)Introduced in GitLab 8.8.Docker Registry manifest v1 support was added in GitLab 8.9 to support Docker versions earlier than 1.10.Starting in GitLab 8.12, if you have two-factor authentication enabled in your account

c语言和校验算法,C语言 crc64校验算法_weixin_39824033的博客-程序员宅基地

1.[代码][C/C++]代码#include static const uint64_t crc64_tab[256] = {UINT64_C(0x0000000000000000), UINT64_C(0x7ad870c830358979),UINT64_C(0xf5b0e190606b12f2), UINT64_C(0x8f689158505e9b8b),UINT64_C(0xc038e57...

win10系统下如何查看端口被哪个进程占用_超人先生1016的博客-程序员宅基地_win10查询端口对应进程

在win10系统中,我们有时候要使用一些端口,可是却发现使用的端口被别的程序占用了,导致无法开启端口,但是却不知道如何查看端口被哪个进程占用,方法很简单那,这就给大家讲解一下win10系统下查看端口被哪个进程占用的具体步骤查询端口号对应的进程号 netstat -aon|findstr "80" 使用tasklist命令查看进程 tasklist|findstr "进程编号" 然后,可以用taskkill语句结束进程,可能需要管理员权限才能正常的结束语句;

随便推点

硬盘录像机无图像显示_smddw的博客-程序员宅基地

原因一:显卡不兼容造成,可以通过Direct Draw测试,如果测试能通过,则不是此原因。原因二:PCI接口接触不良好,可以换一个PCI槽位测试。原因三:板卡是否有损坏,可以考虑换一张卡测试。 ...

iOS 如何让一个程序在后台运行不被挂起,不死掉_Carol__Lee的博客-程序员宅基地

iOS 如何让一个程序在后台运行不被挂起,不死掉前言:这是本人的第一篇博客,本来对这种写博客这种东西无感,但是发现有些东西如果不晒在网上,会让很多人费很多的时间去找一种问题的解决方法,于是我决定不做一个伸手党。支持原创,转载就注明出处。苹果后台运行的原理如何解决代码实现苹果后台运行的原理大家都知道,当一个程序进入后台时,除了一些特定的操作比如用户的音频,定位等能够在info.plist里修改

vscode 清空缓存_如何撤消“放弃所有更改”在VS Code / Git中_weixin_39648430的博客-程序员宅基地

I fear I already know the answer but here goes anyway..I accidentally clicked "Discard All Changes" in VS Code (OSX) and now a month's worth of work is gone. Poof'd. Thing is, I didn't have GIT proper...

Java使用word文档转换图片或pdf格式(spire.doc),这个是有水印的_一朵可爱的霸王fa的博客-程序员宅基地

@TOCJava使用word文档转换图片或pdf格式,需要使用(spire.doc-3.5.2.jar),有水印(这个是付费的,没有找到破解,但是能转图片)。使用场景:1、需要spire.doc包,这个可以去maven库搜素下载即可。我感觉应该也会有破解的,但是我没有搜到,所以先写着,等以后有时间找到破解版的时候再对本篇文章进行更新。2、需要转一下MultipartFile文件。我这里是由File转MultipartFile,很多博客有写这两个的区别的,感兴趣的可以自己去搜索一下呀。直接上代

SAPUI5 (28) - 基于 ODataModel 的排序和分组_stone0823的博客-程序员宅基地

OData 如何排序OData 支持使用 $orderby 参数实现数据排序。排序的时候有两种顺序:升序 (asc) 和降序 (desc),默认是升序。我们以 Northwind OData 数据服务为例,介绍基于 oDataModel 的排序和分组实现方法。

pytorch 实现 GRL Gradient Reversal Layer_Tchunren的博客-程序员宅基地_grl pytorch

在GRL中,要实现的目标是:在前向传导的时候,运算结果不变化,在梯度传导的时候,传递给前面的叶子节点的梯度变为原来的相反方向。举个例子最好说明了:import torchfrom torch.autograd import Functionx = torch.tensor([1.,2.,3.],requires_grad=True)y = torch.tensor([4.,5.,6.],requires_grad=True)z = torch.pow(x,2) + torch.pow(

推荐文章

热门文章

相关标签