一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Mysql - MySQL 使用事件(Events)完成計劃任務(wù)

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

2021-07-20 18:16島上碼農(nóng) Mysql

事件(Events) 是在 MySQL 5.1后引入的,有點類似操作系統(tǒng)的計劃任務(wù)(cron),但是周期性任務(wù)是內(nèi)置在 MySQL 服務(wù)端執(zhí)行的。本文講述MySQL如何用事件完成計劃任務(wù)

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

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

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

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

?
1
2
3
create event optimize_somedb on schedule every 1 week
do
call optimize_tables('somedb');

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

?
1
2
3
4
5
6
7
8
9
10
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

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

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

?
1
set global event_handler := 1;

一旦啟用,這個線程會執(zhí)行指定調(diào)度的事件。可以通過查看服務(wù)端的錯誤日志來了解事件執(zhí)行的信息。

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

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

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

以上就是mysql 使用事件(events)完成計劃任務(wù)的詳細內(nèi)容,更多關(guān)于mysql 用事件完成計劃任務(wù)的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://juejin.cn/post/6964969494766682143

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 草莓在线 | 日本大乳护士的引诱图片 | 无码天堂亚洲国产AV久久 | 亚洲欧美久久婷婷爱综合一区天堂 | 欧美a级v片不卡在线观看 | 三级无删减高清在线影院 | 91视频破解 | 无码人妻精品一区二区蜜桃在线看 | 欧美国产日韩在线播放 | 国产精品主播在线 | 99视频在线看 | 动漫美女被吸乳 | 日韩欧美一区二区三区免费观看 | 女同志freelesvoices| 男人含玉势出嫁束器 | 狠狠色狠狠色综合婷婷tag | 日本高清免费看 | 婷婷麻豆 | 特黄特级高清免费视频毛片 | 国产成人亚洲综合a∨婷婷 国产成人亚洲精品乱码在线观看 | 男女做污事 | 国产一级在线免费观看 | 国产成人久久精品一区二区三区 | 99在线资源 | 国内免费高清视频在线观看 | 91porny丨首页 | 无人区在线观看免费完整版免费 | 四虎国产欧美成人影院 | 973影院 | 国内精品视频九九九九 | 桃色导航 | 538亚洲欧美国产日韩在线精品 | 98成人| 99资源在线观看 | 国产短视频精品一区二区三区 | 欧美日韩视频在线第一区二区三区 | 免费福利资源站在线视频 | 精品一区二区三区免费视频 | 插得好爽 | 丝袜美女被艹 | 火影忍者羞羞 |