Bonjour,
Je me permets de solliciter votre aide face à un problème de récupération d'une base de données InnodB.
Voilà le contexte :
Un ami à moi faisait tourner sur un de ses vieux serveurs Linux Ubuntu un serveur MySQL. Puis il a utilisé ce dernier pour héberger la base de données de son CMS Drupal hébergé lui sur une autre machine.
Tout fonctionnait très bien.
Malheureusement, trop confiant, mon ami n'a jamais réalisé le moindre Dump ni la moindre sauvegarde de ses bases MySQL. Finalement, est arrivé ce qui devait arriver, son vieux serveur hébergeant son MySQL a craché...
Dans son malheur, il a eu de la chance, ce dernier était constitué de deux disques, un dédié au système, l'autre aux données, et c'est uniquement le disque système qui a lâché. Le disque avec les données qui contient son arborescence /var/lib/mysql complète est intacte, et nous avons pu en extraire sans difficulté le dossier /var/lib/mysql qui contient ses trois fichiers ibdata1, ib_logfile0 et ib_logfile1 ainsi que le dossier contenant tous ses fichiesr .frm et .ibd ainsi que le fichier db.opt.
Bref, je me suis dit, cela ne devrait pas être bien compliqué à récupérer...
J'ai tout essayé, sur le net, on trouve tout et son contraire, mais quoi que je fasse, j'obtiens systématiquement l'erreur : #1146 table doesn't exist dés que je tente d'agir sur une des tables de la base restaurée.
Comment j'ai procédé :
J'ai créé une machine virtuelle sous Ubuntu 14.04 en mode LAMP. Puis, après m'être assuré de mes accès et des fonctionnalités du duo mysql-phpmyadmin j'ai ouvert un shell sur la machine virtuelle. Je me suis déplacé dans le dossier /var/lib/mysql, puis j'ai stoppé MySQL ("service mysql stop"). Ensuite, j'ai mis de côté les trois fichiers ibdata1, ib_logfile0 et ib_logfile1 présents sur une installation fraîche vierge de toute base ajoutée. J'ai copié à leur place, les trois fichierrs récupérés, et j'ai pris soin de définir les attributs des fichiers (rw-rw----, mysql, mysql). Ensuite, (j'avais la base vide avec phpmyadmin juste avant d'arrêter mysql) je suis entré dans le dossier de la base à restaurer, puis j'y ai copié tous les fichiers .frm, .ibd et le fichier db.opt. Là aussi j'ai pris soin de redéfinir correctement les attributs des fichiers. Pour finir, j'ai démarré le serveur mysql. Ce dernier a démarré sans problème. Je me suis rendu sur phpmyadmin, et là, bingo, je vois ma base de données restaurée, et lorsque je déploie cette dernière, je vois toutes ses tables. Seulement voilà, dés que je veux voir une table, sa structure ou son contenu, j'obtiens ce message d'erreur, #1146 table doesn't exist....
J'ai alors pris mon courage à deux mains et j'ai fouillé sur le net concernant ce code erreur. Impossible de comprendre ce qu'il signifie exactement. De toute évidence, il manque quelque part des données, mais ce n'est pas dans les tables de phpmyadmin, en effet, j'ai le même résultat en locale dans le client mysql. Au passage j'ai essayé tous les outils CHECK TABLE, REPAIR TABLE, etc, pour n'avoir pour seul résultat ce code erreur....
J'ai alors fait un dernier test. Sur un autre serveur MySQL, strictement identique en terme de version que celui de la machine virtuelle utilisée ici, j'ai créé une base bidon avec une seule table de deux colonnes et un seule enregistrement contenu.
Et j'ai essayé de "restaurer" les fichiers de cette base dans l'autre serveur. C'est tout simplement impossible.....
Ce que je remarque au final, c'est que quel que soient les fichiers ibdata1 et ib_logfile en place, le résultat est le même. Si on conserve les fichiers d'origine, en se contentant d'intégrer les .frm, .ibd et .opt, même résultat. La base est visible, les tables s'affichent, mais aucune n'est accessible avec toujours le même code erreur.
Existe t-'il un moyen de restaurer une base de données MySQL InnoDB à partir des fichiers d'une base ?
Et si oui, comment ?
Partager