成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL 存儲過程中的只讀語句超時怎么辦?

數據庫 MySQL
MySQL 有一個參數叫 max_execution_time ,用來設置只讀語句執行的超時時間,但是僅對單獨執行的 select 語句有效;對于非單獨執行的 select 語句,比如包含在存儲過程、觸發器等內置事務塊里則不生效。

?MySQL 有一個參數叫 max_execution_time ,用來設置只讀語句執行的超時時間,但是僅對單獨執行的 select 語句有效;對于非單獨執行的 select 語句,比如包含在存儲過程、觸發器等內置事務塊里則不生效。官方手冊上對這個參數解釋如下:

max_execution_time applies as follows:

The global max_execution_time value provides the default for the session value for new connections. The session value applies to SELECT executions executed within the session that include no MAX_EXECUTION_TIME(*N*) optimizer hint or for which N is 0.

max_execution_time applies to read-only SELECT statements. Statements that are not read only are those that invoke a stored function that modifies data as a side effect.

max_execution_time is ignored for SELECT statements in stored programs.

那對這種非單獨出現的 select 語句,該如何控制超時時間呢?

先來看下參數 max_execution_time 設置后的效果。此參數設置后,select 語句如果執行時間過長,會直接被 cancel 掉,并且報錯,如下所示:

mysql> set @@max_execution_time=1000;
Query OK, 0 rows affected (0.00 sec)

mysql> select sleep(2) from t1 limit 1;
ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded

或者是采用直接加 Hint 的方式,也能限制 select 語句的執行時間: 下面兩種方式都能起到限制 select 語句執行時間的作用。

mysql> select /*+ max_execution_time(1000) */ sleep(2) from t1 limit 2;
ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded

mysql> select /*+ set_var(max_execution_time=1000) */ sleep(2) from t1 limit 2;
ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded

那如果把這條 select 語句封裝在存儲過程內部,按照手冊上對參數 max_execution_time 的解釋,則不生效。比如新建一個存儲過程 sp_test :

DELIMITER $$

USE `ytt`$$

DROP PROCEDURE IF EXISTS `sp_test`$$

CREATE DEFINER=`admin`@`%` PROCEDURE `sp_test`()
BEGIN
select sleep(2) from t1 limit 1;
END$$

DELIMITER ;

重新設置 max_execution_time 值為1秒:調用存儲過程 sp_test , 可以正常執行,select 語句并沒有被 cancel 掉!

mysql> call sp_test;
+----------+
| sleep(2) |
+----------+
| 0 |
+----------+
1 rows in set (2.01 sec)

Query OK, 0 rows affected (2.01 sec)

那如何解決這個問題呢?

為了更方便大家測試,把語句 select sleep(2) from t1 limit 1 改為 select sleep(2000) from t1 limit 1 。既然 MySQL 層面有這樣的限制,那只能從非 MySQL 層面來想辦法。最直接有效的就是寫個腳本來主動 cancel 掉 select 語句。腳本如下:

root@ytt-normal:/home/ytt/script# cat kill_query 
#!/bin/sh
QUERY_ID=`mysql -ss -e "select id from information_schema.processlist where user='admin' and db='ytt' and time>10 and regexp_like(info,'^select','i')"`
if [ $QUERY_ID ];then
echo "kill query $QUERY_ID"
mysql -e "kill query $QUERY_ID"
fi

完后把腳本放到 crontab 或者 MySQL 自己的 event 里來定時執行即可。單獨執行腳本效果如下:

root@ytt-normal:/home/ytt/script# ./kill_query 
kill query 50

除了自己編寫腳本,還有一個工具可以實現類似的效果,它包含在我們熟知的 Percona-toolkit 工具箱里,叫 pt-kill 。

pt-kill 工具可以根據各種觸發條件來執行指定動作:比如 cancel 掉指定 SQL 語句、kill 掉指定 session 等。所以完全可以使用 pt-kill 工具來實現 select 語句超時被自動 cancel 掉。如下所示:pt-kill 工具會在后臺一直運行,監聽 MySQL 進程,一旦觸發條件被激活,即可執行相應動作。

root@ytt-normal:/home/ytt/script# pt-kill --match-db=ytt --match-user=admin --match-host=%  \--match-info='^select' --victims=all --busy-time='10s' --print --kill-query

# 2022-08-15T17:29:03 KILL QUERY 50 (Query 11 sec) select sleep(2000) from t1 limit 1

有一點需要注意:select 語句超時自動 cancel 掉這樣的功能不適宜用在生產環境!因為你無法預知其執行結果的時效性、上下文是否相關等特點。?

責任編輯:華軒 來源: 今日頭條
相關推薦

2011-04-11 17:28:50

oracle存儲select語句

2012-12-26 09:55:09

Windows 8

2009-07-23 14:10:38

Hibernate J

2022-09-07 09:00:00

計算數據庫

2010-05-31 16:57:09

2010-05-27 17:45:13

MySQL存儲過程

2016-09-07 20:28:17

MySQL存儲數據庫

2022-10-14 08:18:07

Guavaweb應用

2010-05-27 17:56:39

MySQL存儲過程

2010-11-26 16:18:13

MySQL變量定義

2017-08-30 17:21:05

LinuxShell超時現象

2010-04-15 16:54:31

Oracle存儲過程

2010-11-12 09:18:13

SQL Server存

2024-04-22 08:17:23

MySQL誤刪數據

2022-07-05 11:48:47

MySQL死鎖表鎖

2010-04-16 09:03:28

Oracle 存儲過程

2011-08-15 15:56:31

SQL Server

2017-12-04 08:37:31

存儲空間NAS

2010-10-09 16:41:54

MYSQL存儲過程

2010-05-07 18:44:28

Oracle存儲過程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 风间由美一区二区三区在线观看 | 狠狠久久久 | 天天操操操操操 | 久久久久久久综合色一本 | 亚洲精品第一国产综合野 | 欧美在线视频一区二区 | 成人av资源在线 | 中国美女av | 久久成人一区 | 精品一区二区在线观看 | 欧美一区二区免费 | www.天天操 | 国产一区 在线视频 | 免费a级毛片在线播放 | 草草草久久久 | 久久久亚洲一区 | 午夜精品久久久久久久久久久久 | 久久久美女 | 亚洲性视频 | 午夜精品 | 欧美亚洲国产日韩 | 亚洲a在线观看 | 国产精品永久免费视频 | 久久久.com | 99久久婷婷国产综合精品首页 | 久久中文字幕电影 | 夜夜草视频 | 一区二区免费 | 一区二区三区四区视频 | 亚洲日本欧美 | 国产成人艳妇aa视频在线 | 亚洲精品久久久久中文字幕欢迎你 | 亚洲性视频 | 羞羞涩涩在线观看 | 日韩在线播放第一页 | www四虎com| 欧美精品久久 | 亚洲成人一级 | 久久亚洲欧美日韩精品专区 | aacc678成免费人电影网站 | 久久久久久久久久久久久久av |