mysql定时器Events

MySQL定时器Events

1、背景php

  咱们MySQL的表A的数据量已经达到1.6亿,因为一些历史缘由,须要把表A的数据转移到一个新表B,可是由于这是线上产品,因此宕机时间须要尽可能的短,在不影响数据持续入库的状况下,我但愿能经过做业(定时器Events)的形式慢慢搬迁这些数据。html

  在MySQL做业的执行过程当中有一个问题是让人比较郁闷的,就是若是频率很快,快到做业尚未执行完成的话,做业就会被重复执行,这点跟SQL Server的不同的,若是想达到相似SQL Server做业的串行效果,只有看成业执行完毕,下一个迭代才会开始。后来通过一些设计能够解决了MySQL做业重复执行的问题,你能够参考:MySQL表数据迁移自动化mysql

 

2、使用过程sql

(一)  查看当前是否已开启事件计划(调度器)有3种方法:数据库

1)     SHOW VARIABLES LIKE 'event_scheduler';post

2)     SELECT @@event_scheduler;url

3)     SHOW PROCESSLIST;spa

 

(二)  开启事件计划(调度器)开关有4种方法:.net

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表示关闭;

提醒:虽然这里用set global event_scheduler = on语句开启了事件,可是每次重启电脑。或重启mysql服务后,会发现,事件自动关闭(event_scheduler=OFF),因此想让事件一直保持开启,最好修改配置文件,让mysql服务启动的时候开启时间,只须要在my.ini配置文件的[mysqld]部分加上event_scheduler=ON 便可,以下:

(三)  关于事件计划的权限:

  单独使用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;

 

(Figure1:user表的Event_priv权限)

获取当前登录的用户和数据库:SELECT CURRENT_USER(), SCHEMA();

从Figure1能够知道bfsql@%是没有Event_priv权限的,在该用户下建立事件的时候会出现下面的错误:

Error Code: 1044

Access 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 #每隔30秒执行一次
#ON SCHEDULE AT '2016-01-17 15:30:00' ON COMPLETION NOT PRESERVE ENABLE DO  #特定时间执行
ON COMPLETION PRESERVE
DO BEGIN
CALL MoveBlogData();
END$$
DELIMITER ;
复制代码

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

(五)  事件开启与关闭:

开启某事件:ALTER EVENT e_test ON COMPLETION PRESERVE ENABLE;

关闭某事件:ALTER EVENT e_test ON COMPLETION PRESERVE DISABLE;

 

3、其它知识点

  对于咱们线上环境来讲,使用event时,注意在主库上开启定时器,从库上关闭定时器,event触发全部操做均会记录binlog进行主从同步,从库上开启定时器极可能形成卡库。切换主库后以后记得将新主库上的定时器打开。

 

4、参考文献

mysql event(语法解释)

MYSQL EVENT 使用手册(示例)

MySQL-Events-CN(全面)

MySQL事件调度器Event Scheduler  

mysql access denied for user 'root'@' % ' to database

mysql中的 skip-name-resolve 问题

with admin option 和with grant option

MySQL存储过程详解  mysql 存储过程

 mysql 让一个存储过程定时做业的代码

相关文章
相关标签/搜索