Pourquoi toutes les tables MySQL InnoDB sont-elles fragmentées?

10

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_MBcolonne (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?

Clive
la source
Pensez-vous vraiment que 7 Mo gratuits sont un problème?
David Schwartz
@DavidSchwartz Pas un indice, c'est pourquoi j'ai demandé;) Il y a 2314 tables, chacune avec 7 Mo de libre, et je ne sais pas ce que cela signifie. Je ne sais pas pourquoi mysqltuner me montrerait ce chiffre s'il n'était pas un sujet de préoccupation potentiel. J'espérais que quelqu'un ici serait en mesure de me dire à quel point il est préoccupé de recevoir les chiffres et ce que je peux faire pour atténuer le problème car les méthodes «standard» ne fonctionnent pas
Clive
Migration de cette question selon la demande de l'utilisateur dans un indicateur.
Daniel Beck
La plupart des détails que mysqltuner montre sont pour information seulement. Tout n'est pas un problème. S'il s'agit d'un problème, il le dira clairement. Cela a-t-il été signalé comme un problème?
John Gardeniers
@JohnGardeniers Je crois que oui, le message est:, ce [!!] Total fragmented tables: 2314qui, j'en suis sûr, indique un problème (avec les doubles points d'exclamation rouges)
Clive

Réponses:

5

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.

John Gardeniers
la source
3

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 .ibdfichier 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

ALTER TABLE table_name ENGINE=INNODB;

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

MISE À 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)

RolandoMySQLDBA
la source
1
Ahhh ok, les choses ont beaucoup plus de sens maintenant, merci. J'ai fini par exporter les données, essuyer complètement MySQL, puis réinstaller (mais en ajoutant innodb_file_per_tableau 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 avec innodb_force_recoveryau 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
Clive
impressionnant! c'est très instructif. Merci @RolandoMySQLDBA!
Sudhi