zoukankan      html  css  js  c++  java
  • 定时备份日志数据(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一号去执行这个方法即可。

    就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
  • 相关阅读:
    Objects in this class cannot be updated outside
    操作系统原理好书推荐
    Can't initialize OCI
    比较好的GIS blog
    栅格数据开发
    arcgis 本地地图服务 silverlight 调用报错 .
    (转载)Rasterdataset Load data耗时
    网络达人梁宏达
    arcengine总结(1)栅格数据开发
    MyNPOI V1.2发布并开放源码,让.NET Excel导出将简单进行到底【转】
  • 原文地址:https://www.cnblogs.com/zys2019/p/15407770.html
Copyright © 2011-2022 走看看