定时备份日志数据(MySQL版)

日志数据往往都非常的大,查询起来非常的慢,可进行分表。一种方式是在记录日志时进行按月分表,另一种是使用定时任务把前面的数据按月分表。本文介绍第二种方式(只展示关键代码):

    public void backupSystemLog() {
        log.info("开始进行日志备份...");
        long start = System.currentTimeMillis();
        //备份指定月份前的数据
        Calendar c = Calendar.getInstance();
        Integer logMonth = 6;//推荐在配置文件配置
        String backupTablePrefix = "sys_log";//推荐在配置文件配置
        c.add(Calendar.MONTH, -logMonth);
        //获取指定月份前的日期
        String lastDateStr = cn.hutool.core.date.DateUtil.formatDate(c.getTime());
        //根据日期查询数据并生成日期字符串
        List<String> tableNames = systemLogDao.selectTableNameMonth(lastDateStr);
        if (CollectionUtil.isNotEmpty(tableNames)) {
            List<Map<String, Object>> list = new ArrayList<>();
            tableNames.stream().forEach(item -> {
                Map<String, Object> map = new HashMap<>();
                map.put("month", item);
                map.put("tableName", backupTablePrefix + item);
                list.add(map);
            });
            //先把指定的数据备份,然后删除此数据
            systemLogDao.backupSystemLog(list);
        }
        long end = System.currentTimeMillis();
        log.info("日志备份完成,所用时间:{} ms", end - start);

    }         

 上述使用java代码方式获取指定月份前的日期进行日志的备份。sql的脚本如下(结合mybatis):

<!--备份数据-->
    <select id="backupSystemLog">
        <foreach collection="list" item="item">
            create table ${item.tableName} as select * from sys_log
            where  DATE_FORMAT(create_time, '%Y%m') = #{item.month};
            delete from sys_log where  DATE_FORMAT(create_time, '%Y%m') = #{item.month};
        </foreach>
    </select>
<!--根据月份查询表名--> <select id="selectTableNameMonth" resultType="String"> select distinct DATE_FORMAT(create_time, '%Y%m') from sys_log where DATE_FORMAT(create_time, '%Y-%m-%d') &lt; #{endDate} </select>

完成这些功能,剩下的就是使用定时任务,每月1一号去执行这个方法即可。

posted @ 2021-10-16 09:47  钟小嘿  阅读(343)  评论(0编辑  收藏  举报