Löschen einer einzelnen Zeile aus einer großen MySql-Tabelle führt zu einem "Sperrzeitlimit"

9

Ich benutze MySql 5.0.22 und habe eine wirklich unhandliche Tabelle mit ungefähr 5 Millionen Zeilen.

Einige, aber nicht alle Zeilen werden von einem Fremdschlüssel auf eine andere Tabelle verwiesen.

Alle Versuche, die nicht referenzierten Zeilen zu entfernen, sind bisher fehlgeschlagen, was jedes Mal zu Sperrzeitüberschreitungen führt.

Das Kopieren der Zeilen, die ich in eine alternative Tabelle schreiben möchte, ist ebenfalls mit dem Sperr-Timeout fehlgeschlagen.

Verdächtig, sogar eine Anweisung, die sofort wie die folgende abschließen sollte, scheitert auch mit "Sperr-Timeout":

%Vor%

... an diesem Punkt sind mir die Ideen ausgegangen.

Edit: Was es wert ist, habe ich auf meinem Dev-System durchgearbeitet, also benutze ich momentan nur die Datenbank, also sollte es außerhalb der SQL keine Sperrung geben läuft.

Irgendwelche MySql-Gurus da draußen haben Vorschläge, wie man diese abtrünnige Tabelle zähmen kann?

Edit # 2: Wie gewünscht, die Tabellenstruktur:

%Vor%

Beachten Sie, versuchen Sie, den FK auch mal zu löschen.

    
Rocjoe 05.05.2011, 17:52
quelle

2 Antworten

3

Ich hatte das gleiche Problem mit einer innodb-Tabelle. Tabelle optimieren korrigiert es.

    
Albert 19.07.2011 22:33
quelle
1

Ok, ich habe endlich einen Ansatz gefunden, der funktioniert, um die unerwünschten Zeilen aus meiner großen InnoDB-Tabelle zu entfernen! Hier ist, wie ich es gemacht habe:

  1. Die Verwendung von MySQL Workbench wurde gestoppt (sie haben ein hartcodiertes Ausführungszeitlimit von 30 Sekunden)
  2. Eine Eingabeaufforderung geöffnet
  3. Die Tabelle "full" wurde mit ALTER TABLE
  4. umbenannt
  5. Erstellt eine leere Tabelle mit dem ursprünglichen Tabellennamen und der ursprünglichen Struktur
  6. Neustart von MySQL
  7. Aus "Autocommit" mit SET AUTOCOMMIT = 0
  8. ausgeschaltet
  9. Es wurde eine begrenzte Anzahl von Zeilen gleichzeitig gelöscht, und nach jedem Erfolg wurde das Limit erhöht
  10. Hat ein COMMIT; Zwischen den Delete-Anweisungen seit dem Abstellen von Autocommit habe ich mich wirklich in einer großen Transaktion versteckt

Die ganze Anstrengung sah ungefähr so ​​aus:

%Vor%

... seltsamerweise war das Umbenennen der Tabelle der einzige ALTER TABLE-Befehl, der sofort beendet werden würde.

%Vor%

... und dann einen Neustart, falls meine vorherigen fehlgeschlagenen Versuche eine neue Arbeit blockieren könnten ...

%Vor%

... Sobald ich 100k auf einmal löschte, fiel die Ausführungszeit von InnoDB mit jedem erfolgreichen Befehl ab. Ich nehme an, dass InnoDB beginnt, Read-Ahead bei großen Scans durchzuführen. Doing Commits würde die Read-Ahead-Daten zurücksetzen, also habe ich die COMMITs auf alle 2 Millionen Zeilen aufgeteilt, bis der Job fertig war.

Ich habe die Aufgabe abgeschlossen, indem ich die verbleibenden Zeilen in meine "leere" Klon-Tabelle kopiert habe und dann die alte (umbenannte) Tabelle gelöscht habe.

Keine anmutige Lösung, und es werden keine Gründe angesprochen, warum das Löschen einer einzelnen Zeile aus einer großen Tabelle fehlschlagen sollte, aber zumindest habe ich das Ergebnis erhalten, nach dem ich gesucht habe!

    
Rocjoe 12.05.2011 19:27
quelle

Tags und Links