Was kann dazu führen, dass TRUNCATE TABLE sehr lange dauert?


9

Ich verwende MySQL5.5 mit Master / Slave-Replikation (1 Master, 2 Slaves).

Ich habe einen Prozess, der einmal pro Woche ausgeführt wird und eine bestimmte Tabelle abschneidet. Die Tabelle ist nicht groß und enthält nur wenige tausend Datensätze.

Aus irgendeinem Grund TRUNCATE TABLEdauert die Ausführung des Befehls sehr lange (sowohl auf dem Master als auch auf dem Slave). Die Ausführung dauert ca. 400K ms !! Wenn es auf dem Slave ausgeführt wird, bleibt es vom Master zurück. Nach dem TRUNCATE TABLEEnde ist alles wieder normal.

Ich weiß, dass einer der Slaves während der Ausführung keine Lesevorgänge erhalten hat, TRUNCATE TABLEda es sich um einen dedizierten Slave handelt und der Prozess, der von diesem Slave liest, fehlgeschlagen ist. Bei diesem Slave dauerte die Ausführung genauso lange.

Hier ist die Tabellenstruktur: http://pastebin.com/qEQB4juR

Irgendwelche Gedanken darüber, wie ich die TRUNCATE TABLE beschleunigen kann?


Gibt es eine Partition auf dem Tisch?
Barbaros Alp

Antworten:


8

Die Verwendung TRUNCATE TABLEin einer InnoDB-Tabelle erfordert eine vollständige Tabellensperre, da TRUNCATE TABLE DDL (Data Definition Language) und nicht DML (Data Manipulation) ist.

Dies DELETE FROM user_engagements;hilft nicht weiter, da MVCC-Informationen in die Rückgängig-Protokolle in ibdata1 geschrieben werden und dies das Entleeren der Tabelle verhindern kann. Wenn sich nicht festgeschriebene Transaktionen halten user_engagements, kann dies möglicherweise auch eine Verzögerung bedeuten TRUNCATE TABLE.

Sie können die Tabelle umbenennen, damit sie sofort verfügbar ist

SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE user_engagements_new LIKE user_engagements;
ALTER TABLE user_engagements RENAME user_engagements_zap;
ALTER TABLE user_engagements_new RENAME user_engagements;
DROP TABLE user_engagements_zap;
SET FOREIGN_KEY_CHECKS = 1;

Dies sollte sich bis auf die letzte Anweisung schnell replizieren.

Versuche es !!!

Wenn Sie über MySQL 5.1.16+ verfügen, ist TRUNCATE TABLEeine DROP- Berechtigung erforderlich . Meine Antwort führt aus, was TRUNCATE TABLEjetzt tut.

Wenn Sie über MySQL 5.1.15 und zurück verfügen, benötigen Sie die Berechtigung DELETE , die in meiner Antwort behandelt wird.


2
Ich würde RENAME TABLEstattdessen eine mehrteilige Anweisung verwenden ALTER TABLE, um die Umbenennung atomar zu machen: RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements; Eine weitere Überlegung ist, DROP TABLEdass der LRU_mutex gesperrt wird, während die LRU-Liste gescannt und jeder Eintrag entfernt wird - dies blockiert Ihren Server. Percona Server muss innodb_lazy_drop_tabledabei helfen, kann aber DROP TABLEauf ext-Dateisystemen noch lange dauern.
Aaron Brown

Könnte es sein, dass das truncate tableaufgrund der Partitionen in der Tabelle (1000) viel Zeit in Anspruch nimmt. Ich kann sie entfernen, wenn dies zur Lösung führt.
Ran
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.