Pour une raison quelconque, toutes les tables InnoDB de mon serveur MySQL sont répertoriées comme fragmentées lorsque j'exécute mysqltuner. J'ai installé le serveur il y a seulement quelques heures (sur OSX Lion), et il contient un tas de nouvelles données importées à partir de fichiers batch.
J'ai essayé de convertir toutes les tables d'une base de données en MYISAM, et bien sûr, le nombre de tables fragmentées a baissé. Curieusement, dès que j'ai reconverti ces tables en InnoDB, le nombre de tables fragmentées a de nouveau augmenté. Ceci est contraire à mes recherches jusqu'à présent qui suggèrent que la course ALTER TABLE table_name ENGINE=INNODB;
devrait corriger la fragmentation.
Après un peu de recherche sur Google, j'ai couru:
SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB
FROM information_schema.tables
WHERE engine LIKE 'InnoDB' AND data_free > 0
Qui répertorie soi-disant toutes les tables fragmentées (il retourne en effet le même nombre de résultats que les sorties mysqltuner pour le nombre de tables fragmentées). Chaque entrée a exactement le même numéro dans la data_free_MB
colonne (actuellement 7,00000000).
Est-ce réellement un vrai problème ou quelque chose que mysqltuner fait mal? Si c'est un problème, comment puis-je le résoudre?
ÉDITER
Je deviens de plus en plus soupçonneux d'être un idiot et que la fragmentation de 7 Mo concerne l'ensemble du fichier, pas chaque table. Quelqu'un peut-il confirmer si tel serait le cas?
[!!] Total fragmented tables: 2314
qui, j'en suis sûr, indique un problème (avec les doubles points d'exclamation rouges)Réponses:
Selon mes commentaires ci-dessus, toutes les sorties de sqltuner n'indiquent pas d'erreurs. À moins que le script n'indique très clairement qu'il s'agit d'un problème, généralement sur la ligne suivante, suivi de suggestions de correction, il s'agit uniquement d'un élément d'information.
la source
Lorsque vous avez activé innodb_file_per_table , tout ce que vous avez fait a été de configurer un protocole pour que toutes les nouvelles tables InnoDB soient créées dans un
.ibd
fichier externe . Toutes les tables InnoDB que vous avez créées avant cela sont toujours intégrées dans ibdata1.Avec innodb_file_per_table désactivé, chaque fois que vous exécutez
il ne fait qu'ajouter les données et les pages d'index de la table à ibdata1. Cela fera que le tableau existera dans des pages contiguës et supprimera la fragmentation. L'inconvénient est que ibdata1 se développe rapidement.
RECOMMANDATION
Vous devrez exporter toutes les données, supprimer ibdata1, ib_logfile0, ib_logfile1 et recharger.
J'ai écrit comment et pourquoi faire ça
Oct 29, 2010
: Comment: nettoyer un moteur de stockage mysql InnoDB?Jul 05, 2012
: Déplacer ibdata1, définir innodb_data_file_pathMISE À JOUR 2012-08-15 12:05 EDT
Vous voudrez peut-être examiner le script mysqltuner.pl lui-même. À mon humble avis, je pense qu'il utilise une ancienne formule pour mesurer la fragmentation. Assurez-vous d'avoir la dernière version de mysqltuner.
Quant à la mesure de la fragmentation des tables InnoDB stockées en externe, j'ai écrit un article à ce sujet le 11 avril 2012 (voir la mise à jour en bas du 19 avril 2012)
la source
innodb_file_per_table
au fichier conf avant de démarrer le serveur et de réimporter). Avant cela, je recevais toutes sortes d'erreurs InnoDB (les très mauvaises sortes ... celles qui signifiaient que je devais courir avecinnodb_force_recovery
au niveau 6 juste pour sortir les données!), Et toutes sortes de 'la date du fichier journal est dans l'avenir!' les erreurs. Celles-ci semblent avoir cessé maintenant, mais j'ai encore quelques tableaux fragmentés. Je vais juste garder un œil dessus, merci encore pour la contribution