這個功能是之前的一個同事開發的,最近項目要上線發現功能不能用了,而且沒有任何的提示.
看了下具體的代碼,他是調用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