• 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

  • 相关阅读:
    eclipse如何把多个项目放在一个文件夹下【eclipse中对项目进行分类管理】-图示详解
    hibernate中cache二级缓存问题
    Java处理正则验证手机号-详解
    Java处理手机号中间4位替换成*
    WPF:依赖属性的应用
    WPF:自定义路由事件的实现
    WPF:类型转换器的实现
    MFC中CString转化为char*
    Android4.4 往短信收件箱中插入自定义短信(伪造短信)
    OpenCV imread读取图片,imshow展示图片,出现cv:Exception at memory location异常
  • 原文地址:https://www.cnblogs.com/excellencesy/p/13880385.html
Copyright © 2020-2023  润新知