日志归档--基于mysql写的存储过程

CREATE DEFINER=`iscs`@`%` PROCEDURE `CUSTOM_LOG_ARCHIVE`(IN `archiveType` int)
BEGIN
                DECLARE t_error INTEGER DEFAULT 0;  
                DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
                #开启事务
                START TRANSACTION;
                
                IF archiveType=1 THEN
                        #获取上月的表名
                        SET @currentym =left(DATE_SUB(CURRENT_DATE,INTERVAL 1 MONTH),7);
                        SET @logTable=CONCAT('sys_log_',left(@currentym,4),right(@currentym,2));
                        SET @dateOne=concat(left(DATE_SUB(CURRENT_DATE,INTERVAL 1 MONTH),7),"-01");
                        SET @datemonthone=concat(left(CURDATE(),8),"01");
                        SET @archiveName=CONCAT(left(@currentym,4),"年",right(@currentym,2),"月归档日志");
                        #查询归档记录信息
                        SET @tableName=(SELECT table_name FROM sys_archive_log where start_time=@dateOne AND end_time=@datemonthone);
                        
                        SET @allCount=(SELECT COUNT(*) FROM sys_log WHERE CREATE_TIME>@dateOne and CREATE_TIME<@datemonthone ORDER BY CREATE_TIME DESC);
                    
                        IF @tableName IS NULL THEN
                            #判断是否需要建表,没有则创建
                                SET @STMT :=CONCAT("CREATE TABLE IF NOT EXISTS ",@logTable," LIKE sys_log;");
                                
                                PREPARE STMT FROM @STMT;
                                EXECUTE STMT;
                                
                                #保存当前归档信息
                                INSERT INTO sys_archive_log (start_time,end_time,table_name,archive_name,create_time,rule,count) VALUES(@dateOne,@datemonthone,@logTable,@archiveName,CURRENT_DATE,archiveType,@allCount);
                        ELSE
                         SELECT "已经有表"+@tableName;
                        END IF;
                    
                        IF @allCount>0 THEN
                            #日志迁移
                                SET @STMT :=CONCAT("INSERT INTO ",@logTable," SELECT * FROM sys_log WHERE CREATE_TIME>'",@dateOne,"' and CREATE_TIME<'",@datemonthone,"' ORDER BY CREATE_TIME DESC;");
                                PREPARE STMT FROM @STMT;
                                EXECUTE STMT;
                                #SELECT @dateOne,@datemonthone,@STMT;
                                #删除log表中对应数据
                                DELETE from sys_log WHERE CREATE_TIME>@dateOne and CREATE_TIME<@datemonthone ORDER BY CREATE_TIME DESC;
                                
                        ELSE
                         SELECT "没有可归档数据";
                        END IF;
                        
                
                ELSEIF archiveType=2 THEN
                # 按一个季度数据
                        #获取上月的表名
                        SET @currentym =left(DATE_SUB("2019-07-01",INTERVAL 1 MONTH),7);
                        SET @logTable=CONCAT('sys_log_',left(@currentym,4),right(@currentym,2));
                        SET @dateOne="2019-06-01";
                        SET @datemonthone="2019-07-01";
                        SET @archiveName=CONCAT(left(@currentym,4),"年",right(@currentym,2),"月归档日志");
                        #查询归档记录信息
                        SET @tableName=(SELECT table_name FROM sys_archive_log where start_time=@dateOne AND end_time=@datemonthone);
                        
                        SET @allCount=(SELECT COUNT(*) FROM sys_log WHERE CREATE_TIME>@dateOne and CREATE_TIME<@datemonthone ORDER BY CREATE_TIME DESC);
                    
                        IF @tableName IS NULL THEN
                            #判断是否需要建表,没有则创建
                                SET @STMT :=CONCAT("CREATE TABLE IF NOT EXISTS ",@logTable," LIKE sys_log;");
                                
                                PREPARE STMT FROM @STMT;
                                EXECUTE STMT;
                                
                                #保存当前归档信息
                                INSERT INTO sys_archive_log (start_time,end_time,table_name,archive_name,create_time,rule,count) VALUES(@dateOne,@datemonthone,@logTable,@archiveName,CURRENT_DATE,archiveType,@allCount);
                        ELSE
                         SELECT "已经有表"+@tableName;
                        END IF;
                    
                        IF @allCount>0 THEN
                            #日志迁移
                                SET @STMT :=CONCAT("INSERT INTO ",@logTable," SELECT * FROM sys_log WHERE CREATE_TIME>'",@dateOne,"' and CREATE_TIME<'",@datemonthone,"' ORDER BY CREATE_TIME DESC;");
                                PREPARE STMT FROM @STMT;
                                EXECUTE STMT;
                                #SELECT @dateOne,@datemonthone,@STMT;
                                #删除log表中对应数据
                                DELETE from sys_log WHERE CREATE_TIME>@dateOne and CREATE_TIME<@datemonthone ORDER BY CREATE_TIME DESC;
                                
                        ELSE
                         SELECT "没有可归档数据";
                        END IF;
                        
                ELSEIF archiveType=3 THEN
                # 按半年获取数据
                        SET @currentym =left(DATE_SUB(CURRENT_DATE,INTERVAL 1 MONTH),7);
                        SET @logTable=CONCAT('log_',left(@currentym,4),right(@currentym,2));
                ELSE
                #获取年的表名
                        SET @currentym =left(DATE_SUB(CURRENT_DATE,INTERVAL 1 MONTH),7);
                        SET @logTable=CONCAT('log_',left(@currentym,4),right(@currentym,2));
                END IF;
                
                IF t_error = 1 THEN
                            #事务回滚
             ROLLBACK;
        ELSE
                        #事务提交
            COMMIT;  
        END IF;  
                select t_error;
END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿卢

谢谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值