簡介
事件(event)
是MySQL在相應(yīng)的時刻調(diào)用的過程式數(shù)據(jù)庫對象隐绵,它由一個特定的線程來管理的缠局,也就是所謂的 事件調(diào)度器
。
有兩種調(diào)度方式妈拌。
- 一次性的調(diào)用拥坛。
- 周期性的調(diào)用。
事件和觸發(fā)器類似尘分,都是在某些事情發(fā)生的時候啟動猜惋。當(dāng)數(shù)據(jù)庫上啟動一條語句的時候,觸發(fā)器就啟動了音诫,而事件是根據(jù) 調(diào)度事件
來啟動的惨奕。由于他們彼此相似,所以事件也稱為臨時性觸發(fā)器
竭钝。
MySQL事件跟Windows
和 Linux(crontab)
系統(tǒng)中的定時任務(wù)很像梨撞,在特定的時間內(nèi)執(zhí)行任務(wù)。但是它們只能精確到分鐘香罐,而MySQL event
事件可以實現(xiàn)每秒都去執(zhí)行任務(wù)卧波。
優(yōu)缺點
- 優(yōu)點
- 一些對數(shù)據(jù)定時性操作不再依賴外部程序,而直接使用數(shù)據(jù)庫本身提供的功能庇茫。
- 可以實現(xiàn)每秒鐘執(zhí)行一個任務(wù)港粱,這在一些對實時性要求較高的環(huán)境下就非常實用了。
- 缺點
- 定時觸發(fā)旦签,不可以調(diào)用查坪。
問題
MySQL 的定時觸發(fā)的event
建好后沒有發(fā)生預(yù)定的事件,歸納起來有以下幾種:
- 全局的
event
是關(guān)閉的; - 用戶權(quán)限的修改導(dǎo)致
event
失效(這種情況很少發(fā)生); -
event
設(shè)成了DISABLE
;
解決方案
下面來演示如何解決上面出現(xiàn)所出現(xiàn)的問題
問題1 解決方案:
- 臨時修改
(不推薦)
實際上MySQL的
event
默認(rèn)值是off
進入MySQL命令行模式
- 查看
event
是否開啟:show variables like 'event_scheduler';
這時你會發(fā)現(xiàn)event_scheduler
的值是OFF
mysql> show variables like 'event_scheduler'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | event_scheduler | OFF | +-----------------+-------+
- 臨時開啟
event
事件:set global event_scheduler=1;
輸入完上面的命令后在執(zhí)行查看命令會發(fā)現(xiàn) event_scheduler
的值變成了 ON
了宁炫。
但是針對上面的操作方案個人是不推薦的偿曙。因為這只是臨時的,當(dāng)數(shù)據(jù)庫重新啟動的時候羔巢,以上方法就會失效望忆,event_scheduler
的值會還原成默認(rèn)值 OFF
罩阵。
- 通過修改配置文件的方式
(推薦)
windows
系統(tǒng)的 MySQL的配置文件名是my.ini
;Linux
系統(tǒng)的 MySQL 的配置文件名是my.cnf
启摄;
- 打開配置文件在
[mysqld]
模塊下添加event_scheduler=on
或event_scheduler=1
稿壁;- 重新啟動MySQL。
問題 2 解決方案(暫未遇到過):
這種情況很少發(fā)生歉备,但發(fā)生后又找不到問題傅是,那就看看你建的event
所屬者有沒有這個執(zhí)行權(quán)限吧。
執(zhí)行下面的SQL語句:
-- 查看用戶權(quán)限
show grants for 'root'@'localhost';
-- 會得到下面的結(jié)果威创, ALL 或者 ALL PRIVILEGES 代表全部的權(quán)限
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
修改 localhost
權(quán)限就可以了落午。
問題 3 解決方案:
event
設(shè)成了DISABLE
這種情況。
-- 這里以test_event為例:
-- 關(guān)閉事件任務(wù):
alter event test_event ON COMPLETION PRESERVE DISABLE;
--開戶事件任務(wù):
alter event test_event ON COMPLETION PRESERVE ENABLE;
-- 獲取當(dāng)前數(shù)據(jù)庫的event:
show events;
-- 獲取全部的event:
select * from information_schema.events;
-- 下面通過 show events; 命令的出來的結(jié)果肚豺,event 事件的狀態(tài)為 ENABLED
+-----+----------+----------------+-----------+-----------+---------------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| Db | Name | Definer | Time zone | Type | Execute at | Interval value | Interval field | Starts | Ends | Status | Originator | character_set_client | collation_connection | Database Collation |
+-----+----------+----------------+-----------+-----------+---------------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| api | test | root@localhost | SYSTEM | RECURRING | NULL | 1 | DAY | 2019-07-01 00:00:00 | NULL | ENABLED | 1 | utf8mb4 | utf8mb4_general_ci | utf8_general_ci |
| api | test_one | root@localhost | SYSTEM | ONE TIME | 2019-07-01 00:00:00 | NULL | NULL | NULL | NULL | ENABLED | 1 | utf8mb4 | utf8mb4_general_ci | utf8_general_ci |
+-----+----------+----------------+-----------+-----------+---------------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+