J'ai un MySQL InnoDB qui contient tous les fichiers de table de base de données, mais MySQL ne les voit pas et ne les charge pas.
Le problème est dû au fait que j'ai supprimé ces trois fichiers: ibdata1
, ib_logfile0
et ib_logfile1
.
parce que j’avais des problèmes avec le démarrage de mysql, et ce que j’ai lu, c’est de les supprimer parce que MySQL va simplement les régénérer (je sais que j’aurais dû les sauvegarder, mais je ne les ai pas).
Que puis-je faire pour que MySQL revienne sur les tables?
about_member.frm site_stories.frm
about_member.ibd site_stories.ibd
db.opt stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd story_comments.frm
FTS_00000000000000bb_CONFIG.ibd story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd story_likes.frm
FTS_00000000000000bb_DELETED.ibd story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd story_views.ibd
FTS_00000000000000f5_DELETED.ibd story_view_totals.frm
member_favorites.frm story_view_totals.ibd
member_favorites.ibd tags.frm
members.frm tags.ibd
members.ibd
Voici pourquoi MySQL ne peut pas voir ces fichiers: Le tablespace système (ibdata1) possède un dictionnaire de données spécifique à Storage-Engine qui permet à InnoDB de cartographier les utilisations potentielles des tables:
Déplacer les tables InnoDB d’un endroit à un autre nécessite des commandes telles que
ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;
Voici une partie de la Documentation MySQL 5.5 expliquant ce qui doit être considéré
Considérations de portabilité pour les fichiers .ibd
Vous ne pouvez pas déplacer librement des fichiers .ibd entre des répertoires de base de données, contrairement aux fichiers de table MyISAM. La définition de table stockée dans l'espace de table partagé InnoDB inclut le nom de la base de données. Les ID de transaction et les numéros de séquence de journal stockés dans les fichiers d'espace de table diffèrent également d'une base de données à l'autre.
Pour déplacer un fichier .ibd et la table associée d'une base de données à une autre, utilisez une instruction RENAME TABLE:
RENAME TABLE db1.tbl_name TO db2.tbl_name; Si vous avez une sauvegarde «propre» d'un fichier .ibd, vous pouvez le restaurer sur l'installation MySQL d'où il provient:
La table ne doit pas avoir été supprimée ou tronquée depuis la copie du fichier .ibd, car cela modifie l'ID de la table stocké dans l'espace de table.
Émettez cette instruction ALTER TABLE pour supprimer le fichier .ibd actuel:
ALTER TABLE nom_table DISCARD TABLESPACE; Copiez le fichier de sauvegarde .ibd dans le répertoire de base de données approprié.
Émettez cette instruction ALTER TABLE pour indiquer à InnoDB d'utiliser le nouveau fichier .ibd pour la table:
ALTER TABLE nom_table IMPORT TABLESPACE; Dans ce contexte, une sauvegarde de fichier .ibd «propre» est une sauvegarde pour laquelle les conditions suivantes sont remplies:
Il n'y a aucune modification non validée par transaction dans le fichier .ibd.
Il n'y a pas d'entrées de tampon d'insertion non fusionnées dans le fichier .ibd.
Purger a supprimé tous les enregistrements d'index marqués par suppression du fichier .ibd.
mysqld a vidé toutes les pages modifiées du fichier .ibd du pool de mémoire tampon vers le fichier.
Compte tenu de ces mises en garde et protocoles, voici un plan d'action suggéré
Pour cet exemple, essayons de restaurer la table tags
dans la base de données mydb
Assurez-vous que vous avez des sauvegardes de ces fichiers .frm
et .ibd
dans /tmp/innodb_data
Obtenez l'instruction CREATE TABLE tags
et exécutez-la en tant que CREATE TABLE mydb.tags ...
. Assurez-vous qu'il s'agit exactement de la même structure que l'original tags.frm
Supprimez le tags.ibd
vide avec MySQL
ALTER TABLE mydb.tags DISCARD TABLESPACE;
Apportez la copie de sauvegarde de tags.ibd
cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd
Ajouter la table tags
au dictionnaire de données InnoDB
ALTER TABLE mydb.tags IMPORT TABLESPACE;
Testez l'accessibilité de la table
SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
Si vous obtenez des résultats normaux, nous vous félicitons d’importer une table InnoDB.
A l'avenir, veuillez ne pas supprimer ibdata1 et ses journaux.
J'ai discuté de choses comme ça avant
Apr 23, 2012
: MySQL: comment restaurer une table stockée dans un fichier .frm et un fichier .ibd?Sep 28, 2011
: Comment récupérer une table InnoDB dont les fichiers ont été déplacésQue faire si vous ne connaissez pas la structure de la table de la variable tags
?
Il existe des outils pour obtenir l’instruction CREATE TABLE en utilisant simplement le fichier .frm
. J'ai également écrit un article à ce sujet: Comment extraire le schéma de table à partir du fichier .frm? . Dans cet article, j'ai copié un fichier .frm sur une machine Windows à partir d'une machine Linux, ai exécuté l'outil Windows et obtenu l'instruction CREATE TABLE
.
J'ai la même situation, ne peut pas laisser tomber ou créer un nom de tbl spécifique. Ma procédure de réparation est la suivante:
Arrêtez MySQL.
service mysql stop
Supprimez ib_logfile0 et ib_logfile1.
cd /var/lib/mysql;
rm ib_logfile0 ib_logfile1
Supprimer les fichiers tblname. ATTENTION: CELA SUPPRIMERA VOS DONNEES
cd /var/lib/mysql/dbname;
rm tblname*
Démarrez MySQL.
service mysql start