我以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中調用該方法就可以了。