dbForge Studio for MySQL入門教程:終止與MySQL數(shù)據(jù)庫的某些連接
數(shù)據(jù)庫或服務(wù)器的維護通常在晚上由數(shù)據(jù)庫管理員執(zhí)行。但是,這些例程有時會被長時間運行的查詢或掛起鎖的應(yīng)用程序阻塞,掛起鎖的時間比預(yù)期更長。
通常,應(yīng)優(yōu)先考慮應(yīng)用程序,并且通常會取消維護例程,以免干擾應(yīng)用程序。但是有時候,您的例程仍然被阻塞,或者由于某種原因在某個時間之前尚未完成,在這種情況下,您需要一種快速的方法來終止所涉及的連接。
在本文中,我們旨在考慮兩種解決上述問題的方法。為此,我們將使用dbForge Studio for MySQL。
方法一:根據(jù)用戶登錄生成一個事件,該事件將終止所有連接
第一種方法包括創(chuàng)建一個特殊的MySQL事件。創(chuàng)建事件時,將創(chuàng)建一個包含一個或多個SQL語句的命名數(shù)據(jù)庫對象,該SQL語句將在一個特定的日期和時間開始和結(jié)束,并以一個或多個規(guī)則的時間間隔執(zhí)行。
使用以下腳本在數(shù)據(jù)庫上創(chuàng)建事件:
DELIMITER $$ CREATE EVENT kill_process_event ON SCHEDULE EVERY '1' DAY STARTS '2019-03-20 08:45:30' DO BEGIN DECLARE kill_done int; DECLARE EXIT HANDLER FOR NOT FOUND SET kill_done = 1; BEGIN DECLARE cursor_ID int; DECLARE cursor_i CURSOR FOR SELECT id FROM information_schema.PROCESSLIST WHERE USER LIKE 'test%' AND ID != CONNECTION_ID(); OPEN cursor_i; read_loop: LOOP FETCH cursor_i INTO cursor_ID; KILL CONNECTION cursor_ID; IF kill_done THEN LEAVE read_loop; END IF; END LOOP; CLOSE cursor_i; END; END $$ ALTER EVENT kill_process_event_ev ENABLE $$ DELIMITER ;
下一步
-
將您自己的值分配給所需的參數(shù)。即日程、時間和用戶登錄。
-
安排事件
-
設(shè)置服務(wù)器變量event_scheduler = ON
如何安排事件
要安排事件,請在對象資源管理器中右鍵單擊它,然后從彈出窗口中選擇“編輯事件”。在打開的向?qū)е校梢詾槭录渲瞄_始和結(jié)束日期、重復(fù)發(fā)生以及其他相關(guān)選項。
在我們的示例中,我們想終止sakila數(shù)據(jù)庫上test%用戶的連接。
執(zhí)行上述腳本后,所有具有用戶登錄名('test%')的連接都將被終止。
該方法的缺點在于,當改變用于選擇會話ID的條件時,必須改變對象(事件)。
或者,您可以創(chuàng)建一個存儲過程和一個事件來調(diào)用此過程。
創(chuàng)建一個調(diào)用存儲過程的事件,該事件將根據(jù)用戶登錄終止連接
基本上,此方法是前一種方法的擴展。它涉及創(chuàng)建MySQL過程,然后安排事件以調(diào)用此過程。
首先,您需要在數(shù)據(jù)庫上創(chuàng)建一個存儲過程:
DELIMITER $$ CREATE PROCEDURE kill_process_proc() BEGIN DECLARE kill_done int; DECLARE EXIT HANDLER FOR NOT FOUND SET kill_done = 1; BEGIN DECLARE cursor_ID int; DECLARE cursor_i CURSOR FOR SELECT id FROM information_schema.PROCESSLIST WHERE USER LIKE 'test%' AND ID != CONNECTION_ID(); OPEN cursor_i; read_loop: LOOP FETCH cursor_i INTO cursor_ID; KILL CONNECTION cursor_ID; IF kill_done THEN LEAVE read_loop; END IF; END LOOP; CLOSE cursor_i; END; END$$ DELIMITER ;
您需要將所需的值分配給USER參數(shù)。在我們的示例中,它是“test%”。
接下來,準備好過程,您可以創(chuàng)建一個事件來調(diào)用它并按計劃執(zhí)行它。請考慮以下腳本:
CREATE DEFINER = 'root'@'localhost' EVENT a_kor.kill_process_event ON SCHEDULE EVERY '1' DAY STARTS '2019-03-19 14:53:00' DO BEGIN CALL kill_process_proc(); END; ALTER EVENT a_kor.kill_process_event ENABLE;
下一步
-
將您自己的值分配給所需的參數(shù)。即日程、時間和用戶登錄。
-
安排事件
-
設(shè)置服務(wù)器變量event_scheduler = ON
執(zhí)行上述步驟后,所有具有用戶登錄名('test%')的連接都將被終止。
方法二:創(chuàng)建一個bat文件以啟動MySQL客戶端和一個帶有參數(shù)的過程
您還可以通過命令行界面創(chuàng)建可執(zhí)行的BAT文件來啟動MySQL客戶端和帶有參數(shù)的過程。
首先,您需要創(chuàng)建一個帶有參數(shù)的過程。為此,請使用以下腳本:
DELIMITER $$ CREATE PROCEDURE kill_process_proc() BEGIN DECLARE kill_done int; DECLARE EXIT HANDLER FOR NOT FOUND SET kill_done = 1; BEGIN DECLARE cursor_ID int; DECLARE cursor_i CURSOR FOR SELECT id FROM information_schema.PROCESSLIST WHERE USER LIKE 'test%' AND ID != CONNECTION_ID(); OPEN cursor_i; read_loop: LOOP FETCH cursor_i INTO cursor_ID; KILL CONNECTION cursor_ID; IF kill_done THEN LEAVE read_loop; END IF; END LOOP; CLOSE cursor_i; END; END$$ DELIMITER ;
相應(yīng)的過程將出現(xiàn)在數(shù)據(jù)庫中。讓我們借助dbForge Studio for MySQL對其進行研究。
接下來,您需要創(chuàng)建一個BAT文件。
要創(chuàng)建BAT文件,請執(zhí)行以下操作:
1、打開純文本編輯器,例如記事本。
2、輸入以下代碼:
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" --user=--password=--host=--port=--database=--execute="CALL kill_process_param('%1')"
3、為用戶、密碼、主機、端口和數(shù)據(jù)庫名稱參數(shù)分配自己的值。
4、保存擴展名為.bat的文件。
現(xiàn)在,您需要在Windows任務(wù)調(diào)度程序的幫助下安排bat文件的執(zhí)行。
結(jié)果,所有具有用戶登錄名('test%')的連接都將被終止。
結(jié)論
知道如何在MySQL Server中終止進程可能是工具箱中的便捷工具。但是,我們建議您謹慎使用給定的方法。您可以下載dbForge Studio for MySQL試用版體驗一下~
想要購買該產(chǎn)品請點擊“在線訂購”,想要了解更多產(chǎn)品信息請點擊