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

本文共 1,891 字,预计阅读时间 6 分钟

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

复制代码
    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 @   钟小嘿  阅读(362)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2020-10-16 Map的遍历
点击右上角即可分享
微信分享提示