Comment réduire le fichier innodb ibdata1 sans vider toutes les bases de données?


24

InnoDB stocke toutes les tables dans un grand fichier ibdata1.

Après avoir supprimé une grande table, le fichier conserve sa taille, quelle que soit sa taille. Comment puis-je réduire ce fichier sans avoir à vider et réimporter la base de données entière (qui a plusieurs centaines de Go au total)?

Je pense que la raison en est que vous pouvez toujours annuler la suppression. Dans mon cas, je n'en ai pas besoin.

Réponses:


30

C'est l'un des sujets les plus controversés que j'ai jamais traités au fil des ans en tant que DBA MySQL et dans le DBA StackExchange.

Pour le dire légèrement, il n'y a tout simplement pas d'autre moyen de réduire ibdata1 . Avec innodb_file_per_table désactivé, chaque fois que vous exécutez OPTIMIZE TABLEsur une table InnoDB, ibdata1 se développe rapidement. Les données qui sont supprimées à l'aide DROP TABLEet DROP DATABASEne peuvent pas être restaurées car elles sont DDL, pas DML. Je crois qu'Oracle et MSSQL peuvent restaurer DDL. MySQL ne peut pas faire ça.

Il existe plusieurs classes d'informations qui résident dans ibdata1

  • Données de table
  • Index de table
  • Table MetaData
  • Données de contrôle MVCC
  • Double tampon d'écriture (écriture en arrière-plan pour éviter la dépendance à la mise en cache du système d'exploitation)
  • Insérer un tampon (gestion des modifications apportées aux index secondaires non uniques)

L'utilisation innodb_file_per_table=1vous permettra de créer de nouvelles tables avec des données de table et des index de table en cours de création en dehors d'ibdata1. Vous pouvez extraire toutes les tables encore à l'intérieur d'ibdata1 en utilisant ALTER TABLE ... ENGINE=InnoDB;ou, OPTIMIZE TABLEmais cela laissera ce grand espace inutilisé béant dans ibdata1.

Néanmoins, vous devez nettoyer l'infrastructure InnoDB. J'ai déjà écrit des articles StackExchange sur comment et pourquoi faire ceci:

Bonnes nouvelles

Il vous suffit de vider les données, de recharger une fois de plus et de ne plus jamais revoir ce problème . L'exécution OPTIMIZE TABLEultérieure réduira en effet le .ibdfichier d'espace disque logique de toute table InnoDB.


1
Correction mineure: MSSQL et PostgreSQL peuvent annuler DDL. Oracle ne peut pas. En fait, Oracle émet un commit implicite lorsqu'il voit DDL!
Chris Travers

1
@RolandoMySQLDBA depuis quelle version de MySQL fonctionne cette "bonne nouvelle" de rétrécissement automatique?
Gavriel

@Gavriel - Je pense que vous avez mal lu. Vous devez encore vider; supprimer ibdata1; redémarrer; et rechargez. Pas de rétrécissement automatique d'ibdata1. (Changer d'iblog * est maintenant plus simple.)
Rick James

2

InnoDB stocke uniquement toutes vos tables InnoDB dans ibdata1 si vous n'utilisez pas le paramètre suivant dans votre fichier par défaut my.cnf:

innodb_file_per_table = 1

DROP TABLE (et DROP DATABASE) ne peuvent pas être annulés.

Ce n'est pas la raison pour laquelle vous ne pouvez pas réduire ibdata1.

Il s'agit d'une explication abrégée, mais ibdata1 contient des éléments internes InnoDB en plus de vos données de table. D'après ma compréhension, pour le réduire, il faudrait le défragmenter, ce qui n'est pas une opération prise en charge.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.