spring中用runtime备份数据库

来源:互联网 发布:淘宝网店查询 编辑:程序博客网 时间:2024/06/01 08:52

我以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;@Servicepublic 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中调用该方法就可以了。


 

0 0