您的位置:首页 > 数据库 > MySQL

MySQL 定时任务event 按天建表 并将前一天数据导入新建的表中并删除总表数据 实现分表功能

2018-07-26 08:58 435 查看

需求:实现日志系统保存日志信息到数据库,由于日志信息量巨大,需要每天一张表来管理数据.

思路:总表不能改变,因为代码中SQL语句已经写死,表名不能改变;因此我们每天定时将总表数据导入到新表中,并将总表旧数据删除.

1.通过event事件实现定时执行存储过程procedure

2.通过创建存储过程procedure来建新表,导数据,删数据的操作

实现:

1.首先设置时区,并开启事件调度器

-- 设置好时区
SET time_zone = '+8:00'
-- 开启事件调度器
SET GLOBAL EVENT_SCHEDULER = 1;
-- 选择数据库
USE log_hos_gw;

2.创建自己的存储过程procedure
DROP PROCEDURE IF EXISTS create_log_record_everyday;

DELIMITER //    -- 将分隔符设置为//
CREATE PROCEDURE create_log_record_everyday() COMMENT '按日--建表--保存日志' 
BEGIN 
-- 建表
-- SET @dateStr = DATE_FORMAT(NOW(),'%Y_%m_%d'); 
SET @nowDateStr = DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 DAY),'%Y_%m_%d');
SET @createStr = CONCAT("CREATE TABLE sys_log_",@nowDateStr,
    " (`log_id` varchar(50) NOT NULL COMMENT '主键',
  `log_client_name` varchar(50) DEFAULT NULL COMMENT '客户端用户名',
  `log_client_ip` varchar(50) DEFAULT NULL COMMENT '客户端ip',
  `log_client_uri` varchar(500) DEFAULT NULL COMMENT '客户端uri',
  `log_method` varchar(20) DEFAULT NULL COMMENT '请求方式',
  `log_paramDatas` varchar(100) DEFAULT NULL COMMENT '请求参数',
  `log_sessionId` varchar(100) DEFAULT NULL COMMENT '请求接口唯一session标识',
  `log_create_time` timestamp NOT NULL COMMENT '创建时间',
  `log_update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  `log_returnDatas` varchar(1000) DEFAULT NULL COMMENT '接口返回json',
  `log_return_status` varchar(100) DEFAULT NULL COMMENT '接口返回的状态',
  PRIMARY KEY (`log_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统日志实体类' ;");
PREPARE stmt FROM @createStr;
EXECUTE stmt;
-- 将昨天的数据导入新建的表中
SET @tableName = CONCAT("sys_log_",@nowDateStr);
SET @insertStr = CONCAT("INSERT INTO",@tableName,

    "(log_id,log_client_name,log_client_ip,log_client_uri,log_method,log_paramDatas,log_sessionId,log_create_time,log_update_time,log_returnDatas,log_return_status)    SELECT log_id,log_client_name,log_client_ip,log_client_uri,log_method,log_paramDatas,log_sessionId,log_create_time,log_update_time,log_returnDatas,log_return_status FROM sys_log_event");
PREPARE stmt FROM @insertStr;
EXECUTE stmt;
-- 删除总表的数据
SET @deleteStr = "DELETE FROM sys_log_event";
PREPARE stmt FROM @deleteStr;
EXECUTE stmt;
END
//
DELIMITER; -- 重置分隔符为;

3.创建定时任务事件
-- 创建定时任务
-- 以//为分隔符(使;分隔符失效,一次全部执行)
DELIMITER //
DROP EVENT IF EXISTS EVENT_LOG_SCHEDULER //
-- 新建事件
CREATE EVENT EVENT_LOG_SCHEDULER 
-- 间隔一天
ON SCHEDULE EVERY 1 DAY 
-- 第一次执行时间(当前时间的半小时后)
STARTS DATE_ADD(NOW(),INTERVAL 30 HOUR_MINUTE)
DO
BEGIN
    -- 要调用的存储过程
    CALL create_log_record_everyday;
END 
//
-- 将分隔符重置为;
DELIMITER;

总结:

        至此我们使用MySQL5.0后版本(实现了procedure和event)通过procedure和event实现每天分表,并且导数据的功能.

备注:

        第一次写存储过程,如有不足,请指出,谢谢!

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐