web-dev-qa-db-fra.com

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

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.

24
rubo77

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 TABLE sur une table InnoDB, ibdata1 croît rapidement. Données supprimées à l'aide de DROP TABLE et DROP DATABASE ne peut pas être annulé car il s'agit de DDL et non de 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 de se fier à la mise en cache du système d'exploitation)
  • Insérer un tampon (gestion des modifications apportées aux index secondaires non uniques)

En utilisant innodb_file_per_table=1 vous 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 présentes dans ibdata1 en utilisant ALTER TABLE ... ENGINE=InnoDB; ou OPTIMIZE TABLE mais 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

Vous n'avez qu'à vider les données, recharger une fois de plus et ne revisitez plus jamais ce problème. Fonctionnement OPTIMIZE TABLE après réduira en effet le .ibd fichier d'espace table pour n'importe quelle table InnoDB.

30
RolandoMySQLDBA

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.

2
Michael - sqlbot