mysql事件多用于周期性地执行一些语句,例如每天.....,是一种很方便的机制,但是最近工作中发现linux环境下,改了系统时间后有些事件便不再执行了。后经过在ubuntu16.04+mysql5.7.29环境下多次复现得到如下结论:
- 修改系统时间会影响一些事件的执行情况;
- 如果改后的时间被当前系统时间大、晚,则事件调度不受影响;
- 如果改后的时间被当前系统时间小、早,则事件不再调度,此时应关闭/打开事件调度器解决,具体如下:
set global event_scheduler = 0;
set global event_scheduler = 1;
实验步骤如下:
1. 创建表
mysql> show create table second_tb;
+-----------+--------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+--------------------------------------------------------------------------------------------------------------------------------+
| second_tb | CREATE TABLE `second_tb` (
`t` datetime DEFAULT NULL,
`name` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-----------+--------------------------------------------------------------------------------------------------------------------------------+
2. 创建事件
delimiter //
CREATE EVENT second_tb_event
ON SCHEDULE EVERY 5 second
STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
DO BEGIN
insert into second_tb value (now(),concat('name',DATE_FORMAT(now(),'_%H_%i_%s')));
END //
delimiter ;
然后通过频繁修改系统时间看表中新数据的插入情况便可得出以上结论。