2012-04-05 5 views
3

Ich versuche, die wait_timeout MySQL-Einstellung zu testen, die ignoriert zu werden scheint.MySQL "wait_timeout" wird für lange Abfrage nicht berücksichtigt?

PHP-Skript:

<?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"; 

Script Ausgabe:

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

Meine Konfiguration

mariadb-server-5.3.5 
php5.3.6 

Was muss ich tun, um MySQL dazu zu zwingen, nach einer gewissen Zeit Abfragen abzubrechen?

+0

Sowohl "wait_timeout" als auch "interactive_timeout" ist die Zeit der Inaktivität, bevor die Verbindung unterbrochen wird. Daher muss die Verbindung inaktiv sein (keine Abfrage ausführen), bevor sie gelöscht wird. MySQL SLEEP() zählt nicht, da Sie eine Abfrage ausführen. Sie müssen lange laufende Abfragen manuell beenden. Sie können dies skripten. –

+0

Ich denke, Sie versuchen, wait_timeout falsch zu verwenden. wait_timeout und interactive_timeout sind nicht für die Abfragedauer, wenn ich mich richtig erinnere. Sie sind für inaktive Verbindungen, nicht für langsame Abfragen oder die SLEEP-Abfrage, die Verbindung ist immer noch in Ordnung und aktiv ... –

Antwort

3

Sowohl wait_timeout als auch interactive_timeout ist die Zeit der Inaktivität, bevor die Verbindung unterbrochen wird. Daher muss die Verbindung inaktiv sein (keine Abfrage ausführen), bevor sie gelöscht wird. MySQL SLEEP() zählt nicht, da Sie eine Abfrage ausführen.

Sie müssen lange laufende Abfragen manuell beenden (es gibt keine Einstellung, damit MySQL dies für Sie erledigt). Sie können dies skripten. Verwenden Sie SHOW PROCESSLIST (oder externe Tools wie Innotop) und KILL.

+0

Gibt es irgendeine Einstellung, die es MySQL ermöglichen würde, die Ausführung von Abfragen nach einer vorgegebenen Zeit zu stoppen? – Max

+0

Nein, es gibt keine Einstellung, die diese Funktionalität bietet. Wie ich in meiner Antwort beschrieben habe, können Sie es mit 'SHOW PROCESSLIST' und' KILL' skripten. Es kann einige Drittanbieter-Skripte oder Programme geben, die dies tun können. –

+1

@ user359650, [mk-kill] (http://www.maatkit.org/doc/mk-kill.html) ist ein Befehlszeilentool, mit dem Sie Kriterien für den zu löschenden Prozess angeben können (z. B. Busy-Zeit). . Ein vollständiges Toolkit mit mk-kill finden Sie im [Percona Toolkit] (http://www.percona.com/software/percona-toolkit/). –