MySQL定时器Events_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1863 | 回复: 0   主题: MySQL定时器Events        下一篇 
lxk
注册用户
等级:上尉
经验:547
发帖:109
精华:0
注册:2011-8-18
状态:离线
发送短消息息给lxk 加好友    发送短消息息给lxk 发消息
发表于: IP:您无权察看 2014-12-17 15:22:54 | [全部帖] [楼主帖] 楼主

MySQL从5.1开始支持event功能,有了这个功能之后我们就可以让MySQL自动的执行数据汇总
等功能,不用像以前需要操作的支持了。如linux  crontab功能
一、背景
我们MySQL的表A的数据量已经达到1.6亿,由于一些历史原因,需要把表A的数据转移到一个新
表B,但是因为这是线上产品,所以宕机时间需要尽量的短,在不影响数据持续入库的情况下,
我希望能通过作业(定时器Events)的形式慢慢搬迁这些数据。
二、使用过程
(一)  查看当前是否已开启事件计划(调度器)有3种方法:
1)  SHOW VARIABLES LIKE 'event_scheduler';
2)  SELECT @@event_scheduler;
3)  SHOW PROCESSLIST;

(二)  开启事件计划(调度器)开关有4种方法:
1)  SET GLOBAL event_scheduler = 1;
2)  SET @@global.event_scheduler = 1;
3)  SET GLOBAL event_scheduler = ON;
4)  SET @@global.event_scheduler = ON;
键值1或者ON表示开启;0或者OFF表示关闭;

 www.2cto.com


(三)  关于事件计划的权限:
单独使用event调用SQL语句时,查看和创建需要用户具有event权限,调用该SQL语句时,需要
用户具有执行该SQL的权限。Event权 限的设置保存在mysql.user表和mysql.db表的Event_priv
字段中。(FLUSH PRIVILEGES;)
当event和procedure配合使用的时候,查看和创建存储过程需要用户具有create routine权限,
调用存储过程执行时需要使用excute权限,存储过程调用具体的SQL语句时,需要用户具有执
行该SQL的权限。

SELECT HOST,USER,Event_priv FROM mysql.user;


北京联动北方科技有限公司
MySQL定时器Events
获取当前登陆的用户和数据库:SELECT CURRENT_USER(), SCHEMA();
从Figure1可以知道bfsql@%是没有Event_priv权限的,在该用户下创建事件的时候会出现
下面的错误:

Error Code: 1044Access denied for user 'bfsql'@'%' to database 'blog'


如果出现上面的错误,执行下面的SQL就可以给bfsql@%赋予创建Event的权限:UPDATE
mysql.user SET Event_priv = 'Y' WHERE HOST='%' AND USER='bfsql';如果你这个时候再次
执行创建Event的SQL,还是会出现上面的错误,因为你需要执行:FLUSH PRIVILEGES;
最后,你可以通过SHOW GRANTS FOR 'bfsql'@'%';查看所有权限;

(四)  创建事件:
1)  创建事件的语法如下:

CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement


2)  创建事件的示例如下:

DELIMITER $$
CREATE EVENT IF NOT EXISTS e_blog
ON SCHEDULE EVERY 30 SECOND
ON COMPLETION PRESERVE
DO BEGIN
CALL MoveBlogData();
END$$
DELIMITER ;


DO sql_statement字段表示该event需要执行的SQL语句或存储过程。这里的SQL语句可以
是复合语句,使用BEGIN和END标识符将复合SQL语句按照执行顺序放在之间。

Java代码

--从现在开始每隔九天定时执行
CREATE EVENT EVENT1
ON SCHEDULE EVERY 9 DAY STARTS NOW()
ON COMPLETION PRESERVE ENABLE
DO
BEGIN
CALL TOTAL();
END
--每个月的一号凌晨1 点执行
CREATE EVENT EVENT2
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB
(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 1 HOUR)
ON COMPLETION PRESERVE ENABLE
DO
BEGIN
CALL STAT();
END
---每个季度一号的凌晨2点执行
CREATE EVENT TOTAL_SEASON_EVENT
ON SCHEDULE EVERY 1 QUARTER STARTS DATE_ADD(DATE_ADD(DATE( CONCAT(YEAR
(CURDATE()),'-',ELT(QUARTER(CURDATE()),1,4,7,10),'-',1)),INTERVAL 1 QUARTER),
INTERVAL 2 HOUR)
ON COMPLETION PRESERVE ENABLE
DO
BEGIN
CALL SEASON_STAT();
END
--每年1月1号凌晨四点执行
CREATE EVENT TOTAL_YEAR_EVENT
ON SCHEDULE EVERY 1 YEAR STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE())
+ 1,'-',1,'-',1)),INTERVAL 4 HOUR)
ON COMPLETION PRESERVE ENABLE
DO
BEGIN
CALL YEAR_STAT();
END


(五)  事件开启与关闭:
开启某事件:ALTER EVENT e_test ON COMPLETION PRESERVE ENABLE;
关闭某事件:ALTER EVENT e_test ON COMPLETION PRESERVE DISABLE;

三、其它知识点
对于我们线上环境来说,使用event时,注意在主库上开启定时器,从库上关闭定时器,event触发
所有操作均会记录binlog进行主从同步,从库上开启定时器很可能造成卡库。切换主库后之后记得
将新主库上的定时器打开。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论