MySQL Event--Event and EventScheduler
MySQL Event
创建EVENT语法:
CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'comment'] DO event_body; schedule: AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] [ENDS timestamp [+ INTERVAL interval] ...] interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} ALTER [DEFINER = { user | CURRENT_USER }] EVENT event_name [ON SCHEDULE schedule] [ON COMPLETION [NOT] PRESERVE] [RENAME TO new_event_name] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'comment'] [DO event_body] DROP EVENT [IF EXISTS] event_name
DEFINER:指定事件执行时使用的用户账号,当事件执行时,会根据该指定账号的权限来检查事件定于的语句是否有权限执行。如果创建Event时未指定DEFINER,则默认使用创建事件的用户,与显示指定DEFINER=CURRENT_USER相同;
[ON COMPLETION [NOT] PRESERVE]: 默认Event为一次执行,执行完成后即删除,即NOT PERSERVE;如果希望Event在执行完成后也不删除,那么需指定ON COMPLETION PRESERVE选项。
[ENABLE | DISABLE | DISABLE ON SLAVE]: 在MYSQL中,Event和表一样归属于某个schema,如果该schema处于主从复制中,那么在主库创建Event后会同步到从库中,但会默认将从库中Event的状态修改为SLAVESIDE_DISABLED,即在从库上不执行。如果在主库上创建Event时指定DISABLE或DISABLE ON SLAVE,那么主库上的Event不会启用。
MySQL EventScheduler
使用EventScheduler可以实现类似SQL SERVER中Job相同的功能,定期执行特定脚本。
在复制中,可以使用SHOW SLAVE STATUS中的Seconds_Behind_Master来判断当前主库到从库的延迟,但如果主库长时间未更新,则会导致Seconds_Behind_Master的值不准确,因此我们可以使用event_scheduler来定期更新主库中的特定表的数据,以保证主库有定期更新。
操作方法:
-- 首先判断EventScheduler功能是否开启 SHOW VARIABLES LIKE 'event_scheduler'; -- 开启EventScheduler功能 SET GLOBAL event_scheduler=ON; -- 在主库上创建用于监控的表并插入数据: CREATE TABLE TB_RepMonitor ( ID INT PRIMARY KEY, DT DATETIME ); INSERT INTO TB_RepMonitor VALUES(1,NOW()); -- 然后创建event_scheduler来定期更新 DROP EVENT IF EXISTS Event_TB_RepMonitor_Update; DELIMITER $$; CREATE DEFINER='root'@'localhost' EVENT Event_TB_RepMonitor_Update ON SCHEDULE EVERY 1 SECOND ENABLE DO BEGIN UPDATE testdb1.TB_RepMonitor SET DT=NOW(); END $$; DELIMITER ; -- 查看EVENT的状态 SHOW EVENTS LIKE 'Event_TB_RepMonitor_Update' \G -- 当主库上创建EVENT后,会同步到从库上,并默认将状态修改为SLAVESIDE_DISABLED; SHOW EVENTS LIKE 'Event_TB_RepMonitor_Update' \G -- 在主库上查看testdb1.TB_RepMonitor表数据' -- 这样就可以放心使用SHOW SLAVE STATUS中的Seconds_Behind_Master的值了 SELECT *,NOW() FROM testdb1.TB_RepMonitor;
相关操作命令:
##==================================## ##查看数据库中创建的所有作业## select * from information_schema.events \G; ##==================================## ##启用作业## ALTER EVENT schema.event_name ENABLE ##==================================## ##禁用作业## ALTER EVENT schema.event_name DISABLE ##==================================## ##删除作业## drop event schema.eventname