2012-04-05 24 views
3

我試圖測試wait_timeout似乎被忽略的MySQL設置。MySQL「wait_timeout」沒有被長期質疑?

PHP腳本:

<?php 
function microtime_float() 
{ 
    list($usec, $sec) = explode(" ", microtime()); 
    return ((float)$usec + (float)$sec); 
} 

$sql = mysqli_connect('localhost','root','root','mysql'); 
$query = "SHOW VARIABLES WHERE Variable_name='wait_timeout';"; 
$result = $sql->query($query) or die($query.'<br />'.$sql->error); 
$row = $result->fetch_object(); 
echo "wait_timeout = " . $row->Value . "<br/>\n"; 

$time_start = microtime_float(); 
$query = "SELECT SLEEP(2) FROM mysql.user;"; 
$sql->query($query) or die($query.'<br />'.$sql->error); 
$time_end = microtime_float(); 
$time = $time_end - $time_start; 
echo "Query completed in $time seconds<br/>\n"; 
echo "You got the page"; 

腳本輸出:

wait_timeout = 2 
Query completed in 8.0005459785461 seconds 
You got the page 

我的配置

mariadb-server-5.3.5 
php5.3.6 

爲了強制MySQL在一段時間之後超時查詢,我需要做些什麼?

+0

「wait_timeout」和「interactive_timeout」都是連接斷開之前的非活動時間。所以,連接在被刪除之前必須是空閒的(不運行查詢)。由於您正在運行查詢,MySQL SLEEP()不會計數。您必須手動殺死長時間運行的查詢。你可以編寫腳本。 – 2012-04-05 11:16:37

+0

我想你試圖錯誤地使用wait_timeout。如果我沒有記錯,wait_timeout和interactive_timeout不適用於查詢持續時間。它們適用於非活動連接而不是查詢緩慢或包含查詢的SLEEP,連接仍然正常並且處於活動狀態...... – 2012-04-05 11:17:24

回答

3

wait_timeoutinteractive_timeout都是在連接斷開之前處於非活動狀態的時間。所以,連接在被刪除之前必須是空閒的(不運行查詢)。由於您正在運行查詢,因此MySQL SLEEP()不計數。

你必須手動殺死長時間運行的查詢(沒有設置讓MySQL爲你做)。你可以編寫腳本。使用SHOW PROCESSLIST(或外部工具如Innotop)和KILL

+0

是否有任何設置可以使MySQL在給定的預定義時間量之後停止執行查詢? – Max 2012-04-10 05:40:29

+0

不,沒有提供該功能的設置。正如我在回答中所描述的,您可以使用SHOW PROCESSLIST和KILL來編寫腳本。可能有一些第三方腳本或程序可以執行此操作。 – 2012-04-10 14:46:03

+1

@ user359650,[mk-kill](http://www.maatkit.org/doc/mk-kill.html)是一個命令行工具,您可以指定要殺死哪個進程的標準(例如繁忙時間) 。有關包含mk-kill的完整工具包,請參閱[Percona Toolkit](http://www.percona.com/software/percona-toolkit/)。 – 2012-04-10 14:55:41