今天有一个需求,需要定时在mysql创建表与删除表,以及根据日期命名表名。诚然,通过外部程序很容易实现与控制这一切。
但是需要额外的服务需要维护,以及实现其它的调度机制。为了提高服务的稳定性,可维护性,所以打算研究一下mysql的event scheduler机制。
在网上了解了一下这方面内容,非常杂乱。而且基本雷同。经过自己的摸索,终于实现。算是对其它文章的一个补充。
方案如下:(mysql 5.1以后版本)
1. 查看当前是否已开启event scheduler机制,检查方法:SHOW VARIABLES LIKE 'event_scheduler'; 如果显示的值为OFF,则首先需要开启。
2. 开启方法: 修改 /etc/my.cnf 文件
[mysqld]
添加 event_scheduler=ON
3 . 重启 mysql 服务。
4. create event 语法:
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement;
5. 范例:
CREATE DEFINER = hotonline EVENT IF NOT EXISTS create_aronline_evnet
ON SCHEDULE EVERY 1 DAY STARTS '2013-03-17 12:00:00'
DO
call create_aronline_procedure();
其中 create_aronline_evnet 为 event 名称,建好以后可以去 mysql.event表查询。
EVERY 1 DAY STARTS '2013-03-17 12:00:00' 为自从 2013-03-17 12:00:00 开始 每天运行一次。
call create_aronline_procedure(); 为执行的一个存储过程。
-------- 以上即为 event scheduler 的机制,具体语法请参考mysql 文档,或网上其它文档 --------------
6. mysql 动态表名的实现:( 通过一般sql 是无法实现的,需要prepare支持,一下为存储过程封装的)
delimiter $$
create procedure create_aronline_procedure()
begin
set @prefix = 'CREATE TABLE IF NOT EXISTS ';
set @tablename = CONCAT('ar_online_',date_format(date_add(now(), interval 1 day),'%Y_%m_%d'));
set @suffix = '(id bigint(20) NOT NULL AUTO_INCREMENT,seed bigint(20) DEFAULT NULL,vid bigint(20) DEFAULT NULL,count int(11) NOT NULL,score double DEFAULT NULL,update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id),UNIQUE KEY pair (seed,vid)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8';
set @create_sql = concat(@prefix,@tablename,@suffix);
prepare stmt from @create_sql;
execute stmt;
deallocate prepare stmt;
end;
$$
delimiter ;
核心语法为红色标注的。
set @tablename = CONCAT('ar_online_',date_format(date_add(now(), interval 1 day),'%Y_%m_%d')); 这个部分为根据日期生成表名,然后concat.
prepare stmt from @create_sql; 其中 stmt 为 prepare 的命名。