2012-04-05 20 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()は、クエリを実行しているのでカウントしません。あなたは長時間実行しているクエリを手動で削除する必要があります。これをスクリプト化することができます。 –

+0

私はあなたが間違ってwait_timeoutを使用しようとしていると思います。私が正しく覚えていれば、wait_timeoutとinteractive_timeoutはクエリの持続時間ではありません。それらは、低速なクエリやSLEEPクエリを含む非アクティブな接続のためのものです。接続はまだ有効であり、アクティブです... –

答えて

3

wait_timeoutinteractive_timeoutは、接続を切断するまでの非アクティブ時間です。したがって、接続がアイドル(クエリ実行中でない)になってからドロップされます。クエリを実行しているので、MySQL SLEEP()はカウントされません。

長時間実行しているクエリを手動で削除する必要があります(MySQLで実行する設定はありません)。これをスクリプト化することができます。 SHOW PROCESSLIST(またはInnotopのような外部ツール)とKILLを使用してください。

+0

定義済みの一定時間後にMySQLがクエリの実行を停止できるようにする設定はありますか? – Max

+0

いいえ、その機能を提供する設定はありません。私の答えで説明したように、 'SHOW PROCESSLIST'と' KILL'を使ってスクリプトを書くことができます。これを行うことができるサードパーティのスクリプトやプログラムがあります。 –

+1

@ user359650、[mk-kill](http://www.maatkit.org/doc/mk-kill.html)は、プロセスを強制終了する基準(たとえばビジータイム)を指定できるコマンドラインツールです。 。 mk-killを含む完全なツールキットについては、[Percona Toolkit](http://www.percona.com/software/percona-toolkit/)を参照してください。 –

関連する問題