代码分享:用java备份MySQL数据库

原文地址

https://www.t-io.org/1157456456140857344

前言

t-io官网的数据库都会定时备份,并且可以通过http直接下载到本地(这个当然需要特权,不是人人有这个操作权限),为了操作的灵活性,采用java来实现MySql的备份

核心代码

package org.tio.sitexxx.service.tool;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author tanyaowu
 */
public class MysqlTool {
	private static Logger log = LoggerFactory.getLogger(MysqlTool.class);
	/**
	 * @param host 数据库服务器主机地址,可以是ip,也可以是域名
	 * @param port 数据库服务器端口
	 * @param dbName 数据库名字
	 * @param username 数据库用户名
	 * @param password 数据库密码(明文)
	 * @param filePath 存到哪个文件,形如:"d:/dbbackup/2019-08-03_00_00_00.sql"
	 * @return
	 */
	public static File backup(String host, int port, String dbName, String username, String password, String filePath) {
		Long starttime = System.currentTimeMillis();
		try {
			File file = new File(filePath);
			String[] commands = new String[3];
			String os = System.getProperties().getProperty("os.name");
			if (os.startsWith("Win")) {
				commands[0] = "cmd.exe";
				commands[1] = "/c";
			} else {
				commands[0] = "/bin/sh";
				commands[1] = "-c";
			}

			StringBuilder mysqldump = new StringBuilder();
			mysqldump.append("mysqldump");
			mysqldump.append(" --opt");

			mysqldump.append(" --user=").append(username);
			mysqldump.append(" --password=").append(password);

			mysqldump.append(" --host=").append(host);
			mysqldump.append(" --protocol=tcp");
			mysqldump.append(" --port=").append(port);

			mysqldump.append(" --default-character-set=utf8");
			mysqldump.append(" --single-transaction=TRUE");

			mysqldump.append(" --routines");
			mysqldump.append(" --events");

			mysqldump.append(" ").append(dbName);
			mysqldump.append(" > ");
			mysqldump.append("").append(filePath).append("");

			String command = mysqldump.toString();
			System.out.println(command);

			commands[2] = command;

			Runtime runtime = Runtime.getRuntime();
			Process process = runtime.exec(commands);
			if (process.waitFor() == 0) {
				Long endtime = System.currentTimeMillis();
				Long distance = endtime - starttime;
				System.out.println("【" + dbName + "】备份成功,耗时:" + distance + "ms");
				return file;
			} else {
				InputStream is = process.getErrorStream();
				if (is != null) {
					BufferedReader in = new BufferedReader(new InputStreamReader(is, "utf-8"));
					String line;
					StringBuilder sb = new StringBuilder();
					while ((line = in.readLine()) != null) {
						sb.append(line);
					}
					System.out.println("数据库备【" + dbName + "】份失败\r\n" + sb.toString());
				}
			}
		} catch (Exception e) {
			log.error("数据库备【" + dbName + "】份失败", e);
			return null;
		}
		return null;
	}
}

非核心代码

非核心代码主要是获取数据库信息这些,同时将生成的SQL做成zip,然后用个定时任务去执行这个程序,这些代码就不贴出来啦

看看效果

原文链接:https://www.t-io.org/1157456456140857344

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券