Die Anweisung TRUNCATE TABLE hängt manchmal


7

Warum hängt die TRUNCATE TABLEAussage 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.


1
Können Sie klarstellen, von was Sie migrieren? Ist es MyISAM für InnoDB und MySQL für MariaDB?
Mat

Entschuldigung, migrieren Sie von MySQL zu MariaDB. Suchmaschine in beiden verwendet ist MyISAM
Haseena

Greifen andere Prozesse während der Migration auf Ihre Ziel-DB zu?
Dekso

Fügen Sie nach dem Abschneiden der Abfrage Daten in die Tabelle ein. In MySQL gibt es kein Problem.
Haseena

Antworten:


13

Der Grund, warum bei der Ausführung Leistungseinbußen oder Verzögerungen auftreten, TRUNCATE TABLEist 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:

CREATE TABLE log_table_new LIKE log_table;
RENAME TABLE log_table TO log_table_old, log_table_new TO log_table;
DROP TABLE log_table_old;

Bei Tabellen mit AUTO_INCREMENTWerten wird es schwierig : Eine neue Tabelle wird mit einem AUTO_INCREMENTWert erstellt, der sofort in die Arbeitstabelle aufgenommen wird. Wenn Sie nicht dieselben Werte verwenden möchten, können Sie:

ALTER TABLE log_table_new AUTO_INCREMENT=some high enough value;

In meiner Antwort sagte ich, es wäre am besten, nicht durch die Klempnerarbeiten von zu gehen TRUNCATE TABLE. Es sieht so aus, als hättest du den Clog gefunden. +1 !!!
RolandoMySQLDBA

1
Es sieht so aus, als ob diese Lösung Postgres ähnelt, bei der Fremdschlüsseleinschränkungen und Indizes nicht mit der likeAnweisung kopiert werden . Denken Sie daran, diese neu zu erstellen.
ps2goat

Ich habe es gerade versucht, und die Datenbank bleibt jetzt beim Schritt RENAME hängen. : / Wäre dies ein Beweis für Korruption? kann es verwaltet werden?
JPMC

6

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

TRUNCATE TABLE sampledb.datatable;

mit diesem

CREATE TABLE sampledb.datatablenew LIKE sampledb.datatable;
ALTER TABLE sampledb.datatable RENAME sampledb.datatablezap;
ALTER TABLE sampledb.datatablenew RENAME sampledb.datatable;
DROP TABLE sampledb.datatablezap;

Dies kann das Problem nur offline stellen (möglicherweise hängt es daran DROP TABLE), aber die Tabelle wird schnell verfügbar. DROP TABLEwurde in MySQL 5.5.23 verbessert .

Ich habe TRUNCATE TABLE in meinen letzten Beiträgen besprochen

Versuche es !!!


1

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:

  • Sperren für diese Tabelle: Die Abfrage könnte warten, bis andere Transaktionen abgeschlossen sind, die Sperren für diese Tabelle enthalten. In diesem Fall wird die Anweisung ohne CPU- oder E / A-Ressource angehalten, bis die konkurrierenden Sperren freigegeben werden.
  • Sperren für andere Tabellen: Wenn Sie an anderer Stelle Fremdschlüssel haben, die auf diese Tabelle verweisen, muss beim Abschneiden sichergestellt werden, dass keine Zeilen gelöscht werden, auf die noch verwiesen wird. Dies bedeutet, dass Sperren für diese anderen Tabellen dazu führen können, dass sie ebenfalls angehalten werden.
  • Unterschiede bei der Überprüfung der referenziellen Integrität: Wenn in Ihrer neuen Datenbank FKs definiert sind, die sich auf die Tabelle beziehen, in der die alte nicht vorhanden ist, kann dies auch einen Unterschied in der Schnittgeschwindigkeit erklären. Wenn die abgeschnittene Tabelle und / oder die verweisenden Tabellen sehr groß sind, kann dies alles andere als augenblicklich sein (wenn dies der Grund für Ihre unterschiedlichen beobachteten Verhaltensweisen ist, würden Sie erwarten, dass die Anweisung eine gewisse E / A- und / oder CPU-Last verursacht).

1

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 TABLEZeilen nacheinander, wenn FOREIGN KEYEinschränkungen vorliegen, die auf die Tabelle verweisen. Wenn es keine FOREIGN KEYEinschrä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 die IS_USED_LOCKFunktion zum Abrufen des Threads, der die Sperre hält.


0

Das TRUNCATEkann hängen bleiben, weil andere Prozesse diese Tabelle verwenden könnten, um die Ausführung in der Shell zu überprüfen:

mysqladmin proc

Beenden Sie dann die Abfragen, die es verwenden (ändern Sie 123die ID des Prozesses):

mysqladmin kill 123

Läuft auch:

mysql -e "SHOW ENGINE INNODB STATUS\G"

kann auch helfen, eventuelle Hänge zu untersuchen.

Verwandte: Wie Debugging Lock Wartezeitüberschreitung überschritten?


-1

Ich hatte das gleiche Problem und es wurde durch einen Neustart des MySQL-Servers behoben.

systemctl restart mysqld

Ich weiß, dass dies keine erwartete Lösung ist, aber wenn Sie nicht weiterkommen, können Sie den MySQL-Server neu starten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.