Warum hängt die TRUNCATE TABLE
Aussage manchmal? Was sind die Gründe für diese Art von Problem?
Ich migriere von MySQL zu MariaDB. Dieses Problem tritt nicht bei MySQL auf, sondern nur bei MariaDB.
Die hängende Aussage ist einfach:
TRUNCATE TABLE sampledb.datatable;
Was kann dazu führen und wie kann ich das beheben?
Eine andere Beobachtung ist, wenn die Tabelle einige Daten enthält, eine oder zwei Zeilen umfassen kann, dann funktioniert die Abfrage zum Abschneiden erfolgreich. Andernfalls hat die Tabelle viele Daten, die Abfrage bleibt hängen.
Antworten:
Der Grund, warum bei der Ausführung Leistungseinbußen oder Verzögerungen auftreten,
TRUNCATE TABLE
ist ein bekanntes Problem bei dieser Anweisung. Weitere Informationen finden Sie in Fehler # 68184: Tabelle abschneiden führt zu Innodb-Verzögerungen. Es gibt auch andere Fehlernummern, die für frühere Versionen geöffnet wurden.Sie können verwenden:
Bei Tabellen mit
AUTO_INCREMENT
Werten wird es schwierig : Eine neue Tabelle wird mit einemAUTO_INCREMENT
Wert erstellt, der sofort in die Arbeitstabelle aufgenommen wird. Wenn Sie nicht dieselben Werte verwenden möchten, können Sie:quelle
TRUNCATE TABLE
. Es sieht so aus, als hättest du den Clog gefunden. +1 !!!like
Anweisung kopiert werden . Denken Sie daran, diese neu zu erstellen.Sie müssen sich daran erinnern, dass TRUNCATE TABLE DDL und nicht DML ist.
Anstatt herauszufinden, wo in der Installation von TRUNCATE TABLE es stecken bleibt, müssen Sie möglicherweise die Dinge selbst in die Hand nehmen, indem Sie diese ersetzen
mit diesem
Dies kann das Problem nur offline stellen (möglicherweise hängt es daran
DROP TABLE
), aber die Tabelle wird schnell verfügbar.DROP TABLE
wurde in MySQL 5.5.23 verbessert .Ich habe TRUNCATE TABLE in meinen letzten Beiträgen besprochen
Jul 09, 2012
: Was kann dazu führen, dass TRUNCATE TABLE sehr lange dauert?Jan 17, 2012
;; Problem mit InnoDB-Dateigrößen "pro Tabelle"Sep 28, 2011
: So stellen Sie eine InnoDB-Tabelle wieder her, deren Dateien verschoben wurdenVersuche es !!!
quelle
Ohne weitere Informationen ist es schwer zu sagen, und ich bin kein Experte speziell für MySQL / MariaDB, aber die allgemeinen Gründe für die Ausführung einer Abfrage, die unerwartet länger als gewöhnlich dauert, sind:
quelle
In Mariadb fungiert die abgeschnittene Tabelle als Ablagetabelle und implizite Neuerstellung der leeren Tabelle. Kürzungsvorgänge können jedoch nicht ausgeführt werden, wenn die Sitzung eine aktive Tabellensperre enthält.
Nur mit der InnoDB-Tabelle verarbeitet InnoDB die
TRUNCATE TABLE
Zeilen nacheinander, wennFOREIGN KEY
Einschränkungen vorliegen, die auf die Tabelle verweisen. Wenn es keineFOREIGN KEY
Einschränkungen gibt, führt InnoDB eine schnelle Kürzung durch, indem die ursprüngliche Tabelle gelöscht und eine leere Tabelle mit derselben Definition erstellt wird. Wenn Sie angeben, dass das Abschneiden einer Tabelle mit wenigen Datensätzen schnell ist und wenn das Abschneiden vieler Datensätze unendlich ist, kann ich davon ausgehen, dass Sie InnoDB und FK haben.Bevor Sie Ihre Tabelle abschneiden, versuchen Sie außerdem
IS_FREE_LOCK(str)
, zu überprüfen, ob die Tabelle gesperrt ist. Wenn ja, gibt es dieIS_USED_LOCK
Funktion zum Abrufen des Threads, der die Sperre hält.quelle
Das
TRUNCATE
kann hängen bleiben, weil andere Prozesse diese Tabelle verwenden könnten, um die Ausführung in der Shell zu überprüfen:Beenden Sie dann die Abfragen, die es verwenden (ändern Sie
123
die ID des Prozesses):Läuft auch:
kann auch helfen, eventuelle Hänge zu untersuchen.
Verwandte: Wie Debugging Lock Wartezeitüberschreitung überschritten?
quelle
Ich hatte das gleiche Problem und es wurde durch einen Neustart des MySQL-Servers behoben.
Ich weiß, dass dies keine erwartete Lösung ist, aber wenn Sie nicht weiterkommen, können Sie den MySQL-Server neu starten.
quelle