视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL定时器Events_MySQL
2020-11-09 18:30:21 责编:小采
文档
 bitsCN.com

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

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

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

获取当前登陆的用户和数据库: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进行主从同步,从库上开启定时器很可能造成卡库。切换主库后之后记得
将新主库上的定时器打开。

bitsCN.com

下载本文
显示全文
专题