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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值