程序数据备份

最近接触的项目由于数据量很大(千万级),导致查询很慢,于是和项目经理商量,只保留正式表的50个工作日数据,其他都备份到历史表中。

controller类

    @GetMapping("/testCreateTable")
    public String testCreateTable(@RequestParam("routerName") String routerName,
                                  @RequestParam("startNum") int startNum,
                                  @RequestParam("numSize") int numSize){
        String[] tableNames={"SYSTEM_ADUIT"};

        //第一种:根据指定分页的大小及参数内容进行创建新表备份 【适合数据量很少很少】
        String dateStr = DateUtil.getDateyyyyMmDdHHmmss();
        for(String tableName:tableNames) {
            String columns=systemAduitMapper.queryColumns(tableName);
            int table = systemAduitMapper.createTable(tableName,tableName+"_"+dateStr,columns,routerName,startNum,numSize);
            System.out.println("****************" + table);
        }

        //第二种:保留最近2个工作日,其他备份到历史表中,并将正式表数据删除

        //保留天数
        int reserveDay=2;
        //每轮备份10天
        int dayEveryBak=3;

        for(String tableName:tableNames) {
            try {
                //1.查询该表距离5个工作日需要备份的天数
                List<String> dayAll = systemAduitMapper.queryLastDayByLimit(0, tableName);
                //正式表工作日总数
                int dayAllCount = dayAll.size();

                while (dayAllCount > reserveDay) {
                    if (dayAllCount - dayEveryBak > reserveDay) {
                        dayAllCount = dayAllCount - dayEveryBak;
                    } else {
                        dayAllCount = reserveDay;
                    }
                    //2.查询最近时间
                    List<String> dayLast = systemAduitMapper.queryLastDayByLimit(dayAllCount-1, tableName);
                    String columns = systemAduitMapper.queryColumns(tableName);
                    System.out.println("备份时间"+dayLast);
                    //3.备份到历史表
                    systemAduitMapper.insertTable(tableName, tableName + "_HIS", columns, dayLast.get(0));
                    //4.删除正式表
                    systemAduitMapper.deleteByDayLast(tableName,dayLast.get(0));
                }
            }catch (Exception e){
                logger.error("{}表备份出现异常!",tableName,e);
            }
        }
        return "success";
    }

Mapper类

    //根据分页查询最近日期
    List<String> queryLastDayByLimit(@Param("reserveDay") int reserveDay,@Param("tableName") String tableName);

    //插入表内容
    public int insertTable(@Param("tableName") String tableName,@Param("backTableName") String backTableName,@Param("columns") String columns,
                           @Param("dayLast") String dayLast);

    //根据日期删除表数据
    int deleteByDayLast(@Param("tableName") String tableName,@Param("dayLast") String dayLast);

    //根据表名查询所有列
    String queryColumns(@Param("tableName") String tableName);

    //创建表
    public int createTable(@Param("tableName") String tableName,@Param("backTableName") String backTableName,@Param("columns") String columns,
                           @Param("routerName") String routerName,@Param("startNum") int startNum,@Param("numSize") int numSize);

xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bigdata.bigdata.mapper.SystemAduitMapper">

    <select id="queryColumns" parameterType="string" resultType="string">
        SELECT
          GROUP_CONCAT(COLUMN_NAME)
        FROM
         INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = #{tableName}
    </select>

    <select id="queryLastDayByLimit" resultType="string">
        select * from (
            select DISTINCT DATE_FORMAT( opertion_time,'%Y-%m-%d') as opertion_time
            from ${tableName}
            order by opertion_time desc)t
        <if test="reserveDay!=0">
            limit #{reserveDay},1
        </if>
    </select>

    <delete id="deleteByDayLast">
        delete FROM ${tableName}
        where  DATE_FORMAT( opertion_time,'%Y-%m-%d') &lt; STR_TO_DATE(#{dayLast},'%Y-%m-%d')
    </delete>

    <insert id="insertTable">
        INSERT INTO  ${backTableName} (${columns}) SELECT ${columns} FROM ${tableName}
        where  DATE_FORMAT( opertion_time,'%Y-%m-%d') &lt; STR_TO_DATE(#{dayLast},'%Y-%m-%d')
    </insert>

    <insert id="createTable">
        create table ${backTableName} as select ${columns} from (
        select * from ${tableName}
        where router_name=#{routerName} limit #{startNum},#{numSize})t
    </insert>

</mapper>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值