May/080
Alter Table: Disk Full
J’ai eu de la misère il y a quelques jours avec un ALTER TABLE qui a mal tourné. Je tentais d’ajouter un index sur une table InnoDB de 40 GO. Comme vous devez le savoir, pour ajouter un index, MySQL crée une copie temporaire de la table avec le nouvel index. Lorsque la table temporaire a fini d’être copiée, il remplace la table initiale par la table temporaire.
Ce que je n’avais pas prévu, c’est que le serveur et les données se trouvaient sur un disque de 64GO au total. Évidemment, il n’y avait pas suffisamment d’espace pour la table de 40GO et la copie temporaire de 40GO (en plus du nouvel index) mais ça, je l’ai découvert un peu trop tard.
J’ai donc laissé la requête roulée durant plusieurs minutes jusqu’à ce que le disque soit plein, croyant que MySQL supprimerait la table temporaire après que la requête ai plantée. Ce n’est pas du tout ce qui s’est produit.
Le disque s’est rempli et la requête a plantée. C’est tout. Le disque dur est resté plein à 100% ce qui rend un système relativement instable. La table temporaire se trouve dans le tablespace d’InnoDB, donc pas moyen de manuellement supprimer la table temporaire. J’ai fouillé sur Google et demandé à la communauté sur IRC la procédure pour supprimer la table temporaire du tablespace. J’ai rien trouvé de concret et eu aucune réponse satisfaisante sur IRC.
Par chance, c’était un serveur de test sur lequel un très récent backup venait tout juste d’être installé. Comme j’étais le seul à travailler sur le serveur et qu’aucun statement DML n’avait été fait, j’ai simplement remplacé le tablespace par celui du backup. Je dois m’estimer chanceux que ça ai fonctionné.
La morale de cette histoire: assurez-vous de toujours avoir assez de place quand vous faites un ALTER TABLE. La majorité du temps, une copie temporaire de grosseur égale ou supérieure doit être créée. Prévoyez le coup!
Enjoy this article?
No comments yet.
Leave a comment
No trackbacks yet.