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:dataBaseFiledataBaseFile20201026133816.sql

原文地址:https://www.cnblogs.com/excellencesy/p/13880385.html