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一号去执行这个方法即可。

    就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
  • 相关阅读:
    基于jQuery的自定义插件:实现整屏分页转换的功能
    蝶恋花
    js中面向对象编程
    移动端web页面列表类上拉加载,查看详情,iframe嵌套第三方页面遇到的问题以及解决办法
    控制使用jquery load()方法载入新页面中的元素
    bootstrap-daterangepicker双日历控件开始日期选择问题
    点击select下拉框获取option的属性值
    bootstrap table表格前台分页,点击tab选项,重新刷新表格
    jquery中使元素显示和隐藏方法之间的区别
    jquery对象和DOM对象的相互转换
  • 原文地址:https://www.cnblogs.com/zys2019/p/15407770.html
Copyright © 2011-2022 走看看