java mysql数据库备份,列表,还原,删除

java mysql数据库备份,列表,还原,删除

(java mysql数据库备份,列表,还原,删除,备份sql,记录文件存储,按时间展示)
界面效果:
在这里插入图片描述备份

 /**
     * 判断当前是否存在数据库操作
     */
    public static boolean ISDBOPER = false;
    
    @Override
    public ResponseResult backupKeySnData(HttpServletRequest request) {
        // 判断是否有其他备份操作
        if (ISDBOPER) {
            return new ResponseResult(201, "备份数据库失败,其他任务在执行");
        }
        ISDBOPER = true;
        // 获取备份文件路径
        String backupPath = getPathName(request);
        // 实例化文件
        File file = new File(backupPath);
        RandomAccessFile randomFile = null;
        StringBuffer sqlBuf = new StringBuffer();
        // 排除备份表
        List<String> excludeBack = Arrays.asList(
                new String[]{"tb_app_log", "tb_log", "tb_seclogon_log"});
        // 如果文件不存在,则创建文件路径
        if (!file.exists())
            file.mkdirs();
        // 获取数据库表
        List<Map<String, String>> tableList = sysParamsMapper.getDataBaseTableList();
        for (Map<String, String> tableRecord : tableList) {
            String tableName = tableRecord.get("tablename");
            if (excludeBack.contains(tableName)) {
                continue;
            }
            // 获取删除数据库数据sql
            String deleteSql = "DELETE FROM " + tableName + ";\r\n";
            sqlBuf.append(deleteSql);
            // 有数据才进行备份操作
            if (sysParamsMapper.getCount(tableName) > 0) {
                // 获取插入数据库数据sql
                String insertSql = this.getInsertSqlByTable(tableName);
                sqlBuf.append(insertSql);
            }
        }
        // 获取生成的sql文件名称
        String fileName = backupPath + "db_" + (new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss")).format(new Date())
                + ".sql";
        try {
            // 实例化随机访问文件对象
            randomFile = new RandomAccessFile(fileName, "rw");
            // 写入文件使用Base64加密
            randomFile.write(Base64Util.encode(sqlBuf.toString().getBytes("UTF-8")));
            randomFile.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ISDBOPER = false;
        return new ResponseResult(200, "备份成功");
    }
    
    @NotNull
    private String getPathName(HttpServletRequest request) {
        return Constants.DATA_BACKUP_PATH + File.separator;
    }
/**
     * @param tableName
     * @return String
     * @throws
     * @Title: getInsertSqlByTable
     * @Description: 根据数据库表获取插入语句
     */
    private String getInsertSqlByTable(String tableName) {
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement pst = null;
        String sql = "SELECT * FROM " + tableName;
        String resultStr = "";
        StringBuffer columnNameBuf = new StringBuffer();
        StringBuffer columnDataBuf = new StringBuffer();
        try {
            // 获取数据库连接
            conn = dataSource.getConnection();
            pst = conn.prepareStatement(sql);
            rs = pst.executeQuery();
            // 获取表字段数量
            int colAmount = rs.getMetaData().getColumnCount();
            while (rs.next()) {
                columnNameBuf = new StringBuffer();
                columnDataBuf = new StringBuffer();
                for (int j = 0; j < colAmount; j++) {
                    // 获取表字段名称
                    String columnName = rs.getMetaData().getColumnName(j + 1);
                    if ("GROUP".equalsIgnoreCase(columnName))
                        columnName = "`".concat(columnName).concat("`");
                    columnNameBuf.append(columnName).append(',');
                    // 获取表字段类型
                    String columnType = rs.getMetaData().getColumnTypeName(j + 1).toUpperCase(Locale.US);
                    // 获取表字段数据
                    String columnData = (rs.getObject(j + 1) == null) ? null : rs.getObject(j + 1).toString();
                    // 判断表字段类型
                    if (("VARCHAR".equals(columnType) || columnType.indexOf("BLOB") > -1
                            || "TIMESTAMP".equals(columnType) || "DATETIME".equals(columnType)
                            || "CHAR".equals(columnType) || "TEXT".equals(columnType)) && columnData != null) {
                        columnDataBuf.append("'");
                        columnData = columnData.replace("\\", "\\\\");
                        columnData = columnData.replace("'", "''");
                        columnDataBuf.append(columnData);
                        columnDataBuf.append("'");
                        columnDataBuf.append(',');
                    } else if ("VARBINARY".equals(columnType)) {
                        boolean bData = rs.getBoolean(j + 1);
                        columnDataBuf.append(bData).append(',');
                    } else {
                        columnDataBuf.append(columnData).append(',');
                    }
                }
                String allColumnName = columnNameBuf.toString();
                allColumnName = allColumnName.substring(0, allColumnName.length() - 1);
                String allColumnData = columnDataBuf.toString();
                allColumnData = allColumnData.substring(0, allColumnData.length() - 1);
                // 获取插入语句
                String insertSql = "INSERT INTO " + tableName + "(" + allColumnName + ") VALUES(" + allColumnData
                        + ");\r\n";
                resultStr = resultStr + insertSql;
            }
            return resultStr;
        } catch (Exception e) {
            LOG.error("getInsertSqlByTable error:" + e.getMessage());
            return "";
        } finally {
            if (rs != null)
                try {
                    rs.close();
                } catch (SQLException e) {
                }
            if (pst != null)
                try {
                    pst.close();
                } catch (SQLException e) {
                }
            if (conn != null)
                try {
                    conn.close();
                } catch (SQLException e) {
                }
        }
    }

列表

 @Override
    public ResponseResult getKeySnBackupBook(Map<String, Object> map, HttpServletRequest request) {
        Page<Map<String, String>> page = new Page<Map<String, String>>(Integer.valueOf(map.get("page").toString()), Integer.valueOf(map.get("pageSize").toString()));
        // 获取备份文件路径
        File file = new File(getPathName(request));
        // 查询备份文件
        File[] files = file.listFiles(new FileFilter() {
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".sql");
            }
        });

        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
        if (files != null && files.length > 0) {
            for (int i = 0; i < files.length; i++) {
                Map<String, String> record = new HashMap<String, String>();
                record.put("path", files[i].getName());
                String dateString = files[i].getName().substring(files[i].getName().indexOf("_") + 1,
                        files[i].getName().lastIndexOf("."));
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
                try {
                    Date parse = sdf.parse(dateString);
                    record.put("time", String.valueOf(parse.getTime() / 1000));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                list.add(record);
            }
        }
        // 对结果集按照创建时间降序排列
        list.sort(new Comparator<Map<String, String>>() {
            @Override
            public int compare(Map<String, String> o1, Map<String, String> o2) {
                Integer date = Integer.parseInt(o1.get("time"));
                Integer date1 = Integer.parseInt(o2.get("time"));
                // 进行时间比较
                if (date > date1) {
                    return -1;
                } else {
                    return 1;
                }
            }
        });
        // 查询当前页码
        int pageNumber = (int) page.getCurrent();
        // 查询每页条数
        int pageSize = (int) page.getSize();
        // 获取查询偏移量
        int offset = pageSize * (pageNumber - 1);
        List<Map<String, String>> fileList = new ArrayList<Map<String, String>>();
        for (int i = offset; i < offset + pageSize && list.size() > i; i++) {
            fileList.add(list.get(i));
        }
        // 实例化分页对象
        Page<Map<String, String>> pageList = new Page<Map<String, String>>();
        // 设置当前页
        pageList.setCurrent(page.getCurrent());
        // 设置每页数量
        pageList.setSize(page.getSize());
        // 设置总条数
        pageList.setTotal(files != null ? files.length : 0);
        // 设置数据
        pageList.setRecords(fileList);
        return new ResponseResult(200, "查询成功", pageList);
    }

还原

 @Override
    public ResponseResult rollbackKeySnData(HttpServletRequest request, Map<String, Object> map) {
        String filePath = map.get("filePath").toString();
        // 判断是否有其他备份或还原操作
        if (ISDBOPER) {
            return new ResponseResult(201, "有其他任务正在执行数据库备份或还原操作,请稍后再试");
        }
        ISDBOPER = true;
        // 获取还原的sql文件路径
        String backupPath = getPathName(request) + filePath;
        RandomAccessFile randomFile = null;
        StringBuffer sqlBuf = new StringBuffer();
        String result = "success";
        try {
            randomFile = new RandomAccessFile(backupPath, "rw");
            String lineString;
            // 读取sql文件
            while ((lineString = randomFile.readLine()) != null) {
                sqlBuf.append(lineString);
            }
            String strSqls = new String(Base64Util.decode(sqlBuf.toString().getBytes("UTF-8")), "UTF-8");
            // 获取sql列表
            List<String> sqlList = new ArrayList<String>(Arrays.asList(strSqls.split(";\r\n")));
            // 执行还原操作
            result = this.processSqlList(sqlList);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
        // 关闭流,解决备份还原后文件无法删除问题
            if(randomFile!=null){
                try {
                    randomFile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        ISDBOPER = false;
        if (result.equals("success")) {
            return new ResponseResult(200, "还原数据库成功");
        }
        return new ResponseResult(201, "还原数据库失败");
    }
    /**
     * @param @param  sqlList
     * @param @return 参数
     * @return String    返回类型
     * @throws
     * @Title: processSqlList
     * @Description: 恢复数据库
     */
    private String processSqlList(List<String> sqlList) {
        String result = "success";
        Connection conn = null;
        Statement stmt = null;
        try {
            // 获取数据库连接
            conn = dataSource.getConnection();
            stmt = conn.createStatement();
            // 不检查外键约束关系
            stmt.addBatch("SET FOREIGN_KEY_CHECKS=0;");
            // 添加sql文件sql
            for (String sql : sqlList) {
                stmt.addBatch(sql);
            }
            stmt.addBatch("SET FOREIGN_KEY_CHECKS=1;");
            // 批量执行sql语句
            stmt.executeBatch();
        } catch (SQLException e) {
            result = "fail";
        } finally {
            try {
                if (stmt != null)
                    stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
//                 result = printSqlException("3", e.getErrorCode(), "+ e.getMessage());
            }
            try {
                if (conn != null)
                    conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                // result = printSqlException("3", e.getErrorCode(), "+ e.getMessage());
            }
        }
        return result;
    }

删除

 @Override
    public ResponseResult deleteKeySnBackup(HttpServletRequest request, Map<String, Object> map) {
        String filePath = map.get("filePath").toString();
        // 获取备份文件路径
        File file = new File(
                getPathName(request) + filePath);
        // 执行删除操作
        if (!file.exists() || !file.delete()) {
            return new ResponseResult(201, "删除失败");
        }
        return new ResponseResult(200, "删除成功");
    }

以上!
上面有个坑点,还原后文件无法删除,重启服务可以删除,面向百度后排查 发现还原文件流未关闭;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值