J'ai la réponse complète pour celui-ci.
Une fois que innodb_file_per_table est mis en place, les nouvelles tables InnoDB peuvent être réduites à l’aide de: ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
Ceci réduira les nouveaux .ibd
fichiers GARANTIS.
Si vous utilisez ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
une table InnoDB créée avant d'utiliser innodb_file_per_table, les données et index de cette table seront extraits du fichier ibdata1 et stockés dans un .ibd
fichier, ce qui laissera un pigeon permanent dans ibdata1 qui ne pourra jamais être réutilisé. .
Le ibdata1
fichier contient normalement quatre types d'informations
- Données de table
- Index de table
- Données
MVCC (Multiversioning Concurrency Control)
- Segments de restauration
- Annuler l'espace
- Métadonnées de table (dictionnaire de données)
- Double Write Buffer (écriture en arrière-plan pour éviter de dépendre de la mise en cache du système d'exploitation)
- Insert Buffer (gestion des modifications apportées aux index secondaires non uniques)
- Voir le
Pictorial Representation of ibdata1
Voici le moyen le plus sûr de réduire le fichier ibdata1 pour toujours ...
ÉTAPE 01) MySQLDump toutes les bases de données dans un fichier texte SQL (appelez-le SQLData.sql)
ÉTAPE 02) Supprimez toutes les bases de données (sauf les schémas mysql, information_schema et performance_schema)
ÉTAPE 03) Arrêter mysql
ÉTAPE 04) Ajoutez les lignes suivantes à /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend
Note: Quel que soit votre choix pour innodb_buffer_pool_size, assurez-vous que innodb_log_file_size correspond à 25% de innodb_buffer_pool_size.
- ÉTAPE 05) Supprimez ibdata1, ib_logfile0 et ib_logfile1 ( voir la mise à jour ci-dessous avant de supprimer! )
À ce stade, il ne devrait y avoir que le schéma mysql dans / var / lib / mysql
- ÉTAPE 06) Redémarrez mysql
Cela recréera ibdata1 à 10 Mo (ne configurez pas l'option), ib_logfile0 et ib_logfile1 à 1G chacun
- ÉTAPE 07) Recharger SQLData.sql dans mysql
ibdata1
croîtra mais ne contiendra que des métadonnées de table et des données MVCC intermittentes.
Chaque table InnoDB existera en dehors de ibdata1
Supposons que vous ayez une table InnoDB nommée mydb.mytable. Si vous allez dans /var/lib/mysql/mydb
, vous verrez deux fichiers représentant la table
mytable.frm
(En-tête de moteur de stockage)
mytable.ibd
(Home of Table Data et Index de table pour mydb.mytable
)
ibdata1
ne contiendra plus jamais de données InnoDB et d’index.
Avec l' option innodb_file_per_table dans /etc/my.cnf
, vous pouvez exécuter OPTIMIZE TABLE mydb.mytable
OR ALTER TABLE mydb.mytable ENGINE=InnoDB;
et le fichier /var/lib/mysql/mydb/mytable.ibd
sera réduit.
J'ai fait cela à plusieurs reprises dans ma carrière en tant que DBA MySQL sans aucun problème par la suite. En fait, la première fois que j'ai fait cela, j'ai réduit un fichier ibdata1 de 50 Go à 50 Mo.
Essaie. Si vous avez d'autres questions à ce sujet, écrivez-moi. Croyez-moi. Cela fonctionnera à court terme et à long terme.
MISE À JOUR 2013-07-02 15:08 EDT
Il y a une mise en garde à cet égard que j'ai mise à jour dans d'autres de mes publications mais que j'ai ratée: je mets à jour ma réponse un peu plus avec innodb_fast_shutdown car j'avais l'habitude de redémarrer mysql et d'arrêter mysql pour le faire. Désormais, cette étape est essentielle car chaque transaction non validée peut comporter d’autres éléments mobiles à l’intérieur et à l’extérieur des journaux de transactions InnoDB ( voir Infrastructure InnoDB ).
Veuillez noter que définir innodb_fast_shutdown sur 2 effacerait également les journaux, mais qu'il resterait encore des pièces mobiles et qu'il serait sélectionné lors de la récupération après un crash au démarrage de mysqld. La valeur 0 est la meilleure.