2008-09-15 2 views
12

Ich versuche, mehrere Zeilen aus einer MySQL 5.0.45 Datenbank zu löschen:MySQL: „lock Wartezeitlimit überschritten“

delete from bundle_inclusions; 

Der Kunde eine Zeit lang funktioniert und dann den Fehler zurückgibt:

Lock wait timeout exceeded; try restarting transaction 

Es ist möglich, dass es einige nicht festgeschriebene Transaktionen gibt, die eine Sperre für diese Tabelle haben, aber ich brauche diesen Prozess, um solche Sperren zu übertrumpfen. Wie kann ich die Sperre in MySQL aufheben?

Antwort

19

ich mit Erik zustimmen; TRUNCATE TABLE ist der Weg zu gehen. wenn Sie nicht können jedoch, dass aus irgendeinem Grund verwenden (zum Beispiel, wenn Sie nicht wirklich wollen jede Zeile in der Tabelle löschen), können Sie die folgenden Optionen versuchen:

  • Löschen Sie die Zeilen in kleineren Batches (z. B. DELETE FROM bundle_inclusions WHERE ID BETWEEN? und?)
  • Wenn es sich um eine MyISAM-Tabelle handelt (eigentlich könnte dies auch mit InnoDB funktionieren), versuchen Sie, vor dem DELETE eine LOCK TABLE auszugeben. Dies sollte garantieren, dass Sie exklusiven Zugriff haben.
  • Wenn es eine InnoDB-Tabelle ist, dann nach die Zeitüberschreitung auftritt, verwenden Sie SHOW INNODB STATUS. Dies sollte Ihnen einen Einblick geben, warum die Lock-Erfassung fehlgeschlagen ist.
  • Wenn Sie die SUPER-Berechtigung haben, können Sie SHOW PROCESSLIST ALL versuchen, um zu sehen, welche anderen Verbindungen (falls vorhanden) die Tabelle verwenden und dann KILL verwenden, um die Konkurrenz (n) loszuwerden.

Ich bin sicher, dass es viele andere Möglichkeiten gibt; Ich hoffe eine dieser Hilfe.

3

Erraten: truncate table bundle_inclusions

5

Linux: In mysql Konfiguration (/etc/my.cnf oder /etc/mysql/my.cnf) einfügen/bearbeiten diese Zeile

innodb_lock_wait_timeout = 50 

den Wert erhöhen ausreichend (in Sekunden), Datenbank neu starten, Änderungen durchführen. Dann die Änderung rückgängig machen und neu starten.

2

Ich hatte das gleiche Problem, eine Rogue-Transaktion ohne ein Ende. Ich habe den mysqld-Prozess neu gestartet. Sie müssen eine Tabelle nicht abschneiden. Sie können Daten aus dieser Rogue-Transaktion verlieren.