Maison >base de données >tutoriel mysql >Pourquoi MySQL InnoDB ne libère-t-il pas d'espace disque après la suppression des données et comment puis-je le récupérer ?

Pourquoi MySQL InnoDB ne libère-t-il pas d'espace disque après la suppression des données et comment puis-je le récupérer ?

DDD
DDDoriginal
2024-12-04 22:21:11602parcourir

Why Doesn't MySQL InnoDB Release Disk Space After Data Deletion, and How Can I Reclaim It?

Libération d'espace disque insuffisante après la suppression des données MySQL InnoDB

Le moteur de stockage InnoDB de MySQL est connu pour ne pas libérer automatiquement l'espace disque alloué lorsque les lignes de données sont supprimé d'un tableau. Ce comportement est dû à la nature du modèle de stockage basé sur les lignes d'InnoDB. Lorsqu'une ligne est supprimée, l'espace qu'elle occupait n'est pas immédiatement libéré mais marqué comme disponible pour être réutilisé par de futures insertions ou extensions de table.

Par conséquent, même après avoir supprimé des lignes de données et exécuté des commandes d'optimisation comme OPTIMIZE TABLE, la taille du fichier d'espace de table partagé d'InnoDB, généralement nommé ibdata1, peut rester le même. Cela peut entraîner des problèmes d'espace disque faible, en particulier dans les environnements comportant de nombreuses tables et des opérations de suppression de données fréquentes.

Pour résoudre ce problème, les utilisateurs disposent de deux options principales :

  1. Utiliser des espaces de table par table : En définissant l'option de configuration innodb_file_per_table sur ON, InnoDB créera des fichiers d'espace de table individuels pour chaque table. Lorsqu'une table est optimisée, la taille de son fichier d'espace de table individuel sera réduite pour refléter l'espace libéré après la suppression des données. Cependant, cette solution nécessite la création d'une nouvelle base de données et la restauration des données à partir d'une sauvegarde, ce qui peut prendre du temps.
  2. Réduire le fichier de base de données : Si l'utilisation d'espaces de table par table n'est pas faisable, une méthode alternative consiste à réduire le fichier ibdata1. Ceci peut être réalisé en suivant une série d'étapes :
  • Arrêtez le serveur MySQL.
  • Sauvegardez la base de données à l'aide d'un outil tel que mysqldump.
  • Modifier la variable innodb_data_file_path dans le fichier de configuration MySQL (my.cnf) pour pointer vers une nouvelle taille de fichier plus petite. Par exemple :
innodb_data_file_path = ibdata1:10M # shrink to 10 MB
  • Démarrez le serveur MySQL.
  • Restaurez la base de données à partir de la sauvegarde créée précédemment.

Ce processus va créez un nouveau fichier ibdata1 avec la taille réduite spécifiée, tout en préservant les données de la base de données d'origine. Gardez à l'esprit que cette méthode peut nécessiter de l'espace disque supplémentaire pendant le processus de restauration.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn