java代码远程备份与恢复mysql数据库的详细代码及说明

1.场景介绍

  1. 应用系统在一台服务器上(windows server 2012),mysql数据库在另外的一台专门的数据库服务器上(centos6.5)。
  2. 此时需要在应用系统页面上提供出一个数据库备份与恢复的按钮,允许用户进行手动的对数据库进行备份与恢复操作(其实完全可以通过脚本使数据库自动备份)

2.误区

在我印象中,既然是使用java代码远程备份数据服务器中的数据,那么就应该是应用系统服务器上没有数据库的相关内容。
其实这个这个认识是不对的,因为myql数据库的备份与恢复是需要mysql提供的命令的,因此应用系统服务器上是需要安装mysql的,只需要安装服务组件就
可以了,没必要安装完整的功能,另外mysql一定要安装在没有空格和中文的目录下,否则出现意想不到的问题,通过自定义安装就能指定安装目录,如果实在不知道如何指定安装目录,就选择默认目录,然后将后面备份和恢复需要用到的命令拷贝到c盘的根目录下就可以啦。

3.具体代码

1. 数据库的备份

具体代码实现如下图所示:

	/**
     * @param hostIP ip地址,可以是本机也可以是远程
     * @param userName 数据库的用户名
     * @param password 数据库的密码
     * @param savePath 备份的路径
     * @param fileName 备份的文件名
     * @param databaseName 需要备份的数据库的名称
     * @return
     */
    public static boolean backup(String hostIP, String userName, String password, String savePath, String fileName,
            String databaseName) {
        fileName +=".sql"; 
        File saveFile = new File(savePath);
        if (!saveFile.exists()) {// 如果目录不存在
            saveFile.mkdirs();// 创建文件夹
        }
        if (!savePath.endsWith(File.separator)) {
            savePath = savePath + File.separator;
        }

        //拼接命令行的命令
        StringBuilder stringBuilder = new StringBuilder();
        
        //成功的前提条件是将mysqldump.exe文件拷贝到c盘的根目录下s
        stringBuilder.append("cmd /c c:\\mysqldump(mysqldump.exe文件所在的目录) "
        		+ "-h59.215.221.184(mysql服务器ip地址) "
        		+ "-uroot(用户名) -proot(密码) --opt aaa(数据库名称)>(大于号)d:\\aaa.sql(sql文件保存的路径)");
        try {
            //调用外部执行exe文件的javaAPI
            Process process = Runtime.getRuntime().exec(stringBuilder.toString());
            if (process.waitFor() == 0) {// 0 表示线程正常终止。
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return false;
    }

2.数据库的恢复

	/**
     * @param filepath 数据库还原的脚本路径
     * @param ip IP地址
     * @param database 数据库名称
     * @param userName 用户名
     * @param password 密码
     * @return
     * @throws InterruptedException 
     */
    public static boolean recover(String filepath,String ip,String database, String userName,String password) throws InterruptedException {
        String stmt2 = "c:\\mysql(mysql.exe文件所在的位置) -h59.215.221.184(mysql服务器ip地址) "
        		+ "-uroot(用户名) -proot(密码) aaa(数据库名称) <(小于号) d:/pingzheng.sql(要使用的sql文件的位置)";
        String[] cmd = { "cmd", "/c", stmt2 };

        try {
        	
        	Process process2 = Runtime.getRuntime().exec(cmd);
        	new ProcessClearStream(process2.getInputStream(), "INFO").start();  
            new ProcessClearStream(process2.getErrorStream(), "ERROR").start();  
        	
        	if(process2.waitFor() == 0){
        		System.out.println("数据已从 " + filepath + " 导入到数据库中");
        		return true;
        	}
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return false;
    }

3.封装一个类,获取操作的具体信息,数据恢复时需要用到

package com.haitai.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ProcessClearStream extends Thread {
	 private InputStream inputStream;  
	 private String type;  
	  
	 public ProcessClearStream(InputStream inputStream, String type) {  
	     this.inputStream = inputStream;  
	     this.type = type;  
	 }  
	  
	 public void run() {  
	     try {  
	         InputStreamReader inputStreamReader = new InputStreamReader(  
	                 inputStream,"gbk");  
	         BufferedReader br = new BufferedReader(inputStreamReader);  
	         // 打印信息  
	         String line = null;  
	         while ((line = br.readLine()) != null) {  
	             System.out.println(type + ">" + line);  
	         }  
	         // 不打印信息  
//	        while (br.readLine() != null);  
	     } catch (IOException ioe) {  
	         ioe.printStackTrace();  
	     }  
	 }  
}

注意事项:

  1. mysql一定要安装在没有空格和中文的目录下,mysql的默认目录有空格
  2. 如果mysql的安装目录真的就不符合上面的条件,也不用重装,只需要将mysqldump.exe文件和mysql.exe文件拷贝到c盘的根目录下即可
  3. 如果应用系统服务器上安装的mysql版本和数据库服务器运行的mysql版本不一致时,备份可能会失败,需要进行特殊的处理:
    删除红框的内容,黄框是添加的内容,如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    至此,使用java代码远程备份与恢复mysql数据库的完整流程就实现了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值