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 TABLE
exé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 TABLE
arrivé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 TABLE
depuis 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?
Réponses:
L'utilisation
TRUNCATE TABLE
sur 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'accrochentuser_engagements
, cela pourrait également en retarder uneTRUNCATE TABLE
.Vous pouvez renommer la table afin qu'elle soit immédiatement disponible
Cela devrait se répliquer rapidement, sauf pour la dernière instruction.
Essaie !!!
Si vous avez MySQL 5.1.16+,
TRUNCATE TABLE
nécessite le privilège DROP . Ma réponse fait ce que faitTRUNCATE TABLE
maintenant.Si vous avez MySQL 5.1.15 et retour, vous avez besoin du privilège DELETE , que ma réponse couvre.
la source
RENAME TABLE
instruction en plusieurs parties au lieu deALTER TABLE
pour rendre le renommage atomique:RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements;
Une autre considération est queDROP TABLE
le 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 doitinnodb_lazy_drop_table
vous aider, mais celaDROP TABLE
peut encore prendre beaucoup de temps sur les systèmes de fichiers ext.truncate table
prenne beaucoup de temps à cause des partitions sur la table (1000), je peux les supprimer si cela mène à la solution?