MySQL LockTables Problem

LoneWraith
Posts: 7
Joined: 2009-11-19 16:18

MySQL LockTables Problem

Post by LoneWraith »

Hallo,

ich suche seit länger Zeit nach der Ursache und konnte bis jetzt nicht wirklich antwort finden.
Ich verwende an einer Stelle in meinen Scripten den Befehl "Lock Tables". Normalerweise wird dort nicht so viel Script ausgeführt. Vieleicht höchstens mal 3 sek Scriptdauer im schlimmsten Fall. Danach sollte die Sperre ja wieder aufgehoben werden. Im Script habe ich das "UNLOCK TABLES" auch zu stehen, obwohl ich soweit ich weis das noch nichtmal unbedingt setzen muss, weil die Sperre automatisch aufgehoben wird.
Wie auch immer habe ich gelegentlich den Fall, dass es zu unterschiedlichen Zeiten vorkommt, das diese Sperre nicht aufgehoben wird. Dann passiert es, dass die Seite natürlich "hängt", weil ja kein anderer Prozess mehr auf die Tabellen zugreifen kann. In der Prozessliste in phpmyadmin sieht man, dass meist 1 Thread auf Status "end" steht oder/und 1 Thread steht auf Status "freezing items" oder so ähnlich^^. Der Rest der Thread steht auf "Locked" und es kommen immer mehr dazu (sind schon etwas mehr Besucher auf den Seiten).

Was ich beobachtet habe ist, sobald ich "FLUSH TABLES" ausführe, also während dieses aufstauen der Threads, löst sich der Stau. Wenn ich das richtig gelesen habe, dann leert der Flush-Befehl ja internen Caches von MySQL. Also in diesem Fall wird der Tabellencache geleert und ebenfalls alle Abfrageergebnisse aus dem Abfrage-Cache.
Meine Frage die sich daraus ergibt ist, ob es evtl. eine falsche Cacheeinstellung ist, die dieses Problem verursacht?

Auf dem Server läuft Ubuntu mit Apache2, PHP5.2, MySQL5 und an Hardware ein QuadCore CPU mit 12GB RAM.
Fals noch infos fehlen, bitte bescheid geben.

mfg
Top

LoneWraith
Posts: 7
Joined: 2009-11-19 16:18

Re: MySQL LockTables Problem

Post by LoneWraith »

Danke für die Antwort.
Nun, ich meine gelesen zu haben, dass dieser "Death Lock" nur by InnoDB auftritt. Verwende jedoch die MyISAM DB-Engine. Gibt mitlerweile Momente, an denen die Seite fast 10 Minuten lang hängt...und das wegen MySQL.

Das Problem scheint auch wirklich erst dann aufzutreten, wenn viele Benutzer zeitgleich die Seite aktualisieren und somit MySQL sehr viele LockTables Befehle gleichzeitig bekommt. Leider geht es nicht anders, denn die Datenbank muss aktuell gehalten werden. Allerdings würde es ja reichen, wenn nur "einer" das Script ausführt. :-k
Was wäre, wenn man sich einen Dienst mit PHP schreibt, der über die Konsole läuft und das Script jede Sekunde einmal ausführt? Damit würde man doch verhindern, dass mehrere LockTables Befehle zeitgleich an MySQL geschickt werden und es würde nicht mehr zu diesem Stau kommen. Also stellt sich die Frage, ob man die Ausführung des Scripts verbessert (kürzere Laufzeit u. weniger Aufruf) oder ganz auf LockTables verzichten sollte?

mfg
Top

LoneWraith
Posts: 7
Joined: 2009-11-19 16:18

Re: MySQL LockTables Problem

Post by LoneWraith »

Ich habe mitlerweile es so umgebaut, dass ich auf die meisten LockTables verzichten kann. Wie schon geschrieben wurde, würde InnoDB dann wieder andere Probleme mit sich bringen...

Es kommt jetzt nur noch gelegentlich zu kleineren Hängern, die wenigen Sekunden andauern. Ich habe versucht die Ursache dafür zu finden und habe die Suche auf meine Sessiontabelle eingegrenzen können. Sollte es hängen, dann sind wieder mehrere Abfragen in der Prozessliste auf "locked". Dabei handelt es sich in der Regel um reine SELECT-Abfragen auf die Session.

Zur Verwendung der Sessiontabelle:
In der Sessiontabelle wird die letzte Aktivität als Timestamp und die aktuell aufgerufene Seite gespeichert. Dies wird beim Seitenaufruf mit UPDATE auf den neuesten Stand gehalten. Im Logoutscript befindet sich dann eine Art "garbage collector", der dann die Einträge entfernt, bei denen der Timestamp ein gewisses Alter hat. Das wird mittels time<... durchgeführt.

Soweit mir bekannt ist, blockiert MySQL die SELECT Anweisungen, wenn ein UPDATE auf die Sessiontabelle noch läuft. Allerdings dürften die Updates für den Timestamp nicht allzulange dauern, denn diese werden ja auch über den Index angesprochen. Ist der "garbage collector" das Problem für diese langen Sperrzeiten? Ich bin mir nicht sicher ob man sowas mit Triggern lösen könnte bzw. ob das überhaupt eine Verbesserung bringt und falls doch, ob mir jemand ein wenig Hilfestellung geben könnte bzw. ein gutes Tutorial neben der MySQL Doku?
Top

LoneWraith
Posts: 7
Joined: 2009-11-19 16:18

Re: MySQL LockTables Problem

Post by LoneWraith »

Danke für die schnelle Antwort.
Nunja, ich bin halt vorsichtig mit dem "row based locking", denn bei den meisten Tabellen kann ich solch eine sperre nicht nehmen. Allerdings dürfte es bei der Sessiontabelle ja keine Schwierigkeiten damit geben. Mir ist völlig entfallen, dass man ja auch Tabellenweise innoDB verwenden kann... danke für den Hinweis.
Top