思路:通过mysqldump将数据库数据指定目录生成sql文件,通过mysql命令可以将其恢复,实现数据传输;
工具类如下:
import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.IOException; import java.util.Arrays; /** * --------------------------- * MySQL备份与还原工具类 * --------------------------- */ @Slf4j public class MySQLDBUtil { private MySQLDBUtil() { } /** * 备份数据库所有表数据 * * @param host IP地址 * @param username 数据库的用户名 * @param password 数据库的密码 * @param savePath 备份文件的地址 * @param fileName 备份文件名称 * @param databaseName 需要备份的数据库的名称 * @return 备份成功返回true, 否则返回false */ public static boolean backup(String host, String port, String username, String password, String savePath, String fileName, String databaseName) { File saveFile = new File(savePath); if (!saveFile.exists()) {// 如果目录不存在 saveFile.mkdirs();// 创建文件夹 } if (!savePath.endsWith("/")) { savePath = savePath + "/"; } //拼接命令行的命令 // mysqldump --opt -u用户名 -p密码 -hIP地址 -P端口号 --default-character-set=utf8 -B 数据库名 -r文件地址+文件名称 StringBuilder cmd = new StringBuilder(); cmd.append("mysqldump").append(" --opt") .append(" -u").append(username) .append(" -p").append(password) .append(" -h").append(host) .append(" -P").append(port) .append(" --default-character-set=utf8 ") .append(" -B ").append(databaseName) .append(" -r").append(savePath + fileName); try { //调用外部执行exe文件的javaAPI Process process = Runtime.getRuntime().exec(getCommand(cmd.toString())); if (process.waitFor() == 0) {// 0 表示线程正常终止 log.info("数据备份成功,备份路径为:" + savePath); return true; } } catch (IOException | InterruptedException e) { log.error("MySQL数据库进行备份,备份命令执行错误!" + e.getMessage()); } return false; } /** * 将备份的数据库sql文件导入到指定数据库 * * @param filePath 数据库备份的sql文件路径 * @param host IP地址 * @param databaseName 数据库名称 * @param username 用户名 * @param password 密码 * @return 数据导入成功为true, 否则为false */ public static boolean recover(String host, String port, String username, String password, String filePath, String fileName, String databaseName) { //拼接命令行的命令 // mysql -u用户名 -p密码 -hIP地址 -P端口号 --default-character-set=utf8 -B 数据库名 < 文件地址+文件名称 //mysql -uroot -proot -h192.268.1.123 -P3306 --default-character-set=utf8 -B testdb < ./conf_sql/recover_db/conf.sql StringBuilder cmd = new StringBuilder(); cmd.append("mysql") .append(" -u").append(username) .append(" -p").append(password) .append(" -h").append(host) .append(" -P").append(port) .append(" --default-character-set=utf8 ") .append(" -B ").append(databaseName) .append(" < ").append(filePath + fileName); try { Process process = Runtime.getRuntime().exec(getCommand(cmd.toString())); if (process.waitFor() == 0) {// 0 表示线程正常终止 log.info("数据已从 " + filePath + " 导入到数据库中"); return true; } } catch (IOException | InterruptedException e) { log.error("Mysql数据导入数据库发生异常" + e.getMessage()); } return false; } private static String[] getCommand(String command) { String os = System.getProperty("os.name"); String shell = "/bin/bash"; String c = "-c"; if (os.toLowerCase().startsWith("win")) { shell = "cmd"; c = "/c"; } String[] cmd = {shell, c, command}; log.info("...数据库备份过程中,执行的sql恢复命令为:" + Arrays.toString(cmd)); return cmd; } }
输出示例:
[cmd, /c, mysqldump --opt -uaaa -pzzz -h10.110.10.xxx -P3306 --default-character-set=utf8 -B dbname t1 t2 t3 -r./sql/1603966233/V1.0.0/db.sql]