`
ybhuxiao
  • 浏览: 193794 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

懒人策略之:批量备份mysql数据库

阅读更多
写给和我一样的懒人。

数据库多了,备份起来比较麻烦,虽然有Navicat这种工具,但是还是要一个一个去备份,不是很方便,下面这个类可以帮你方便的备份多个数据库。

我所在的是小公司,用到的数据库文件都很小,没见过大的数据库,所以无从测试,有朋友帮忙测试一下,有问题的话描述一下,3q

package com.djwl.tools.database;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 * 描述:批量备份数据库
 * 
 * 1. 修改数据库链接:ip、username、password
 * 2. 修改输出的文件夹:outputPath
 * 3. 修改getDatabaseList(),加入你的数据库名称
 * 4. 保证你配置了mysql的环境变量
 * 
 * @author 胡晓 http://huxiao.iteye.com/  kskr@qq.com  QQ:376665005
 *
 * 原文链接:http://huxiao.iteye.com/admin/blogs/604093
 * 转载请保留作者信息
 */
public class BackUpMysql {

	private static String ip = "localhost";
	private static String username = "root";
	private static String password = "root";
	
	//输出文件夹,我加了一个时间,保证每次生成在不同的文件夹里面,避免多次备份的文件在同一个文件夹里面,影响视听
	private static String outputPath = "g:/backupdatabase/" + getCurrentDate14() + "/";

	/**
	 * <p>功能描述:备份数据库</p>
	 * 
	 * @param databaseName
	 * @param outputPath
	 * @author 胡晓 <BR> kskr@qq.com <BR>
	 * 时间:Feb 27, 2010 8:34:24 AM <BR>
	 */
	public static void backup(String databaseName) {
		try {
			Process process = Runtime.getRuntime().exec("mysqldump.exe -h" + ip + " -u" + username + " -p" + password + " " + databaseName);

			InputStream input = process.getInputStream();
			InputStreamReader xx = new InputStreamReader(input, "utf8");

			String inputString;
			StringBuffer sb = new StringBuffer("");
			String outputString;
			BufferedReader br = new BufferedReader(xx);
			while ((inputString = br.readLine()) != null) {
				sb.append(inputString + "\r\n");
			}
			outputString = sb.toString();

			FileOutputStream output = new FileOutputStream(outputPath + databaseName + "_" + getCurrentDate14() + ".sql");
			OutputStreamWriter writer = new OutputStreamWriter(output, "utf8");
			writer.write(outputString);
			writer.flush();

			input.close();
			xx.close();
			br.close();
			writer.close();
			output.close();
		} catch (Exception e) {
			System.out.println("备份出错");
			e.printStackTrace();
		}
	}

	/**
	 * <p>功能描述:创建文件夹</p>
	 * 
	 * @param path
	 * @author 胡晓 <BR> kskr@qq.com <BR>
	 * 时间:Feb 27, 2010 8:48:27 AM <BR>
	 */
	public static void createFolder(String path) {
		try {
			File file = new File(path);
			if (!file.exists()) {
				file.mkdirs();
			}
		} catch (Exception e) {
			System.out.println("创建文件夹出错");
			e.printStackTrace();
		}
	}

	/**
	 * <p>功能描述:生成之后自动打开所在文件夹</p>
	 * 
	 * @param folderPath
	 * @author 胡晓 <BR> kskr@qq.com <BR>
	 * 时间:Feb 27, 2010 8:48:37 AM <BR>
	 */
	public static void openFolder(String folderPath) {
		try {
			// 打开所在文件夹
			String path = folderPath.replaceAll("/", "\\\\");
			String cmd[] = { "explorer.exe", path };
			Runtime.getRuntime().exec(cmd);
		} catch (Exception e) {
			System.out.println("打开文件夹“" + folderPath + "”出错");
			e.printStackTrace();
		}
	}
	

	/**
	 * <p>功能描述:获取14位的当前时间</p>
	 * 
	 * @return
	 * @author 胡晓 <BR> kskr@qq.com <BR>
	 * 时间:Feb 27, 2010 8:47:36 AM <BR>
	 */
	public static Long getCurrentDate14(){
		return Long.parseLong(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString());
	}

	/**
	 * <p>功能描述:获取数据库列表</p>
	 * 
 * 这里的数据库列表实际上是可以从mysql自带的information_schema数据库中的tables表中读出来的,如果你懒得像我这样一一列举,可以采取那种方式
	 * @return
	 * @author 胡晓 <BR> kskr@qq.com <BR>
	 * 时间:Feb 27, 2010 8:48:58 AM <BR>
	 */
	public static List<String> getDatabaseList() {
		List<String> list = new ArrayList<String>();
		list.add("aliwangpu");
		list.add("djwl");
		list.add("dog");
		list.add("dyfy");
		list.add("fydagl");
		list.add("hngk");
		list.add("hxzg");
		list.add("oa");
		list.add("practise");
		list.add("qzjy");
		list.add("salecount");
		list.add("swcm");
		list.add("xszp");
		list.add("yfhj");
		list.add("yfjy");
		return list;
	}

	public static void main(String[] args) {
		createFolder(outputPath);

		for (String databaseName : getDatabaseList()) {
			backup(databaseName);
		}

		openFolder(outputPath);
	}
}



* 原文链接:http://huxiao.iteye.com/admin/blogs/604093
* 转载请保留作者信息

备份之后,文件夹会自动打开,非常人性化,适合我们懒人一族:





注:日期方法已经写成5楼说的方法了,简便多了,呵呵3q chujiazhen
  • 大小: 76.2 KB
10
2
分享到:
评论
7 楼 系统程序 2010-03-07  
anry513 写道

写个定时器,然后加入服务, 定时自动备份,就更适合懒人了。


我就这样做的,同时还自动ftp到另外一个机房的服务器上去,不用下载到本地了,过十天半月检查一下有没有正常运行就是了
6 楼 ybhuxiao 2010-03-05  
anry513 写道


写个定时器,然后加入服务, 定时自动备份,就更适合懒人了。


有道理,有道理 懒中更有懒中手啊


chujiazhen 写道
getCurrentDate14 <=> new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()),这样应该更好

nini99999 写道
日期直接格式化就好了 搞的这么复杂


是的是的,日期方法写的复杂了,呵呵
5 楼 chujiazhen 2010-03-03  
getCurrentDate14 <=> new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()),这样应该更好
4 楼 anry513 2010-03-02  
nini99999 写道
日期直接格式化就好了 搞的这么复杂

同意。

写个定时器,然后加入服务, 定时自动备份,就更适合懒人了。

liwenso 写道
呵呵,这个东西很有用,不过数据库表的获得建议使用数据库的元数据来获得,不要采取这种硬编码,容易出错!

这个不是很同意,楼主是想备份自己需要备份的表。如果使用数据库的元数据获取表,还不如直接用mysql命令备份库,就不用单个的备份表了,不过可以做个配置文件。来决定所备份的表和所备份的库。
3 楼 nini99999 2010-03-01  
日期直接格式化就好了 搞的这么复杂
2 楼 liwenso 2010-03-01  
呵呵,这个东西很有用,不过数据库表的获得建议使用数据库的元数据来获得,不要采取这种硬编码,容易出错!
1 楼 Sunny_kaka 2010-03-01  
确实是好东西..
顶一个

相关推荐

Global site tag (gtag.js) - Google Analytics