Qu'est-ce qui peut faire que TRUNCATE TABLE prenne très longtemps?

9

J'utilise MySQL5.5 avec réplication maître / esclave (1 maître, 2 esclaves).

J'ai un processus qui s'exécute une fois par semaine et tronque une table spécifique. Le tableau n'est pas grand et ne contient que quelques milliers d'enregistrements.

Pour une raison quelconque, l' TRUNCATE TABLEexécution de la commande prend beaucoup de temps (à la fois sur le maître et sur l'esclave). Il faut environ 400K ms pour s'exécuter !! Lorsqu'il s'exécute sur l'esclave, il entraîne un décalage par rapport au maître. Après les TRUNCATE TABLEarrivées, tout est revenu à la normale.

Je sais que l'un des esclaves n'a reçu aucune lecture lors de l'exécution du TRUNCATE TABLEdepuis son esclave dédié et le processus qui lit à partir de cet esclave était en panne. De plus, sur cet esclave, l'exécution a pris le même temps.

Voici la structure du tableau: http://pastebin.com/qEQB4juR

Avez-vous des idées sur la façon d'accélérer la TRUNCATE TABLE?

Ran
la source
Y a-t-il une partition sur la table?
Barbaros Alp

Réponses:

8

L'utilisation TRUNCATE TABLEsur une table InnoDB nécessite un verrou de table complet car TRUNCATE TABLE est DDL (Data Definition Language) et non DML (Data Manipulation).

Faire DELETE FROM user_engagements;n'aidera pas car les informations MVCC sont écrites dans les journaux d'annulation dans ibdata1, et cela peut empêcher la table d'être vidée. Si des transactions non validées s'accrochent user_engagements, cela pourrait également en retarder une TRUNCATE TABLE.

Vous pouvez renommer la table afin qu'elle soit immédiatement disponible

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;

Cela devrait se répliquer rapidement, sauf pour la dernière instruction.

Essaie !!!

Si vous avez MySQL 5.1.16+, TRUNCATE TABLEnécessite le privilège DROP . Ma réponse fait ce que fait TRUNCATE TABLEmaintenant.

Si vous avez MySQL 5.1.15 et retour, vous avez besoin du privilège DELETE , que ma réponse couvre.

RolandoMySQLDBA
la source
2
J'utiliserais une RENAME TABLEinstruction en plusieurs parties au lieu de ALTER TABLEpour rendre le renommage atomique: RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements; Une autre considération est que DROP TABLEle LRU_mutex est verrouillé pendant que la liste LRU est analysée et chaque entrée est supprimée - cela bloquera votre serveur. Percona Server doit innodb_lazy_drop_tablevous aider, mais cela DROP TABLEpeut encore prendre beaucoup de temps sur les systèmes de fichiers ext.
Aaron Brown
se pourrait-il que cela truncate tableprenne beaucoup de temps à cause des partitions sur la table (1000), je peux les supprimer si cela mène à la solution?
Ran