La configuration
Nous avons une configuration Debian Linux avec MySQL v5.1.73 (moteur de stockage innoDB) et puppet-dashboard version 1.2.23. Comme vous l'avez probablement deviné, puppet-dashboard utilise MySQL comme backend.
Aussi, cela ne devrait pas être pertinent mais il s'agit d'une machine virtuelle VMware sur vSphere 5.5.
Le problème
Le problème est que, malgré le nombre de nœuds puppet et la fréquence d'exécution restant relativement les mêmes, l'espace disque utilisé par MySQL continue d'augmenter de manière inquiétante jusqu'au point où cela devient maintenant un problème.
Le graphique suivant illustre le problème.
Nous avons mis en place deux tâches cron qui devraient permettre de libérer de l'espace disque. Elles sont les suivantes et s'exécutent quotidiennement :
- rake RAILS_ENV=production db:raw:optimize
- rake RAILS_ENV=production reports:prune:orphaned upto=3 unit=mon
Les chutes que vous pouvez voir dans le graphique sont les tâches cron qui s'exécutent et consomment plus d'espace en essayant de libérer de l'espace.
Les journaux binaires MySQL ne sont pas activés. 95% de l'espace disque utilisé sur ce serveur est situé dans le répertoire /var/lib/mysql/dashboard_production où les données MySQL sont stockées.
Nous avons eu ce problème auparavant avec une application différente (Zabbix monitoring) et avons dû sauvegarder la base de données et la réimporter pour libérer de l'espace. Il s'agissait d'un processus très douloureux et non une solution très élégante mais cela a finalement fonctionné.
Existe-t-il un moyen de récupérer cet espace disque ? Que pouvons-nous faire pour arrêter ce comportement ?
Modification 1
Nous utilisons en effet le moteur innoDB et nous n'utilisons pas la directive de configuration "innodb_file_per_table".
Comme demandé par Félix, la sortie de la commande est la suivante :
+----------------------+-------------------+-------------+
| table_schema | table_name | data_length |
+----------------------+-------------------+-------------+
| dashboard_production | resource_statuses | 39730544640 |
| dashboard_production | metrics | 643825664 |
| dashboard_production | report_logs | 448675840 |
| dashboard_production | timeline_events | 65634304 |
| dashboard_production | reports | 50937856 |
| dashboard_production | resource_events | 38338560 |
| glpidb | glpi_crontasklogs | 21204608 |
| ocsweb | softwares | 8912896 |
| ocsweb | deploy | 5044208 |
| phpipam | logs | 1269584 |
+----------------------+-------------------+-------------+
Aussi, je vais essayer la tâche reports:prune sans l'option "orphaned" comme mentionné ainsi que les autres alternatives et je mettrai à jour cette question.
Modification 2
J'ai exécuté la tâche rake reports:prune et, malgré la suppression de 230000 rapports, il continuait de consommer plus d'espace... Je vais donc passer aux autres options.
La solution
Après avoir supprimé les deux tiers des entrées de la base de données, cela n'a libéré que 200 Mo d'espace disque ce qui n'a pas de sens. Nous avons finalement sauvegardé le contenu et réimporté en veillant à activer "innodb_file_per_table".
Nous devrons juste attendre et voir si cela résout le problème à long terme mais pour le moment, cela semble être le cas.
1 votes
Utilisez-vous InnoDB? Vérifiez stackoverflow.com/questions/1270944/…
0 votes
Pouvez-vous identifier les tables les plus consommatrices d'espace?
mysql -p information_schema -e 'select table_schema,table_name,data_length from tables order by data_length desc limit 10;'
0 votes
Ainsi, le gaspillage le plus significatif est
resource_statuses
. En regardant la croissance, il contient probablement des données historiques. Je ne suis pas sûr de comment aborder cela. Au moment venu, raccourcir les lignes manuellement :-)0 votes
Oui, je vais jeter un coup d'œil à cela, mais étant donné que la suppression des données augmente l'utilisation de l'espace disque, je ne suis pas trop optimiste à ce sujet :)
0 votes
Je viens de relire votre post une fois de plus. Oui, InnoDB sans
file_per_table
posera un problème. Mais tant que vous avez des données réelles d'environ 40G, vous pouvez optimiser et sauvegarder/restaurer autant que vous le souhaitez, la base de données ne prendra jamais moins d'espace que cela. Après avoir supprimé vos données, vous devrez effectivement réduire l'espace de votre table, généralement en passant par une sauvegarde/restauration. Activezfile_per_table
avant la restauration pour moins de douleur à l'avenir ;-)0 votes
Après avoir supprimé les 2/3 de la base de données, il s'avère que cette métrique est incorrecte en ce qui concerne l'utilisation des données utiles car elle est restée la même...