MySQL 定时任务event 按天建表 并将前一天数据导入新建的表中并删除总表数据 实现分表功能
需求:实现日志系统保存日志信息到数据库,由于日志信息量巨大,需要每天一张表来管理数据.
思路:总表不能改变,因为代码中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实现每天分表,并且导数据的功能.
备注:
第一次写存储过程,如有不足,请指出,谢谢!
阅读更多- MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)
- MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)
- MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)
- MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)
- MySQL定时任务删除数据
- Linux定时清理游戏log及mysql定时任务删除游戏日志数据
- mysql定时任务 每隔10分钟删除一次数据库里无用的数据
- 通过定时任务执行mysql的定期删除和新建分区,此处是按日分区
- MySQL用户新建,授权,删除,改密 数据简单导入导出
- 从 MySQL 导入导出大量数据的程序实现方法
- 使用服务程序实现PHP定时执行任务功能
- MySQL中数据结果集分页功能的实现方法
- SQL本地分布式操作远程数据库,可用于实现导入,导出等数据操作功能
- 手工实现GridView排序、删除、编辑、新增数据功能
- SQL Server 2005使用作业实现定时备份任务和删除指定天数前的备份文件
- 在php中实现MySql相同前缀数据表的批量删除
- 通过SSIS实现Oracle与Sqlserver数据库间的数据同步,并定时执行同步任务
- 工厂模式简单介绍及应用(以数据导入功能实现为例)
- 整理一下oracle、sqlserver、mysql的定时任务实现方法
- EXTJS学习系列提高篇:第二篇(转载)作者殷良胜,结合EXT2.2+C#.net实现将数据导入Excel的功能