欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL 使用事件(Events)完成計(jì)劃任務(wù)

 更新時(shí)間:2021年05月24日 09:55:01   作者:島上碼農(nóng)  
事件(Events) 是在 MySQL 5.1后引入的,有點(diǎn)類似操作系統(tǒng)的計(jì)劃任務(wù)(cron),但是周期性任務(wù)是內(nèi)置在 MySQL 服務(wù)端執(zhí)行的。本文講述MySQL如何用事件完成計(jì)劃任務(wù)

事件可以指定單次或以一定的間隔執(zhí)行 SQL 代碼。通常是將復(fù)雜的 SQL 語(yǔ)句使用存儲(chǔ)過(guò)程封裝好,然后周期性地調(diào)用存儲(chǔ)過(guò)程完成一定的任務(wù)。

事件無(wú)需建立服務(wù)端連接,而是通過(guò)一個(gè)獨(dú)立的事件調(diào)度器線程完成初始化。事件沒(méi)有輸入?yún)?shù)也沒(méi)有返回值,這是因?yàn)闆](méi)有連接也就不存在輸入和輸出了。啟用后,可以通過(guò)服務(wù)端日志查看執(zhí)行的指令,但是很難知道具體來(lái)自哪個(gè)事件。也可以查詢 INFORMATION_SCHEMA.EVENTS 表了解事件的狀態(tài),例如最近一次執(zhí)行的時(shí)間。

與存儲(chǔ)過(guò)程類似,事件也需要考慮類似的問(wèn)題。首先,事件增加了 MySQL 服務(wù)端額外的工作。雖然事件本身的負(fù)荷很小,但是事件調(diào)用的 SQL 語(yǔ)句可能對(duì)性能產(chǎn)生嚴(yán)重的影響。另外,事件也會(huì)有存儲(chǔ)過(guò)程那樣基于語(yǔ)句的復(fù)制帶來(lái)的那一類問(wèn)題。事件比較好的應(yīng)用是做諸如周期性的維護(hù)任務(wù)、重建緩存、數(shù)據(jù)統(tǒng)計(jì)、保存監(jiān)測(cè)和診斷的狀態(tài)值等任務(wù)。

下面的例子創(chuàng)建了一個(gè)事件,調(diào)用存儲(chǔ)過(guò)程每周對(duì)指定的數(shù)據(jù)庫(kù)運(yùn)行數(shù)據(jù)表優(yōu)化:

CREATE EVENT optimize_somedb ON SCHEDULE EVERY 1 WEEK
DO 
CALL optimize_tables('somedb');

可以指定事件是否需要重復(fù)執(zhí)行。在某些情況下是沒(méi)問(wèn)題的,但是有些情況則不行。以上面的例子為例,你也許是想在所有的副本上運(yùn)行 OPTIMIZE TABLE 指令。但是,需要知道的是如果是全部副本都同時(shí)執(zhí)行這個(gè)操作的話,這會(huì)影響整個(gè)服務(wù)端性能(例如鎖表)。 而且,周期性事件可能會(huì)花很長(zhǎng)事件才能完成,甚至有可能下一個(gè)事件還沒(méi)結(jié)束新的事件就又開(kāi)始執(zhí)行了。MySQL 不會(huì)阻止這樣的情況,因此需要自己寫代碼實(shí)現(xiàn)相同任務(wù)的互斥。可以使用加鎖的方式達(dá)到這一目的:

CREATE EVENT optimize_somedb ON SCHEDULE EVERY 1 WEEK
DO 
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  	BEGIN END;
  IF GET_LOCK('somedb', 0) THEN
  	DO CALL optimize_tables('some_db');
  END IF;
  DO RELEASE_LOCK('somedb');
END

看起來(lái)“多余”的 continue handler 可以保證即便是發(fā)生了異常也會(huì)釋放鎖。

雖然事件與連接無(wú)關(guān),但是卻是與線程有關(guān)的。MySQL 服務(wù)端有一個(gè)主事件調(diào)度線程,可以通過(guò)在服務(wù)端配置中開(kāi)啟:

SET GLOBAL event_handler := 1;

一旦啟用,這個(gè)線程會(huì)執(zhí)行指定調(diào)度的事件??梢酝ㄟ^(guò)查看服務(wù)端的錯(cuò)誤日志來(lái)了解事件執(zhí)行的信息。

雖然事件調(diào)度器是單線程的,但是事件本身是可以并發(fā)執(zhí)行的。每次事件執(zhí)行的時(shí)候服務(wù)端會(huì)創(chuàng)建新的進(jìn)程。在事件內(nèi)部,可以調(diào)用 CONNECTION_ID()獲取一個(gè)唯一的值(雖然實(shí)際沒(méi)有連接),實(shí)際返回的就是線程 id。進(jìn)程和線程在事件執(zhí)行完后會(huì)銷毀。可以通過(guò) SHOW PROCESSLIST 查看,在 Command 列中會(huì)顯示為 Connect。

雖然,進(jìn)程創(chuàng)建了實(shí)際執(zhí)行事件的線程,但線程在事件完成后會(huì)銷毀,并不會(huì)放入緩存中,因此 Threads_created 這個(gè)狀態(tài)計(jì)數(shù)器并不會(huì)看到增加。

結(jié)語(yǔ):事件與應(yīng)用程序、或操作系統(tǒng)級(jí)的定時(shí)任務(wù)相比,由于沒(méi)有了 SQL 連接建立的過(guò)程,因此效率會(huì)更高,而且開(kāi)銷不大。適用于需要周期性運(yùn)行的 SQL 腳本任務(wù),例如數(shù)據(jù)表優(yōu)化、生成統(tǒng)計(jì)報(bào)表數(shù)據(jù)等等。但是,需要注意,事件本身可能存在并發(fā)問(wèn)題,這個(gè)可以通過(guò)加鎖解決。同時(shí),如果事件需要重復(fù)執(zhí)行,最好是不要執(zhí)行過(guò)于復(fù)雜耗時(shí)的任務(wù)。

以上就是MySQL 使用事件(Events)完成計(jì)劃任務(wù)的詳細(xì)內(nèi)容,更多關(guān)于MySQL 用事件完成計(jì)劃任務(wù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 你知道m(xù)ysql中空值和null值的區(qū)別嗎

    你知道m(xù)ysql中空值和null值的區(qū)別嗎

    這篇文章主要給大家介紹了關(guān)于mysql中空值和null值區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • linux mysql 報(bào)錯(cuò):MYSQL:The server quit without updating PID file

    linux mysql 報(bào)錯(cuò):MYSQL:The server quit&nbs

    mysql 報(bào)錯(cuò):MYSQL:The server quit without updating PID file。以下是可能的原因與解決方法
    2013-02-02
  • InnoDB中不同SQL語(yǔ)句設(shè)置鎖的情況詳解

    InnoDB中不同SQL語(yǔ)句設(shè)置鎖的情況詳解

    這篇文章主要介紹了InnoDB中不同SQL語(yǔ)句設(shè)置鎖的情況詳解,在Mysql中,鎖定讀、更新、刪除操作通常會(huì)對(duì)SQL語(yǔ)句處理過(guò)程中掃描到的每條索引記錄設(shè)置記錄鎖,需要的朋友可以參考下
    2024-01-01
  • MySQL 語(yǔ)句執(zhí)行順序舉例解析

    MySQL 語(yǔ)句執(zhí)行順序舉例解析

    這篇文章主要介紹了MySQL 語(yǔ)句執(zhí)行順序舉例解析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值需要的小伙伴可以參考一下
    2022-06-06
  • MySQL性能參數(shù)詳解之Skip-External-Locking參數(shù)介紹

    MySQL性能參數(shù)詳解之Skip-External-Locking參數(shù)介紹

    MySQL的配置文件my.cnf中默認(rèn)存在一行skip-external-locking的參數(shù),即跳過(guò)外部鎖定。根據(jù)MySQL開(kāi)發(fā)網(wǎng)站的官方解釋,External-locking用于多進(jìn)程條件下為MyISAM數(shù)據(jù)表進(jìn)行鎖定
    2016-05-05
  • 數(shù)據(jù)庫(kù)設(shè)計(jì)工具M(jìn)ySQL?Workbench使用教程(超級(jí)詳細(xì)!)

    數(shù)據(jù)庫(kù)設(shè)計(jì)工具M(jìn)ySQL?Workbench使用教程(超級(jí)詳細(xì)!)

    MySQL?Workbench為數(shù)據(jù)庫(kù)管理員、程序開(kāi)發(fā)者和系統(tǒng)規(guī)劃師提供可視化的Sql開(kāi)發(fā)、數(shù)據(jù)庫(kù)建模、以及數(shù)據(jù)庫(kù)管理功能,下面這篇文章主要給大家介紹了關(guān)于MySQL設(shè)計(jì)工具Workbench使用的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • mysql5.6 解析JSON字符串方式(支持復(fù)雜的嵌套格式)

    mysql5.6 解析JSON字符串方式(支持復(fù)雜的嵌套格式)

    這篇文章主要介紹了mysql5.6 解析JSON字符串方式(支持復(fù)雜的嵌套格式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報(bào)錯(cuò)的解決方法

    Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報(bào)錯(cuò)的解決方法

    這篇文章主要介紹了Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報(bào)錯(cuò)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • MySQL慢查詢之開(kāi)啟慢查詢

    MySQL慢查詢之開(kāi)啟慢查詢

    開(kāi)啟慢查詢?nèi)罩?,可以讓MySQL記錄下查詢超過(guò)指定時(shí)間的語(yǔ)句,通過(guò)定位分析性能的瓶頸,才能更好的優(yōu)化數(shù)據(jù)庫(kù)系統(tǒng)的性能。下面這篇文章主要介紹了關(guān)于MySQL開(kāi)啟慢查詢的相關(guān)資料,需要的朋友可以參考下。
    2017-03-03
  • Mysql數(shù)據(jù)庫(kù)之主從分離實(shí)例代碼

    Mysql數(shù)據(jù)庫(kù)之主從分離實(shí)例代碼

    本篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)之主從分離實(shí)例代碼,MySQL數(shù)據(jù)庫(kù)設(shè)置讀寫分離,可以使對(duì)數(shù)據(jù)庫(kù)的寫操作和讀操作在不同服務(wù)器上執(zhí)行,提高并發(fā)量和相應(yīng)速度。
    2017-03-03

最新評(píng)論