需求:实现日志系统保存日志信息到数据库,由于日志信息量巨大,需要每天一张表来管理数据.
思路:总表不能改变,因为代码中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实现每天分表,并且导数据的功能.
备注:
第一次写存储过程,如有不足,请指出,谢谢!