1.场景介绍
- 应用系统在一台服务器上(windows server 2012),mysql数据库在另外的一台专门的数据库服务器上(centos6.5)。
- 此时需要在应用系统页面上提供出一个数据库备份与恢复的按钮,允许用户进行手动的对数据库进行备份与恢复操作(其实完全可以通过脚本使数据库自动备份)
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();
}
}
}
注意事项:
- mysql一定要安装在没有空格和中文的目录下,mysql的默认目录有空格
- 如果mysql的安装目录真的就不符合上面的条件,也不用重装,只需要将mysqldump.exe文件和mysql.exe文件拷贝到c盘的根目录下即可
- 如果应用系统服务器上安装的mysql版本和数据库服务器运行的mysql版本不一致时,备份可能会失败,需要进行特殊的处理:
删除红框
的内容,黄框
是添加的内容,如下图所示:
至此,使用java代码远程备份与恢复mysql数据库的完整流程就实现了。