spring中用runtime備份數據庫

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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章