Spring Boot中Mysql數據庫備份


這個功能是之前的一個同事開發的,最近項目要上線發現功能不能用了,而且沒有任何的提示.

看了下具體的代碼,他是調用cmd命令來實現的數據庫備份,第一反應是:

(1)如果他是使用cmd中mysql的命令來備份那就需要服務器端能執行mysql命令,要想在隨意位置都可以,還需要把具體命令的路徑加到環境變量里面

然后我在我自己電腦上裝了mysql測試,配置好環境變量,發現還是不對,但是手動執行程序中調用的命令卻能備份成功,

(2)猜想是CMD執行命令寫的有問題,看了他寫的代碼,確實跟我之前寫的不太一樣,就改成了我之前寫的cmdUtil

更換執行cmd命令的代碼后程序就可以正確執行了.

下面是執行命令的代碼,跟之前的代碼相比較:

(1)指定了命令的執行目錄(這里起初我也以為配置了環境變量就可以不用指定,但是不指定一直報錯,只能把目錄寫上,在項目中就在的application.properties文件中添加了這個命令的目錄的配置項)

(2)原來的代碼中,在執行完之后,new了兩個的線程去處理返回的流信息,我這里改成了簡單的拼接到字符串,可以在前台提示,或者更新到數據庫的備注信息中.

package com.googosoft.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

/**
 * @version: V1.0
 * @author: songyan
 * @className: CMDUtil
 * @packageName: com.googosoft.utils
 * @description: cmd命令執行工具
 * @date: 2020/10/24   10:19
 */
public class CMDUtil {

    /**
     * @author: songyan
     * @methodsName: runCommand
     * @param command
     * @param dir
     * @description: 在指定目錄執行指定命令
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     */
    public static Map<String, Object> runCommand(String command, String dir) {
        Map<String, Object> result = new HashMap<String, Object>();
        boolean flag = true;
        StringBuilder msg = new StringBuilder();
            BufferedReader bufferedReader = null;
            Process proc = null;
            ProcessBuilder pb = new ProcessBuilder("cmd ", "/c", command);
            pb.directory(new File(dir));
            try {
                proc = pb.start();
                bufferedReader = new BufferedReader(new InputStreamReader(proc.getErrorStream(), "gbk"));
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    msg.append(line);
                }
                proc.waitFor();
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                if (bufferedReader != null) {
                    try {
                        bufferedReader.close();
                    } catch (Exception ex) {
                    }
                }
                if(proc!=null){
                    proc.destroy();
                }
            }
        result.put("flag", flag);
        result.put("msg", msg);
        return result;
    }

}

執行的命令:cmd /c mysqldump -h127.0.0.1 -P3306 -uroot -proot --default-character-set=utf8 wyglxt_w > D:\dataBaseFile\dataBaseFile20201026133816.sql

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM