思路:通過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; } }