J'ai une table MySQL utilisant le moteur de stockage InnoDB; il contient environ 2M 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 été réduite après l'exécution de la optimize table
commande.
Existe-t-il un moyen de récupérer de l'espace disque sur MySQL?
Je suis dans une mauvaise situation; cette application s'exécute dans environ 50 emplacements différents et maintenant un problème d'espace disque faible apparaît dans presque tous.
mysql
innodb
delete-row
Sumit Deo
la source
la source
innodb_file_per_table
est désactivé. La bonne nouvelle est que cette option eston
par défaut dans les versions récentes de MySQL.Réponses:
MySQL ne réduit pas la taille d'ibdata1. Déjà. Même si vous utilisez
optimize table
pour libérer l'espace utilisé des enregistrements supprimés, il le réutilisera plus tard.Une alternative consiste à configurer le serveur à 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 unoptimize table
.la source
ALTER TABLE t ENGINE=INNODB
sur la table existante. " Cela implique que vous pouvez activer cette fonctionnalité, "convertir" les tables existantes pour utiliser un fichier InnoDB séparé avec la commande ALTER TABLE, puis OPTIMISER la table pour réduire sa taille. Cependant, une fois que vous avez terminé, vous devrez trouver comment supprimer le (énorme) fichier source InnoDB ...J'ai juste eu le même problème moi-même.
Ce qui se passe, c'est que même si vous supprimez 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 une base de données et des utilisateurs, puis importer. Dieu merci, je n'avais que 200 Mo de lignes, mais cela a épargné 250 Go de fichier innodb.
Échouer par conception.
la source
Si vous n'utilisez pas innodb_file_per_table , la récupération de l'espace disque est possible, mais assez 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.
Assurez-vous de conserver également une copie de votre schéma dans votre vidage.
la source
Dix ans plus tard, j'ai eu le même problème. Je l'ai résolu de la manière suivante:
C'est tout :)
la source
Une autre façon de résoudre le problème de la récupération d'espace est de créer plusieurs partitions dans la table - Partitions basées sur une plage, basées sur des valeurs et de simplement supprimer / tronquer la partition pour récupérer l'espace, ce qui libérera l'espace utilisé par toutes les 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 de votre table comme - Clés uniques, index pour inclure la colonne de partition, etc.
la source
Il y a un an, j'ai également rencontré le même problème sur la version mysql5.7 et ibdata1 occupait 150 Go. alors j'ai ajouté des tablespaces d'annulation
Prendre la sauvegarde Mysqldump
Arrêter le service mysql
Supprimer toutes les données du répertoire de données
Ajouter ci-dessous annuler le paramètre de tablespace dans my.cnf actuel
Démarrer la
sauvegarde de mysqldump du magasin de services mysql
Problème résolu !!
la source
Il existe plusieurs façons de récupérer de l'espace disque après la suppression des données de la table pour le moteur MySQL Inodb
Si vous n'utilisez pas innodb_file_per_table depuis 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 le seul moyen (vérifiez les réponses de FlipMcF ci-dessus)
Si vous utilisez innodb_file_per_table, vous pouvez essayer
la source