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)

167voto

Leonel Martins Points 1517

MySQL ne réduit pas la taille de ibdata1. Jamais. Même si vous utilisez optimize table pour libérer l'espace utilisé par les enregistrements supprimés, il le réutilisera plus tard.

Une autre solution consiste à configurer le serveur pour qu'il utilise l'option innodb_file_per_table mais cela nécessite une sauvegarde, une suppression de la base de données et une restauration. L'aspect positif est que le fichier .ibd de la table est réduit après une suppression de la base de données. optimize table .

5 votes

Documentation de MySQL 5.5 sur l'état du mode fichier par table d'InnoDB "Pour tirer parti des fonctionnalités [InnoDB file-per-table] pour une table existante, vous pouvez activer le paramètre file-per-table et exécuter la commande suivante ALTER TABLE t ENGINE=INNODB sur la table existante". Cela implique que vous pourriez activer cette fonction, "convertir" les tables existantes pour utiliser un fichier InnoDB séparé avec la commande ALTER TABLE, puis OPTIMISER la table pour en réduire la taille. Cependant, une fois que vous avez terminé, vous devez trouver comment supprimer le (énorme) fichier InnoDB source...

17 votes

Je suppose que cela répond techniquement à la question, mais je pense que la majorité des personnes qui font des recherches sur ce sujet cherchent le processus réel pour réduire/récupérer l'espace, ce que cette réponse ne fournit pas.

0 votes

@Manachi Le processus est le suivant : "configurer le serveur pour utiliser innodb_file_per_table", "sauvegarder" le serveur, "abandonner la ou les bases de données", arrêter le mysql, supprimer .ibd, démarrer le serveur et restaurer la ou les bases de données. Avec MySQL 5.5+, vous pouvez utiliser ce que Josh a dit, et après avoir changé toutes les tables, arrêter le serveur, supprimer l'énorme .ibd et le redémarrer.

56voto

gilm Points 1208

J'ai eu le même problème.

Ce qui se passe, c'est que même si vous laissez tomber la base de données, innodb ne libère toujours pas d'espace disque. J'ai dû exporter, arrêter mysql, supprimer les fichiers manuellement, démarrer mysql, créer la base de données et les utilisateurs, puis importer. Dieu merci, je n'avais que 200 Mo de lignes, mais cela a épargné 250 Go de fichier innodb.

Échouer à dessein.

18 votes

Ouais, c'est définitivement un échec.

3 votes

MySql 5.5 a le même problème : J'ai exécuté "optimize table" pour réduire l'utilisation du disque d'une table de 28 Go. L'opération a probablement tenté de créer un clone optimisé de la table originale, ce qui a utilisé tout l'espace de la partition. Maintenant, l'opération "optimize table" a échoué et je n'ai plus d'espace sur la partition, même après avoir supprimé toute la base de données... très décevant.

4 votes

Et 4+ ans plus tard, j'ai rencontré le même problème avec MySQL. MS SQL est similaire : dba.stackexchange.com/questions/47310/

27voto

FlipMcF Points 3577

Si vous n'utilisez pas innodb_file_per_table La récupération de l'espace disque est possible, mais elle est assez fastidieuse et nécessite un temps d'arrêt important.

Le site Comment faire est assez approfondie - mais j'ai collé la partie pertinente ci-dessous.

Veillez également à conserver une copie de votre schéma dans votre dépôt.

Actuellement, vous ne pouvez pas supprimer un fichier de données du tablespace système. Pour diminuer la taille du tablespace système, utilisez cette procédure :

Utilisez mysqldump pour vider toutes vos tables InnoDB.

Arrêtez le serveur.

Supprimez tous les fichiers de tablespace existants, y compris les fichiers ibdata et ib_log. Si vous voulez garder une copie de sauvegarde de ces informations, alors copiez tous les fichiers ib* vers un autre emplacement avant de supprimer les fichiers de votre installation MySQL.

Supprimez tous les fichiers .frm pour les tables InnoDB.

Configurez un nouveau tablespace.

Redémarrez le serveur.

Importez les fichiers de vidage.

2 votes

Merci d'avoir inclus les étapes - à l'heure actuelle, le lien "comment faire" ne contient plus cette information.

24voto

Matheus Douglas Points 156

Dix ans plus tard, j'ai eu le même problème. Je l'ai résolu de la manière suivante :

  • J'ai optimisé toutes les bases de données restantes.
  • J'ai redémarré mon ordinateur et MySQL sur les services (Windows+r --> services.msc)

C'est tout :)

8 votes

Oui, il suffit de "OPTIMIZE TABLE tbl_name ;" et de redémarrer mysql.

0 votes

Je ne sais pas pourquoi cela n'est pas assez voté. Il est clair qu'elle devrait être la première réponse.

6voto

SuhasM Points 21

J'ai rencontré ce problème aujourd'hui (11 ans après que la question ait été posée à l'origine) et j'étais Je peux le réparer en supprimant la table et en la recréant. . Je n'ai pas eu à réinstaller la base de données, ni à la vider et à la restaurer, ni à modifier le stockage, ni à changer la table, etc. - rien de tout cela.

J'utilise InnoDB mais pas innodb_file_per_table donc même après avoir supprimé 900K lignes de la table, la taille de la BD n'a pas bougé. J'ai donc supprimé la table et l'ai recréée.

Dans mon cas, ma table a été nettoyée à zéro ligne, il était donc facile pour moi de supprimer la table, mais pour conserver la structure, j'ai exécuté

create table mynewtable as select * from myoldtable where 1=2;

Suivi par

drop table myoldtable;

La taille de ma base de données est ainsi passée de 5G à 400MB.

2 votes

Bienvenue à Stack Overflow. La nature des bases de données est que les données ne sont pas restituées au système en raison des enregistrements supprimés. D'après mes recherches, INNODB ne dispose pas d'une commande de récupération des ressources ou similaire, comme certaines bases de données. Dans votre cas, cependant, j'aurais été tenté d'essayer plutôt TRUNCATE TABLE myoldtable ; ... Je pense que cela aurait été une solution plus simple.

1 votes

Merci - j'avais oublié TRUNCATE. Je l'ai beaucoup utilisé dans Oracle mais je n'ai pas pensé à l'essayer ici. Je vais le classer pour référence future :)

1 votes

TRUNCATE TABLE ne libère pas non plus l'espace disque dans mon cas.

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