备份和恢复数据库作为一个实用的功能经常会被用到,因此我写了这篇博客,希望大家不要像我一样在这里卡个好几天
原理: java调用MySQL的mysqldump.exe进行数据备份,调用mysql.exe进行数据的恢复
Runtime.getRuntime().exec(command);//java调用外部软件exe执行命令的api,核心代码
代码实现 (亲测可用,亲测可用,亲测可用)
/**
* @Description :通过mysqldump备份数据库
* @param savePath 数据库备份文件保存目录
* @param mysqlPath 数据库安装目录
* @param host 主机地址
* @param username 连接数据库用户名
* @param password 连接数据库密码
* @param fileName 数据库备份文件保存文件名
* @param databaseName 需要备份的数据库名字
* @return true 备份成功 false 备份失败
*/
public static boolean dataBackup(String savePath, String mysqlPath, String host, String username,
String password, String fileName, String databaseName) {
File saveFile = new File(savePath);
// 如果目录不存在
if (!saveFile.exists()) {
// 创建目录
saveFile.mkdirs();
}
// 在目录最后添加文件分隔符
if (!savePath.endsWith(File.separator)) {
savePath = savePath + File.separator;
}
// System.out.println("savePath:"+savePath);
BufferedReader bufferedReader = null;
InputStreamReader inputStreamReader = null;
try (PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(
new FileOutputStream(savePath + fileName), ChangeCharset.UTF_8))) {
StringBuffer cmdBuf = new StringBuffer();
cmdBuf.append(mysqlPath);
cmdBuf.append("mysqldump -h");
cmdBuf.append(host);
cmdBuf.append(" -u");
cmdBuf.append(username);
cmdBuf.append(" -p");
cmdBuf.append(password);
cmdBuf.append(" --set-charset=UTF8 ");
cmdBuf.append(databaseName);
String command = cmdBuf.toString();
// System.out.println("backupCommand:"+command);
Process process = Runtime.getRuntime().exec(command);
inputStreamReader = new InputStreamReader(process.getInputStream(),
ChangeCharset.UTF_8);
bufferedReader = new BufferedReader(inputStreamReader);
String str;
while ((str = bufferedReader.readLine()) != null) {
printWriter.println(str);
}
printWriter.flush();
// 线程正常终止
if (process.waitFor() == 0) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return false;
}
/**
* @Description :通过mysql恢复数据库数据
* @param savePath 数据库备份文件保存目录
* @param mysqlPath 数据库安装目录
* @param host 主机地址
* @param username 连接数据库用户名
* @param password 连接数据库密码
* @param fileName 数据库备份文件保存文件名
* @param databaseName 需要备份的数据库名字
* @return true 备份成功 false 备份失败
*/
public static boolean dataRecovery(String mysqlPath, String host, String username, String password,
String databaseName, String savePath, String fileName) {
Process process = null;
OutputStream outputStream = null;
BufferedReader bufferedReader = null;
OutputStreamWriter outputStreamWriter = null;
try {
// 在目录最后添加文件分隔符
if (!savePath.endsWith(File.separator)) {
savePath = savePath + File.separator;
}
String sqlFile = savePath + fileName;
// 拼接命令
StringBuffer cmdBuf = new StringBuffer();
cmdBuf.append(mysqlPath);
cmdBuf.append("mysql -h");
cmdBuf.append(host);
cmdBuf.append(" -u");
cmdBuf.append(username);
cmdBuf.append(" -p");
cmdBuf.append(password);
cmdBuf.append(" ");
cmdBuf.append(databaseName);
String command = cmdBuf.toString();
// System.out.println("recoverCommand:"+command);
process = Runtime.getRuntime().exec(command);
outputStream = process.getOutputStream();// 控制台的输入信息作为输出流
String inStr;
StringBuffer stringBuffer = new StringBuffer("");
String outStr;
bufferedReader = new BufferedReader(new InputStreamReader(
new FileInputStream(sqlFile), "utf8"));
while ((inStr = bufferedReader.readLine()) != null) {
stringBuffer.append(inStr + "\r\n");
}
outStr = stringBuffer.toString();
outputStreamWriter = new OutputStreamWriter(outputStream, "utf8");
outputStreamWriter.write(outStr);
// 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免
outputStreamWriter.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 别忘记关闭输入输出流
try {
if (outputStream != null) {
outputStream.close();
}
if (bufferedReader != null) {
bufferedReader.close();
}
if (outputStreamWriter != null) {
outputStreamWriter.close();
}
// 线程正常终止
if (process.waitFor() == 0) {
return true;
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return false;
}
注意 mysqlPath表示数据库的安装路径的bin目录下,如:C://Program Files (x86)//MySQL//MySQL Server 5.5//bin//
网上很多版本的代码都没有传这个数据库安装路径,我的MySQL是没有配置环境变量的,因此如果不传入这个路径的话程序应该是找不到对应的应用程序的。
以上就是java备份和恢复MySQL数据库的所有内容,如有错误,欢迎指正