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.
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
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:
May 21, 2012
: Quelle sera la taille d'une base de données MySQL par rapport au fichier de vidage?Apr 01, 2012
: est-ce que innodb_file_per_table est conseillé?Mar 25, 2012
: Pourquoi InnoDB stocke-t-il toutes les bases de données dans un seul fichier?Feb 04, 2011
: MySQL InnoDB - contre innodb_file_per_table?Oct 29, 2010
: Comment: nettoyer un moteur de stockage mysql InnoDB?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.
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.