java实现mySQL数据库的备份与恢复

来源:互联网 发布:食品数据分析咨询公司 编辑:程序博客网 时间:2024/06/05 03:56

释:使用java来实现数据库的备份和恢复其原理相当简单,就是调用mysql控制台,执行其语法。

        其下为生成文件保存的磁盘上并提下载。

一、数据库的备份

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
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.text.SimpleDateFormat;
import java.util.Date;

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.zyiot.constant.Constant;
import com.zyiot.util.PropertiesUtil;

@Controller
@RequestMapping("/backup")
public class BackupDataBaseController extends BaseController {


    @RequestMapping("/database")
    public void backUpDatabase(HttpServletRequest request, HttpServletResponse response) {
        //备份文件路径
        String downloadPath = PropertiesUtil.getProperties(Constant.DOWNLOAD_PATH);

       //数据库地址

        String databaseIP = PropertiesUtil.getProperties(Constant.DATABASE_IP);

        //备份数据库名称

        String dataBaseName = PropertiesUtil.getProperties(Constant.DATABASE_NAME);

       //数据库用户名

        String username = PropertiesUtil.getProperties(Constant.DATABASE_USERNAME);

       //数据库用户密码

        String password = PropertiesUtil.getProperties(Constant.DATABASE_PASSWORD);

       //数据库可执行命令地址

       //例:D://MySQL//MySQL Server 5.5//bin//

        String mysqlCmd = PropertiesUtil.getProperties(Constant.MYSQL_CMD);
      
        Date date = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmm");

        // 用于生成备份文件名       

        String dataflag = df.format(date);

        // 备份文件名
        String fileName = dataBaseName + dataflag + ".sql";

        // 数据库备份地址,也是数据库文件导出地址
        String downloadURL = downloadPath + fileName;

        File dodir = new File(downloadPath);
        File dofile = new File(downloadURL);

        //判断是否为文件夹

       //文件夹不存在并创建

        if (!dodir.exists() && !dodir.isDirectory()) {
            dodir.mkdir();
        }

       //文件不存在并创建

        if (!dofile.exists()) {
            try {
                dofile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        Runtime rt = Runtime.getRuntime();
      
        try {

             // 调用 调用mysql的安装目录的命令

            Process child = rt.exec(mysqlCmd + "mysqldump -h " + databaseIP + " -u" + username + " -p" + password + "  "+ dataBaseName);
            InputStream in = child.getInputStream();// process的输出信息作为输入流

            // 字节流转换成字符流,并设置输出流编码为utf-8,避免从流中读入的是乱码
            InputStreamReader inr = new InputStreamReader(in, "utf-8");

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

            // 要用来做备份用的sql目标文件:
            FileOutputStream fout = new FileOutputStream(downloadURL);
            OutputStreamWriter writer = new OutputStreamWriter(fout, "utf-8");
            writer.write(outStr);
            writer.flush();
            in.close();
            inr.close();
            br.close();
            writer.close();
            fout.close();

        } catch (IOException e1) {
            e1.printStackTrace();
        }

        try {
            // 读取备份文件,供客户端下载
            File file = new File(downloadURL);

           //设置响应信息

            response.setContentType("application/x-msdownload");
            response.setContentLength((int) file.length());
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            // 流化文件
            FileInputStream fis;

            fis = new FileInputStream(file);

            BufferedInputStream buff = new BufferedInputStream(fis);
            // 用于保存每次读取的字节和读取的长度
            byte[] b = new byte[1024];
            // 该值用于计算当前实际读取了多少字节
            long k = 0;
            // 从response对象中得到输出流,准备下载
            OutputStream myout = response.getOutputStream();
            // 开始循环下载
            while (k < file.length()) {
                int j = buff.read(b, 0, 1024);
                k += j;
                // 将b中的数据写到客户端的内存
                myout.write(b, 0, j);
            }
            myout.flush();
            buff.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

二、数据库的恢复

其参数和备份参数基本相同,原理相当简单,看懂备份,就能看懂恢复。

public void recover() {      
                try {      
                    
                    Runtime rt = Runtime.getRuntime();      
             
                    // 调用 mysql 的 cmd:      
                    Process child = rt.exec(mysqlCmd + "mysql.exe -h " + databaseIP + " -u" + username + " -p" + password + "  "+ dataBaseName);     
                    /**

                     *process的输入信息作为输出流  

                    *其和备份原理相似,一个是输出,一个是输入

                   */

                   OutputStream out = child.getOutputStream();
                    String inStr;      
                    StringBuffer sb = new StringBuffer("");      
                    String outStr;      
                    BufferedReader br = new BufferedReader(new InputStreamReader(      
                            new FileInputStream(downloadURL), "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);     
                    writer.flush();     
                    out.close();      
                    br.close();      
                    writer.close();     
                } catch (Exception e) {      
                    e.printStackTrace();      
                }      
             
            }


0 0
原创粉丝点击