java 代码通过调用mysqldump命令备份mysql数据库

   数据库备份是开发工作中经常要做的事情,好处是mysql提供了一个非常好的命令 mysqldump,直接调用它就可以将数据以sql文件的形式备份出来。但是直接写命令非常不方便,遇到定时备份或者指定备份那么就需要代码调用。下面是一个使用java代码调用该命令的小示例:
 /**
     * 备份调用工具方法
     *
     * @param connectParam 包含数据库连接信息的对象
     * @param backupAll    是否全部备份
     * @param startTime    待备份日志的时间区间结束点
     * @param endTime      待备份日志的时间区间结束点
     * @return 备份操作结果
     */
    public CommonResult backupLoginfo(ConnectParam connectParam, boolean backupAll,
                                      String startTime, String endTime) {
        CommonResult result = new CommonResult();

        String strFilter;
        String strFilePath = strLogExcelPath;
        if (backupAll) {
            strFilter = "\"1=1\"";
            // 其实此处.sql和.dump效果是一样的
            strFilePath += String.format("loginfo-%s.dump", System.currentTimeMillis());
        } else {
            if (null == startTime || startTime.isEmpty() || null == endTime || endTime.isEmpty()) {
                result.message = "起止时间不能为空";
                result.result = false;
                return result;
            } else {
                strFilter = String.format("\"OPERTIME BETWEEN '%s' AND '%s'\"", startTime, endTime);
                // 文件名中要剔除非法字符
                strFilePath += String.format("loginfo(%s_%s).dump", startTime, endTime)
                        .replaceAll(":", "");
            }
        }
        try {
            int nBackUpResult = backUpDataTable(connectParam.ip,
                    connectParam.userName,
                    connectParam.password,
                    String.format(" %s lnd_loginfo", connectParam.databaseName),
                    strFilter,
                    strFilePath);
            // 0 表示线程正常终止
            if (0 == nBackUpResult) {
                result.result = true;
                return result;
            }
        } catch (IOException ie) {
            logger.error(ie.getMessage());
        } catch (InterruptedException ire) {
            logger.error(ire.getMessage());
        } catch (Exception e) {
            logger.error(e.getMessage());
        }

        result.result = false;
        result.message = "备份异常";
        return result;
    }

    public static int backUpDataTable(String clientIp, String userName, String userPsw,
                                      String tableInfo, String strFilter, String strFilePath)
            throws IOException, InterruptedException {
        // 判断路径是否存在
        File file = new File(strFilePath).getParentFile();
        if (!file.exists()) {
            file.mkdirs();
        }
        // 拼接命令行的命令
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("mysqldump -t --opt -h").append(clientIp)
                // 用户名、密码、表名
                .append(" --user=").append(userName).append(" --password=").append(userPsw).append(tableInfo)
                // 条件语句
                .append(" --where=").append(strFilter)
                .append(" --lock-all-tables=true")
                // 导出路径
                .append(" --result-file=").append(strFilePath).append(" --default-character-set=utf8");

        // 调用外部执行exe文件的javaAPI
        logger.info("执行mysql指令:" + stringBuilder.toString());
        Process process = Runtime.getRuntime().exec(stringBuilder.toString());
        return process.waitFor();
    }
其中backupLoginfo()方法是备份数据的调用方法,传入的参数是连接mysql的信息,类如下,可以备份某个数据库的表的全部数据或者选择一部分数据。这里通过参数backupAll来确定,当backupAll=true的时候,那么输入备份的时间。
    /**
     * 用于映射lnd.oper.datasource.DataSourceParam,传递数据库连接参数
     */
    public class ConnectParam {
        public String ip;
        public String databaseName;
        public String userName;
        public String password;
    }

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐