web-dev-qa-db-fra.com

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

J'ai une table MySQL utilisant le moteur de stockage InnoDB; il contient environ 2 millions de lignes de données. Lorsque j'ai supprimé des lignes de données de la table, l'espace disque alloué n'a pas été libéré. La taille du fichier ibdata1 n'a pas non plus été réduite après l'exécution du fichier optimize table commande.

Est-il possible de récupérer de l’espace disque de MySQL?

Je suis dans une mauvaise situation; cette application est exécutée dans environ 50 emplacements différents et maintenant, un problème d'espace disque insuffisant apparaît à presque tous.

126
Sumit Deo

MySQL ne réduit pas la taille de ibdata1. Déjà. Même si vous utilisez optimize table pour libérer l’espace utilisé des enregistrements supprimés, il sera réutilisé ultérieurement.

Une alternative consiste à configurer le serveur pour utiliser innodb_file_per_table , mais cela nécessitera une sauvegarde, une suppression de la base de données et une restauration. Le côté positif est que le fichier .ibd de la table est réduit après un optimize table.

130
Leonel Martins

Je viens d'avoir le même problème moi-même.

En réalité, même si vous supprimez la base de données, innodb ne libérera toujours pas d’espace disque. Je devais exporter, arrêter mysql, supprimer les fichiers manuellement, démarrer mysql, créer une base de données et des utilisateurs, puis importer. Dieu merci, je n'avais que 200 Mo de lignes, mais 250 Go de fichier innodb ont été épargnés.

Echec par conception.

35
gilm

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

Le Comment est assez détaillé - mais j'ai collé la partie pertinente ci-dessous.

Veillez également à conserver une copie de votre schéma dans votre vidage.

Actuellement, vous ne pouvez pas supprimer un fichier de données de l'espace de table du système. Pour réduire la taille de l'espace table, utilisez la procédure suivante:

Utilisez mysqldump pour vider toutes vos tables InnoDB.

Arrête le serveur.

Supprimez tous les fichiers d'espace de table existants, y compris les fichiers ibdata et ib_log. Si vous souhaitez conserver une copie de sauvegarde des informations, copiez tous les fichiers ib * à 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.

23
FlipMcF

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 restées.
  • J'ai redémarré mon ordinateur et MySQL sur les services (Windows + r -> services.msc)

C'est tout :)

1
Matheus Douglas

Vous pouvez également résoudre le problème de la récupération d’espace en créant plusieurs partitions dans une table - partitions basées sur la plage et la valeur, puis en supprimant/tronquant la partition pour récupérer l’espace, libérant ainsi l’espace utilisé par les données complètes stockées dans la partition.

Lorsque vous introduisez le partitionnement de votre table, des modifications sont nécessaires dans le schéma de table, telles que - Clés uniques, Index pour inclure la colonne de partition, etc.

1
Anand Immannavar