mysql, laufzeit beschränkung

Alain Aubert

Legendäres Mitglied
Irgendwie steh ich auf dem Schlauch:

Ich möchte gerne einstellen, dass jeder Prozess der länger als x Sekunden läuft (egal was er macht) gekillt wird.
Ich möchte nicht die slowqueries loggen, ich möchte beschränken.

... danke
 
Details zu mySql kenne ich nicht. Aber ich vermute, daß das ähnlich komplex ist wie bei MS-Sqlserver:

1. Verbindungsparameter Connection Timeout: Legt fest, wie lange der Client wartet, bis der Db-Server auf einen Verbindungsversuch antworten muß.

2. Verbindungsparameter Command Timeout: Legt den Gesamtzeitbedarf für die Befehlsfolge fest, die der Client akzeptiert. Danach bricht er ab.

3. Set Lock_Timeout 5000: Legt fest, wie lange der MS-SqlServer auf das Aufheben einer einzelnen Sperre wartet. Bei mehreren Anweisungen in einem Block kann dieser Wert (5 Sekunden) natürlich pro Anweisung auftreten.

Sprich: Es geht nicht direkt innerhalb des Db-Servers, sondern entweder vom Client (der sich dann verschämt zurückzieht
rolleyes.gif
) oder innerhalb einer Anweisung, die nur begrenzt Geduld hat. Ist diese Anweisung die einzigste derzeit ausgeführte, dann hat sie freie Fahrt, es gibt keine Blockaden - gibt es 1000 andere parallele Zugriffe, dann muß sie warten und bricht womöglich ab.

Kill hilft ja nur, wenn alle paar Sekunden ein Script alle Prozesse auf Laufzeitüberschreitungen überprüft.

Die Verbindungsparameter müßten dagegen in der Clientbibliothek definiert sein, also MyODBC oder ähnliches.
 
Danke für eure Antworten, leider noch nicht gelesen, werde das später noch tun, habe follow Up question:
Hat Mysql logging und recovery wie oracle oä? D.h. wenn 10 procs auf einen lockenden warten und der ganze DBMS abgestellt wird, kann mysql dann wie oracle aus den scheduler die übrigen durchballern wenn ich ihn wieder anstelle oder verschwinden die im Nirvana?

QUOTE Kill hilft ja nur, wenn alle paar Sekunden ein Script alle Prozesse auf Laufzeitüberschreitungen überprüft.

Ist mir ins Auge gesprungen, steht (leider) nicht zur Debatte.

Komme heute wieder
 
OK, danke für euer Antworten.

Mysql hat interactive_timeout. Nutz mir nichts. wait_timeout nutzt mir auch nichts. Keine TCP Verbindung.
Zugebenermassen war meine letzte grössere mysql manual session Version 3.x
http://dev.mysql.com/doc/refman/5.1/de/ser...-variables.html
Finde nicht wirklich eine Lösung.

Mein Probem ist wenn ich einen grausamen Fehler mache (beispielsweise kann man mal eine Klammer um ein paar ors vergessen). Diese Query lockt mir dann Tabellen und sendet ein paar Tausend Sekunden lang das Kreuprodukt von einer Tabelle mit sich selber...
wink.gif


Weil shared hosting, blockieren die startenden und wartenden mysqls das proc Kontingent. D.h. ich darf dann in der Shell nicht mal mehr dir machen, und fork gibt mri nicht mal mehr n Löffel... D.h. ich kann nicht mir kill arbeiten wenns dumm läuft.

Konkret such ich eine Einstellung die einem Prozess killt, wenn der seit mehr als 100 Sekunden sending data macht.
Aber ich werd wohl mit mehr Disziplin vorlieb nehmen müssen.

command timeout wär nicht schlecht.
 
Funktioniert das den so nicht?

CODE
$result = mysql_query("SHOW FULL PROCESSLIST");
while ($row=mysql_fetch_array($result)) {
$process_id=$row["Id"];
if ($row["Time"] > 200 ) {
$sql="KILL $process_id";
mysql_query($sql);
}
}



gemäss http://dev.mysql.com/doc/refman/5.0/en/kill.html
 
Marc: Das funktioniert schon.

Aber das setzt voraus, daß man - nachdem der kritische Befehl bereits läuft - noch eine neue Verbindung zum Datenbankserver aufmachen kann. Das klappt bei den oben genannten Bedingungen (shared Hosting und - aufgrund der Blockade - eskalierend wartende Anfragen) nicht mehr.

Oder daß man sich davor - präventiv - immer eine zusätzliche interaktive Verbindung aufgemacht hat und die PID des kritischen Prozesses kennt.

Und Command_Timeout nutzt womöglich gar nichts. Denn das ist in der Clientbibliothek implementiert - und ich wüßte nicht auf die Schnelle, ob diese noch ein Kill absetzt. Falls nicht, würde die Abfrage auch weiterlaufen - nur wäre der Client eben nicht mehr blockiert.

Alain: Welchen Client verwendest Du denn? In Konsolen hilft ja manchmal Strg + D, Strg + C oder eine entsprechende Befehlszeilenoption.
 
Jürgen, Danke für Dein wertvolles Feedack.

PHP. Die Interactive Flag nutzt mir eben nichts.

QUOTE Und Command_Timeout nutzt womöglich gar nichts. Denn das ist in der Clientbibliothek implementiert - und ich wüßte nicht auf die Schnelle, ob diese noch ein Kill absetzt.

Genau das war meine Frage. Und ich hab nach meiner Recherche schliessen müssen, dass ich a) mal wieder das Manual knuspern sollte und b) die von mir gewünschte Funktion so einfach nicht funktioniert.

Wenns wirklich ganz dumm läuft krieg ich in der Konsole des Servers nur noch "bash: fork: Resource temporarily unavailable" Krieg also nicht mal mehr n Löffel...
Das führt zur nächsten Frage, wie konfigurier ich Linux, dass ich immer noch einen prorisierter abforken darf. Dass muss doch gehen, die Frage für mich ist ob es mit dem gleichen User (linux user) machbar ist.

 
QUOTE (jAuer @ Mi 11.07.2007, 08:30)Und Command_Timeout nutzt womöglich gar nichts. Denn das ist in der Clientbibliothek implementiert - und ich wüßte nicht auf die Schnelle, ob diese noch ein Kill absetzt. Falls nicht, würde die Abfrage auch weiterlaufen - nur wäre der Client eben nicht mehr blockiert.

So, jetzt hat mich das doch mal interessiert. Und siehe da, auf dem MS-SqlServer klappt das.

Script in der Datei kill-me.sql


QUOTE Select @@Spid
go

WaitFor Delay '00:00:50'
go


Ergebnis vom Aufruf:


QUOTE C:\sd\temp>sqlcmd -S .\SQL2005 -E -i kill-me.sql -t 5

------
64

(1 Zeilen betroffen)
Das Timeout ist abgelaufen.


-i: Eingabe aus der Datei kill-me.sql lesen
-t 5: Abfragetimeout von 5 Sekunden, also kürzer als die 50 Sekunden, die das Script warten soll.

Ergebnis: Kontrolliert man über eine zweite Verbindung die aktuell laufenden Prozesse, dann ist die SPID, die oben rauskommt, für fünf Sekunden sichtbar und verschwindet dann wieder.

Sprich: Auf dem MS-SqlServer könnte man bsp. ein solches Script mit -t 10 starten, dann wäre spätestens nach zehn Sekunden Schluß.
 
Such mal nach lock_wait_timeout, vielleicht findet sich dort eine entsprechende Option, so auf die schnelle weiß ich sonst keine Lösung.
 
Zurück
Oben