【工具類】mysqldump命令java中實現數據庫的備份與恢復

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

}

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章