Différence substantielle entre la taille de la base de données sous MySQL et la taille réelle sur le disque

8

Lorsque je vérifie la taille de mes bases de données sous MySQL, j'obtiens ceci:

MariaDB [(none)]> SELECT table_schema "Data Base Name",  sum( data_length + index_length ) / 1024 /  1024 "Data Base Size in MB",  sum( data_free )/ 1024 / 1024 "Free Space in MB"  FROM information_schema.TABLES  GROUP BY table_schema;
+--------------------+----------------------+------------------+
| Data Base Name     | Data Base Size in MB | Free Space in MB |
+--------------------+----------------------+------------------+
| alfresco           |         245.75000000 |      34.00000000 |
| drupal             |         892.15625000 |     216.00000000 |
+--------------------+----------------------+------------------+

Lorsque je vérifie la taille du disque, j'obtiens ceci:

$ sudo du -h --max-depth=1 /var/lib/mysql/
317M    /var/lib/mysql/alfresco
1.4G    /var/lib/mysql/drupal

Si je combine à la fois l'espace utilisé et l'espace libre donné par Maria DB et que je le compare avec les chiffres du disque, j'ai ce qui suit:

alfresco: DB=279MB  DISK=317MB (+14%)
drupal: DB=1100MB   DISK=1433MB (+30%)

Q: Est-il normal d'avoir autant de surcharge sur le disque / Puis-je faire quelque chose pour le réduire?

Pour info, je pensais que l'exécution d'une optimisation mysql aiderait (en utilisant cette commande ), cela réduisait la taille des bases de données, mais ne changeait pas la taille des fichiers sur le disque.

Information additionnelle:

server:             ubuntu server 10.04 LTS
DB server:          MariaDB
DB engine:          InnoDB v10 (for all tables)
Table collation:    utf8_general_ci
Nb Drupal tables:   416  (0.80MB overhead per table)
Nb Alfresco tables: 84   (0.45MB overhead per table)
Max
la source
Toutes les tables InnoDB? Combien de tables?
gbn

Réponses:

5

Si vous utilisez des tables InnoDB, la taille de vos fichiers ibdata augmentera avec le temps. Donc, si vous DELETEémettez une instruction, la taille de votre base de données diminuera, mais le fichier ibdata restera le même (pas réduit).

Si vous n'utilisez pas d' innodb_file_per_tableoption, la seule façon de récupérer l'espace est de vider la base de données et de restaurer à partir du fichier de vidage.

Cependant, si vous utilisez innodb_file_per_table, vous pouvez émettre un

ALTER TABLE foo ENGINE=InnoDB;

sur des tables qui deviennent trop volumineuses pour récupérer l'espace disque.

Derek Downey
la source
pourquoi la taille des fichiers ibdata ne diminue-t-elle pas si la taille de la base de données le fait?
Max
Il s'agit apparemment d'une «décision de conception» prise par les développeurs d'innodb, brièvement expliquée dans les commentaires de ce bogue . Une demande de fonctionnalité similaire a été faite il y a quelques années, mais rien n'a été fait à ce sujet. Je ne suis pas personnellement d'accord avec la décision de conception, mais c'est ce que c'est.
Derek Downey
pourquoi ne pas optimiser l'espace de récupération de table? ou est-ce juste "bien rangé" et non pas "rétrécir"?
gbn
1
@gbn "Pour les tables InnoDB, OPTIMIZE TABLE est mappé sur ALTER TABLE, qui reconstruit la table pour mettre à jour les statistiques d'index et libérer de l'espace inutilisé dans l'index cluster." src Alors oui, juste bien rangé. La même raison pour laquelle un AlTER TABLE foo ENGINE=InnoDBsans innodb_file_per_table=1ne rétrécit pas les ibdata.
Derek Downey du