傻瓜式Java操作MySQL数据库备份

原创
2023/09/29 22:26
阅读数 93

前言

  数据库备份是开发工作中经常要做的事情,好处是mysql提供了一个非常好的命令 mysqldump,直接调用它就可以将数据以sql文件的形式备份出来。但是直接写命令非常不方便,遇到定时备份或者指定备份那么就需要代码调用。下面是一个使用java代码调用该命令的小示例:

mysqldump -u username -p password -h host -P port exportDatabaseName exportPath

  在进行导出的时候,需要注意命令语句的运行环境,如果已经将mysql安装路径下的bin加入到系统的path变量中,那么在导出的时候可以直接使用命令语句,否则,就需要在执行命令语句的时候加上命令所在位置的路径,即mysql安装路径想的bin下的mysqldump命令。

存储数据库

public class DataSyncTransfer {
	/** MySQL安装目录的Bin目录的绝对路径 */
	private static String mysqlBinPath = "/usr/local/mysql/bin/";
	private static String mysqldump = mysqlBinPath + "mysqldump";

	/**
	 * 备份 MySQL 数据库
	 * 
	 * @param clientIp   访问MySQL数据库的主机
	 * @param port       访问MySQL数据库的端口
	 * @param userName   访问MySQL数据库的用户名
	 * @param password   访问MySQL数据库的密码
	 * @param database   需要备份的数据库,多个数据库之间使用逗号分隔
	 * @param backupFile 备份文件存放的路径,如果指定路径的文件不存在会自动生成
	 */
	public static boolean backupDatabase(String clientIp, int port, String userName, String password, String database,
			String backupPath) throws Exception {
		// 当前日期
		String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
		// 当前时间
		String currentTime = new SimpleDateFormat("HH-mm-ss").format(Calendar.getInstance().getTime());
		// 备份文件名
		String backupFileName = database + "-" + currentDate + "-" + currentTime + ".sql";
		// 备份文件路径
		String backupFilePath = backupPath + backupFileName;
		// 创建备份文件存放目录,如果已经存在则不创建
		new File(backupPath).mkdirs();

		// 新建命令列表
		List<string> commandList = new ArrayList&lt;&gt;();
		// 添加命令:备份 MySQL 数据库
		commandList.add(mysqldump);
		// 添加命令参数:MySQL 服务器地址
		if (StringUtils.isNoneBlank(clientIp)) {
			commandList.add("--host=" + clientIp);
		}
		// 添加命令参数:MySQL 用户名
		commandList.add("--user=" + userName);
		// 添加命令参数:备份文件路径
		commandList.add("--result-file=" + backupFilePath);
		// 添加命令参数:指定要备份的数据库
		commandList.add("--databases");
		// 添加要备份的数据库名称
		commandList.add(database);

		// 创建进程构建器
		ProcessBuilder pb = new ProcessBuilder(commandList);
		// 设置 MySQL 密码
		pb.environment().put("MYSQL_PWD", password);
		// 启动进程
		Process process = pb.start();
		readStringFromInputStream(process.getInputStream(), backupFilePath);
		// 等待进程结束
		int processComplete = process.waitFor();

		if (processComplete == 0) { // 如果进程成功结束
			return true;
		} else { // 如果进程没有成功结束
			return false;
		}
	}

	/**
	 * 存储文件
	 */
	private static void readStringFromInputStream(InputStream stream, String backupFilePath) throws IOException {
		byte[] buff = new byte[128];
		int n;
		FileOutputStream fileOutputStream = null;
		StringBuilder sb = new StringBuilder();
		try {
			while ((n = stream.read(buff)) != -1) {
				sb.append(new String(buff, 0, n));
			}
			fileOutputStream = new FileOutputStream(new File(backupFilePath));
			fileOutputStream.write(sb.toString().getBytes());

		} finally {
			fileOutputStream.close();
			stream.close();
		}
	}
}

存储数据表

public class DataSyncTransfer {
	/** MySQL安装目录的Bin目录的绝对路径 */
	private static String mysqlBinPath = "/usr/local/mysql/bin/";
	private static String mysqldump = mysqlBinPath + "mysqldump";

	/**
	 * 备份数据表
	 * 
	 * @param clientIp   访问MySQL数据库的主机
	 * @param port       访问MySQL数据库的端口
	 * @param userName   访问MySQL数据库的用户名
	 * @param password   访问MySQL数据库的密码
	 * @param database   需要备份的数据库
	 * @param tableName  需要备份的数据库,多个表之间使用空格分隔
	 * @param backupFile 备份生成的文件路径,如果指定路径的文件不存在会自动生成
	 */
	public static boolean backupTable(String clientIp, int port, String userName, String password, String database,
			String tableNames, String backupPath) throws Exception {
		// 根据逗号分隔符,将要备份的数据库名称拆分成数组
		// String[] tableArr = tableNames.split(",");
		// 当前日期
		String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date());
		// 当前时间
		String currentTime = new SimpleDateFormat("HHmmss").format(Calendar.getInstance().getTime());
		// 备份文件名
		String backupFileName = database + "-" + currentDate + currentTime + ".sql";
		// 备份文件路径
		String backupFilePath = Paths.get(backupPath, backupFileName).toFile().getPath();

		String command = mysqldump + " -u" + userName + " -p" + password + " " + database + " " + tableNames;
		Process process = Runtime.getRuntime().exec(command);
		readStringFromInputStream(process.getInputStream(), backupFilePath);

		// 等待进程结束
		int processComplete = process.waitFor();

		if (processComplete == 0) { // 如果进程成功结束
			return true;
		} else { // 如果进程没有成功结束
			return false;
		}
	}

	/**
	 * 存储文件
	 */
	private static void readStringFromInputStream(InputStream stream, String backupFilePath) throws IOException {
		byte[] buff = new byte[128];
		int n;
		FileOutputStream fileOutputStream = null;
		StringBuilder sb = new StringBuilder();
		try {
			while ((n = stream.read(buff)) != -1) {
				sb.append(new String(buff, 0, n));
			}
			fileOutputStream = new FileOutputStream(new File(backupFilePath));
			fileOutputStream.write(sb.toString().getBytes());

		} finally {
			fileOutputStream.close();
			stream.close();
		}
	}
}

</string>

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部