java调用mysqldump进行数据库远程备份

java调用mysqldump进行数据库远程备份

近日需要在应用中,进行远程数据库的备份,在网上排查了一番,很多文章能把重点说出来,但殊不知,还有很多细节没有体现。正是由于这些细节问题,导致运行不成功,特此记录下,与大家分享。
以mysql为例,网友大部分采用的方案是:java 调用process,执行mysqldump命令。本人也是在该方案基础上的尝试。
如果想让java应用执行mysqldump命令,前提必须在java应用的机器上存在mysqldump命令,可以不安装mysql数据库,但是该命令必须存在。以windows平台为例,在某个目录下必须存在mysqldump.exe文件。
同时采用jdbc方式连接数据库时,url需关闭ssl:

jdbc:mysql://localhost/springboot?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false //关闭SSL

另外,如果想获取process.waitfor()方法的错误信息,必须在调用该方法之前,单独开启线程获取:

new Thread() {
				@Override
				public void run() {
					BufferedReader err = null;
					try {
						err = new BufferedReader(new InputStreamReader(p.getErrorStream(), "gbk"));
					} catch (UnsupportedEncodingException e1) {
						e1.printStackTrace();
					}
					String line = null;
					StringBuilder result = new StringBuilder();
					try {
						while ((line = err.readLine()) != null) {
							result.append(line);
						}
						System.out.println("the error message is :" + result.toString());
					} catch (IOException e) {
						e.printStackTrace();
					} finally {
						try {
							err.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			}.start();
			int processStatus = p.waitFor();

最后,附上测试完成代码:

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MysqlBack {
	public static void main(String[] args) {
		String DB_HOST = "192.168.1.11";
		String DB_PORT = "3306";
		String DB_NAME = "test";
		String DB_USERNAME = "root";
		String DB_PASSWORD = "root";
		String BACKUP_PATH = "d:\\backup\\";
		String filename = "backup_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".sql";
		Connection conn = null;
		Statement stmt = null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			//关闭ssl
			String url = "jdbc:mysql://" + DB_HOST + ":" + DB_PORT + "/" + DB_NAME
					+ "?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false";
			conn = DriverManager.getConnection(url, DB_USERNAME, DB_PASSWORD);
			stmt = conn.createStatement();
			String backup = "mysqldump -h " + DB_HOST + " -P " + DB_PORT + " -u " + DB_USERNAME + " -p" + DB_PASSWORD
					+ " " + DB_NAME + " >" + BACKUP_PATH + "\\" + filename;
			System.out.println(backup);
			Runtime runtime = Runtime.getRuntime();
			//需要添加cmd.exe /c 
			String command = "cmd.exe /c " + backup;
			//需要指定mysqldump命令所在路径
			Process p = runtime.exec(command, null, new File("D:\\mysqldump"));
			new Thread() {
				@Override
				public void run() {
					BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
					String line = null;

					try {
						while ((line = in.readLine()) != null) {
							System.out.println("执行的结果为: " + line);
						}
					} catch (IOException e) {
						e.printStackTrace();
					} finally {
						try {
							in.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			}.start();

			new Thread() {
				@Override
				public void run() {
					BufferedReader err = null;
					try {
						err = new BufferedReader(new InputStreamReader(p.getErrorStream(), "gbk"));
					} catch (UnsupportedEncodingException e1) {
						e1.printStackTrace();
					}
					String line = null;
					StringBuilder result = new StringBuilder();
					try {
						while ((line = err.readLine()) != null) {
							result.append(line);
						}
						System.out.println("the error message is :" + result.toString());
					} catch (IOException e) {
						e.printStackTrace();
					} finally {
						try {
							err.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			}.start();
			int processStatus = p.waitFor();
			if (processStatus == 0) {
				System.out.println("Database has been backed up successfully.");
			} else {
				System.out.println("An error occurred during backup process.");
			}
			p.destroy();
		} catch (Exception e) {
			e.printStackTrace();

		} finally {
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}

	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值