179 votes

MySQL innodb ne libère pas d'espace disque après avoir supprimé des lignes de données de la table

J'ai une table de données mysql de type INNODB, qui contient environ 2 millions de lignes de données. Lorsque j'ai supprimé des lignes de données de la table, cela n'a pas libéré l'espace disque alloué. La taille du fichier ibdata1 n'a pas non plus diminué après l'exécution de la commande optimize table commandement.

Existe-t-il un moyen de récupérer l'espace disque de mySQL.

Je suis dans une mauvaise situation, cette application fonctionne sur une cinquantaine de sites différents et le problème du manque d'espace disque apparaît maintenant sur presque tous les sites.

0 votes

Après avoir exécuté la commande optimize également, la taille du fichier ibdata1 n'a pas diminué.

4 votes

Je pense que ce commentaire serait mieux édité dans votre réponse, et ensuite supprimé.

0 votes

Duplicata possible de stackoverflow.com/q/11751792/82114 (mais celui-ci était ici en premier)

2voto

Une autre façon de résoudre le problème de la récupération de l'espace est de créer plusieurs partitions dans la table - des partitions basées sur l'étendue, des partitions basées sur la valeur et il suffit de déposer/trouver la partition pour récupérer l'espace, ce qui libérera l'espace utilisé par l'ensemble des données stockées dans la partition particulière.

Il y aura quelques changements nécessaires dans le schéma de la table lorsque vous introduisez le partitionnement pour votre table comme - les clés uniques, les index pour inclure la colonne de partition, etc.

1voto

Wellington1993 Points 194

Si l'OPTIMIZE ne résout pas votre problème, essayez :

ALTER TABLE tbl_name ENGINE=INNODB, ALGORITHM=INPLACE, LOCK=NONE;

ou

ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;

0voto

Gajendra Points 70

Il y a un an, j'ai également rencontré le même problème sur la version mysql5.7 et ibdata1 occupait 150 Go. J'ai donc ajouté des tablespaces d'annulation

Faire une sauvegarde de Mysqldump
Arrêtez le service mysql
Supprimer toutes les données du répertoire de données
Ajoutez le paramètre undo tablespace ci-dessous dans le fichier my.cnf actuel.

 #undo tablespace
  innodb_undo_directory =  /var/lib/mysql/
  innodb_rollback_segments = 128 
  innodb_undo_tablespaces = 3
  innodb_undo_logs = 128  
  innodb_max_undo_log_size=1G
  innodb_undo_log_truncate = ON

Démarrez le service mysql
stocker la sauvegarde mysqldump

Problème résolu !

-1voto

Bùi Đức Khánh Points 1349

Il existe plusieurs façons de récupérer de l'espace disque après avoir supprimé des données d'une table pour le moteur MySQL Inodb.

Si vous n'utilisez pas innodb_file_per_table dès le début, vider toutes les données, supprimer tous les fichiers, recréer la base de données et importer à nouveau les données est la seule solution (voir les réponses de FlipMcF ci-dessus).

Si vous utilisez innodb_file_per_table, vous pouvez essayer

  1. Si vous pouvez supprimer toutes les données, la commande truncate supprimera les données et récupérera l'espace disque pour vous.
  2. La commande Alter table va supprimer et recréer la table afin qu'elle puisse récupérer de l'espace disque. Par conséquent, après avoir supprimé les données, exécutez la commande ALTER TABLE TBL_A qui ne change rien pour libérer le disque dur (par exemple, la table TBL_A a un jeu de caractères uf8, après avoir supprimé les données, exécutez la commande ALTER TABLE TBL_A charset utf8 -> cette commande ne change rien à votre table mais elle permet à mysql de recréer votre table et de regagner de l'espace disque).
  3. Créez TBL_B comme TBL_A . Insérez les données que vous souhaitez conserver de la TBL_A dans la TBL_B. Déposez TBL_A, et renommez TBL_B en TBL_A. Cette méthode est très efficace si TBL_A et les données à supprimer sont importantes (la commande de suppression dans MySQL innodb est très peu performante).

0 votes

Veuillez noter que l'option 3 supprimera les vues/index construits sur la TBL_A, ce qui nuira à la performance et pourrait briser les applications. De plus, si TBL_A est une source de clé étrangère, vous ne pourrez pas la supprimer. L'option 2, de même, doit être utilisée avec prudence, car sous couvert, elle fait la même chose que l'option 3. Je ne suis pas certain que les index/vues seront reconstruits après ALTER (j'en doute). En général, à l'exception de TRUNCATE, les opérations ci-dessus ne sont pas des pratiques de qualité professionnelle, et au minimum, elles ne devraient être effectuées que pendant les périodes de maintenance prescrites, et avec une attention particulière aux dépendances (supérieures et inférieures).

0 votes

Bonjour @Dennis, l'option 3 est ce que j'ai appris de Percona, dans cette réponse, je ne parle que de l'idée de le faire et dans la pratique, il faut gérer toutes les contraintes et les affaires par la logique du code, donc il ne peut pas s'adapter à toutes les situations. Une autre chose, cette question porte sur la façon de supprimer les données et de libérer le disque. Je pense que toutes mes solutions peuvent le faire, mais dans chaque étude de cas, nous devons choisir ce qui convient. Parfois, il suffit de tronquer une grande table d'enregistrement inutilisée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X