我以mysql数据库为例。runtime是可以调用cmd的命令的,所以我们用runtime来运行cmd命令达到备份的目的。
首先在项目中创建包如下图:
schedule是我用于定时备份的可以忽略。
在service中创建DBBackUpService代码如下:
package org.smart.backUp.service;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Calendar;
import org.hamcrest.core.Is;
import org.springframework.stereotype.Service;
@Service
public class DBBackUpService {
/**
* 备份方法
*
* @return 是否备份成功
*/
public boolean dbBackUp() {
// 是否备份成功
boolean isSuccess = false;
// 是否备份成功
boolean isWrong = false;
// 得到当前精确时间
Calendar calendar = Calendar.getInstance();
String time = calendar.get(Calendar.YEAR) + "-"
+ (calendar.get(Calendar.MONTH) + 1) + "-"
+ calendar.get(Calendar.DAY_OF_MONTH) + "-"
+ calendar.get(Calendar.HOUR_OF_DAY) + "-"
+ calendar.get(Calendar.MINUTE) + "-"
+ calendar.get(Calendar.SECOND) + "";
// mysqldump的路径(DOS中要把路径空格前后加上"才能识别)
String path = "C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin\\mysqldump"
.replace(" ", "\" \"");
// 数据库用户名
String username = "root";
// 数据库密码
String password = "root";
// 数据库地址
String host = "127.0.0.1";
// 数据库名
String database = "smartdata";
// 备份目录
String directory = "F:\\mysql数据备份";
// 备份文件名
String filename = directory + "\\" + database + "_" + time + ".sql";
Runtime runtime = Runtime.getRuntime();
// 用于备份的cmd命令
/*
* (命令样本)cmd /c
* C:\Program" "Files\MySQL\MySQL" "Server" "5.5\bin\mysqldump
* -h127.0.0.1 -uroot -proot smartdata
* >F:\mysql数据备份\smartdata_2015-4-10-15-15-32.sql
*/
String command = "cmd /c " + path + " -h" + host + " -u" + username
+ " -p" + password + " " + database + " >" + filename
+ " && echo success";
try {
// 先生成备份目录否则不能备份
runtime.exec("cmd /c md " + directory);
Process pr = runtime.exec(command);
// 获取进程的输出流(相对于内存是输入流)
InputStream is = pr.getInputStream();
// 获取进程的报错输出流
InputStream isError = pr.getErrorStream();
// 编码格式设定
InputStreamReader isr = new InputStreamReader(is, "GBK");
InputStreamReader isrError = new InputStreamReader(isError, "GBK");
// 读取进程输出的信息
BufferedReader br = new BufferedReader(isr);
BufferedReader brError = new BufferedReader(isrError);
// 控制台打印信息
String info = "";
while ((info = br.readLine()) != null) {
isSuccess = info.equals("success");
System.out.println(info);
}
// 控制台打印报错信息
String error = "";
while ((error = brError.readLine()) != null) {
isWrong = true;
System.out.println(error);
}
// 关闭流
br.close();
brError.close();
} catch (Exception e) {
e.printStackTrace();
}
// 判断是否报错
if (isWrong) {
// 报错则返回失败
isSuccess = false;
}
return isSuccess;
}
}
注释里已经很明白了。在controller中调用该方法就可以了。