Qu'est-ce que le fichier ibdata1 dans mon répertoire / var / lib / mysql?


32

En me connectant à mon panneau de configuration Webmin, j'ai remarqué que pratiquement tout mon espace disque était plein. J'ai recherché les dix plus gros fichiers / répertoires de mon système et j'ai constaté qu'un fichier appelé ibdata1 occupe environ 94 Go d'espace. Il réside dans mon répertoire / var / lib / mysql.

Que fait ibdata1? Suis-je sûr de le retirer? Mon hypothèse est que c'est un dépotoir d'une certaine sorte, mais c'est juste une supposition sauvage.

Réponses:


38

Le fichier ibdata1est l'espace disque logique système de l'infrastructure InnoDB.

Il contient plusieurs classes d'informations vitales pour InnoDB

  • Pages de données de table
  • Pages d'index de table
  • Dictionnaire de données
  • Données de contrôle MVCC
    • Annuler l'espace
    • Segments de restauration
  • Double tampon d'écriture (pages écrites en arrière-plan pour éviter la mise en cache du système d'exploitation)
  • Insérer un tampon (modifications apportées aux index secondaires)

Veuillez noter la place d'ibdata1 dans l'univers InnoDB (sur le côté droit)

Architecture InnoDB

Vous pouvez séparer les pages de données et d'index ibdata1en activant innodb_file_per_table . Cela entraînera toute table InnoDB nouvellement créée à stocker des données et des pages d'index dans un .ibdfichier externe .

Exemple

  • datadir est / var / lib / mysql
  • CREATE TABLE mydb.mytable (...) ENGINE=InnoDB;, crée /var/lib/mysql/mydb/mytable.frm
    • innodb_file_per_table activé, pages de données / index stockées dans /var/lib/mysql/mydb/mytable.ibd
    • innodb_file_per_table désactivé, pages de données / index stockées dans ibdata1

Peu importe où la table InnoDB est stockée, la fonctionnalité d'InnoDB nécessite la recherche de métadonnées de table et le stockage et la récupération des informations MVCC pour prendre en charge la conformité ACID et l' isolement des transactions .

Voici mes articles précédents sur la séparation des données de table et des index d'ibdata1

QUE FAIRE ENSUITE

Vous pouvez continuer à avoir tout stocké dans ibdata1, mais cela fait de la réalisation d'instantanés LVM une véritable corvée (mon opinion personnelle).

Vous devez utiliser la publication My StackOverflow et réduire ce fichier de manière permanente.

Veuillez exécuter cette requête:

SELECT 
    ((POWER(1024,3)*94 - InnoDBDiskDataAndIndexes))/POWER(1024,3) SpaceToReclaim
FROM
(SELECT SUM(data_length+index_length) InnoDBDiskDataAndIndexes
FROM information_schema.tables WHERE engine='InnoDB') A;

Cela indiquera combien d'espace gaspillé peut être récupéré après l'application du nettoyage InnoDB.


Merci pour votre contribution. Depuis, mon quota de disque est complètement rempli - avant de suivre les conseils de vos messages, aurai-je besoin d'espace libre? Je note que votre message d'origine sur SO mentionne la possibilité de faire un vidage SQL, mais cela créerait vraisemblablement un fichier de ~ 90 Go avec nulle part où aller.
James

mysqldump ne fera que la représentation logique des pages de données, pas les index. Vous aurez besoin d'un autre montage de disque, peut-être un serveur distant, pour vider les données.
RolandoMySQLDBA

9
Il renvoie 91.25350952148438 pour moi en tant que SpaceToReclaim. Est-ce en mégaoctets? pour cent? octets?
Isaac

Je sais que c'est trop vieux. Mais pour tous ceux qui viennent ici avec le problème, vous devez remplacer le nombre 94par la taille de votre ibdata1fichier en Go et SpaceToReclaimvous donnera la taille en Go.
anupsabraham


2

Si vous utilisez innodb comme moteur MySQL par défaut stockera toutes vos bases de données dans ibdata1. Il existe également des fichiers journaux ib_logfile0 et ib_logfile1. Ne supprimez pas ces fichiers.


Qu'est-ce que supprimer ce fichier sur mon serveur?
Frank
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.