Voici pourquoi MySQL ne peut pas voir ces fichiers : Le tablespace du système (ibdata1) dispose d'un dictionnaire de données spécifique au moteur de stockage qui permet à InnoDB de déterminer l'utilisation potentielle des tables :
ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;
Le déplacement des tables InnoDB d'un endroit à un autre nécessite des commandes comme
ALTER TABLE mydb.tags DISCARD TABLESPACE;
Voici une partie de la Documentation MySQL 5.5 expliquant ce qui doit être pris en compte
Considérations de portabilité pour les fichiers .ibd
Vous ne pouvez pas déplacer librement les fichiers .ibd entre les répertoires de la base de données comme vous le pouvez avec les fichiers de table MyISAM. La définition de la table stockée dans le tablespace partagé InnoDB inclut le nom de la base de données. Les ID des transactions et les numéros de séquence des journaux stockés dans les fichiers du tablespace 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 dans l'installation MySQL d'où il provient comme suit :
La table ne doit pas avoir été supprimée ou tronquée depuis que vous avez copié le fichier .ibd, car cela modifie l'ID de table stocké dans le tablespace.
Émettez cette instruction ALTER TABLE pour supprimer le fichier .ibd actuel :
ALTER TABLE tbl_name DISCARD TABLESPACE ; Copiez le fichier .ibd de sauvegarde 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 tbl_name IMPORT TABLESPACE ; Dans ce contexte, une sauvegarde “propre” d'un fichier .ibd est une sauvegarde pour laquelle les conditions suivantes sont remplies :
Il n'y a pas de modifications non engagées par des transactions dans le fichier .ibd.
Il n'y a pas d'entrées de tampon d'insertion non fusionnées dans le fichier .ibd.
Purge a supprimé tous les enregistrements d'index marqués par une suppression dans le fichier .ibd.
mysqld a supprimé toutes les pages modifiées du fichier .ibd du pool de tampons et les a transférées dans le fichier.
Compte tenu de ces réserves et protocoles, voici une suggestion de marche à suivre
Pour cet exemple, essayons de restaurer la table tags
dans la base de données mydb
STEP #1
Assurez-vous d'avoir des sauvegardes de ces fichiers .frm
et .ibd
dans /tmp/innodb_data
STEP #2
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 le fichier tags.frm
STEP #3
Supprimez le fichier tags.ibd
vide en utilisant MySQL
cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd
STEP #4
Apportez la copie de sauvegarde du fichier tags.ibd
.
ALTER TABLE mydb.tags IMPORT TABLESPACE;
STEP #5
Ajoutez la table tags
au dictionnaire de données InnoDB
SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
STEP 6
Testez l'accessibilité de la table
Si vous obtenez des résultats normaux, Félicitations, vous importez une table InnoDB.
STEP 7
A l'avenir, veuillez ne pas supprimer ibdata1 et ses logs
Essayez-le ! !!
J'ai déjà discuté de ce genre de choses
CAVEAT
Que faire si vous ne connaissez pas la structure de la table tags
?
Il existe des outils pour obtenir l'instruction CREATE TABLE en utilisant simplement le fichier .frm
. J'ai également écrit un billet à ce sujet : Comment extraire le schéma de la table à partir du fichier .frm ? . Dans ce billet, j'ai copié un fichier .frm sur une machine Windows à partir d'une boîte Linux, j'ai lancé l'outil Windows et j'ai obtenu l'instruction CREATE TABLE
.