Comment récupérer une base de données MySQL à partir de fichiers .myd, .myi, .frm

183

Comment restaurer une de mes bases de données MySQL à partir .myd, .myi, les .frmfichiers?

Chandrajeet
la source
10
Bien que j'aie répondu à cela, il appartient vraiment à Serverfault.
derobert
31
@chandrajeet vous devriez vraiment accepter la réponse la plus votée.
Tour
2
Hé chandrajeet, pourquoi n'accepte-tu pas la réponse de derobert? Je confirme que cela fonctionne aussi pour moi. N'est-ce pas pour vous? stackoverflow.com/help/someone-answers
Taz

Réponses:

173

S'il s'agit de tables MyISAM, le fait de placer les fichiers .FRM, .MYD et .MYI dans un répertoire de base de données (par exemple /var/lib/mysql/dbname) rendra cette table disponible. Il n'est pas nécessaire qu'il s'agisse de la même base de données dont ils proviennent, du même serveur, de la même version de MySQL ou de la même architecture. Vous devrez peut-être également modifier la propriété du dossier (par exemple,chown -R mysql:mysql /var/lib/mysql/dbname )

Notez que les autorisations ( GRANT, etc.) font partie de la mysqlbase de données. Donc, ils ne seront pas restaurés avec les tables; vous devrez peut-être exécuter les GRANTinstructions appropriées pour créer des utilisateurs, donner accès, etc. (La restauration de la mysqlbase de données est possible, mais vous devez être prudent avec les versions de MySQL et toutes les exécutions nécessaires de l' mysql_upgradeutilitaire.)

En fait, vous n'avez probablement besoin que du .FRM (structure de table) et .MYD (données de table), mais vous devrez réparer la table pour reconstruire le .MYI (index).

La seule contrainte est que si vous rétrogradez, vous feriez mieux de vérifier les notes de publication (et probablement d'exécuter la table de réparation). Les nouvelles versions de MySQL ajoutent des fonctionnalités, bien sûr.

[Bien que cela devrait être évident, si vous mélangez et associez des tables, l'intégrité des relations entre ces tables est votre problème; MySQL ne s'en souciera pas, mais votre application et vos utilisateurs le peuvent. De plus, cette méthode ne fonctionne pas du tout pour les tables InnoDB. Seulement MyISAM, mais compte tenu des fichiers que vous avez, vous avez MyISAM]

derobert
la source
Cela fonctionnerait-il vraiment sans ajouter les entrées appropriées à la table information_schema? Je veux dire que MySQL a besoin de savoir pour rechercher ces fichiers, n'est-ce pas?
Zenshai
4
Les tables information_schema n'existent pas réellement, ce sont uniquement des vues de l'état de la base de données interne. Voir dev.mysql.com/doc/refman/5.0/en/information-schema.html
brian-brazil
4
Wow, je me sentais sale, mais déposer le répertoire entier de ce que je pense être une installation de MySQL4 dans mon MySQL5.1 a simplement recréé les tables par magie. Pas de redémarrage ou quoi que ce soit (sous Windows).
Dave
4
Cela fonctionne, il vous suffit de vous rappeler d'exécuter (pour chaque table): check table sometable; puis d'exécuter la réparation (uniquement si nécessaire): repair table sometable;
Nux
3
Cela a très bien fonctionné! J'avais mis les fichiers en place, mais mysql ne les "voyait" pas jusqu'à ce que je change de propriétaire en "mysql: mysql".
sean.boyer
26

Notez que si vous souhaitez reconstruire le fichier MYI, l'utilisation correcte de REPAIR TABLE est:

REPAIR TABLE parfois USE_FRM;

Sinon, vous obtiendrez probablement une autre erreur.

mcardellg
la source
24

Je viens de découvrir une solution pour cela. J'utilise MySQL 5.1 ou 5.6 sur Windows 7.

  1. Copiez le fichier .frm et ibdata1 de l'ancien fichier qui se trouvait sur "C: \ Program Data \ MySQL \ MSQLServer5.1 \ Data"
  2. Arrêtez l'instance de serveur SQL dans l'instance SQL actuelle
  3. Accédez au dossier de données situé dans "C: \ Program Data \ MySQL \ MSQLServer5.1 \ Data"
  4. Collez l' ibdata1 et le dossier de votre base de données qui contient le fichier .frm du fichier que vous souhaitez récupérer.
  5. Démarrez l'instance MySQL.

Pas besoin de localiser les fichiers .MYI et .MYD pour cette récupération.

alnel
la source
Suivez ces étapes (après l'échec de tout le reste) et utilisez le innodb_force_recovery = 4niveau (pas sûr que ce soit nécessaire dans ce cas). Dieu merci!
Joshua Stewardson
6
FYI: ibdata1est InnoDB, pas MyISAM.
derobert
14

Une chose à noter:

Le fichier .FRM contient votre structure de table et est spécifique à votre version MySQL.

Le fichier .MYD n'est PAS spécifique à la version, du moins pas aux versions mineures.

Le fichier .MYI est spécifique, mais peut être laissé de côté et régénéré REPAIR TABLEcomme le disent les autres réponses.

Le but de cette réponse est de vous faire savoir que si vous avez un vidage de schéma de vos tables, vous pouvez l'utiliser pour générer la structure de la table, puis remplacer ces fichiers .MYD par vos sauvegardes, supprimer les fichiers MYI et les réparer tout. De cette façon, vous pouvez restaurer vos sauvegardes vers une autre version de MySQL ou déplacer complètement votre base de données sans utiliser mysqldump. J'ai trouvé cela très utile lors du déplacement de grandes bases de données.

Brent
la source
14

Facile! Créer une base de données factice (disons abc)

Copiez tous ces fichiers .myd, .myi, .frm dans mysql \ data \ abc où mysql \ data \ est l'endroit où sont stockés .myd, .myi, .frm pour toutes les bases de données.

Ensuite, allez dans phpMyadmin, allez dans db abc et vous trouvez votre base de données.

Vishal
la source
la réponse la plus courte et précise
Serak Shiferaw
La meilleure façon de récupérer les données ... J'ai installé WAMP, puis créé une nouvelle base de données, copié les fichiers dans le nouveau répertoire de base de données C: \ WAMP64 \ bin \ mysql \ mysqlxx \ data \ newdatabase open phpmyadmin et votre nouvelle base de données, vous voir les données
Alexandre georges
7

Je pense que .myi vous pouvez réparer à l'intérieur de mysql.

Si vous voyez ces types de messages d'erreur de MySQL: La base de données n'a pas pu exécuter la requête (requête) 1016: Impossible d'ouvrir le fichier: 'quelque chose.MYI'. (numéro d'erreur: 145) Message d'erreur: 1034: fichier de clé incorrect pour la table: «quelque chose». Essayez de le réparer alorsb vous avez probablement une table endommagée ou endommagée.

Vous pouvez vérifier et réparer la table à partir d'une invite mysql comme ceci:

check table sometable;
+------------------+-------+----------+----------------------------+
| Table | Op | Msg_type | Msg_text | 
+------------------+-------+----------+----------------------------+ 
| yourdb.sometable | check | warning | Table is marked as crashed | 
| yourdb.sometable | check | status | OK | 
+------------------+-------+----------+----------------------------+ 

repair table sometable;
+------------------+--------+----------+----------+ 
| Table | Op | Msg_type | Msg_text | 
+------------------+--------+----------+----------+ 
| yourdb.sometable | repair | status | OK | 
+------------------+--------+----------+----------+

et maintenant votre table devrait aller bien:

check table sometable;
+------------------+-------+----------+----------+ 
| Table | Op | Msg_type | Msg_text |
+------------------+-------+----------+----------+ 
| yourdb.sometable | check | status | OK |
+------------------+-------+----------+----------+
Elzo Valugi
la source
6

J'ai trouvé une solution pour convertir les fichiers en .sqlfichier (vous pouvez ensuite importer le .sqlfichier sur un serveur et récupérer la base de données), sans avoir besoin d'accéder au /varrépertoire, vous n'avez donc pas besoin d'être un administrateur de serveur pour le faire non plus.

Il nécessite l'installation de XAMPP ou MAMP sur votre ordinateur.

  • Après avoir installé XAMPP, accédez au répertoire d'installation (généralement C:\XAMPP) et au sous-répertoire mysql\data. Le chemin complet devrait êtreC:\XAMPP\mysql\data
  • À l'intérieur, vous verrez des dossiers de toutes les autres bases de données que vous avez créées. Copiez et collez le dossier plein de .myd, .myiet les .frmfichiers là-dedans. Le chemin d'accès à ce dossier doit être

    C:\XAMPP\mysql\data\foldername\.mydfiles

  • Puis visitez localhost/phpmyadmindans un navigateur. Sélectionnez la base de données que vous venez de coller dans le mysql\datadossier et cliquez sur Exporter dans la barre de navigation. Choisit l'exporter sous forme de .sqlfichier. Il apparaîtra alors demandant où enregistrer le fichier

Et c'est tout! Vous (devriez) maintenant avoir un .sqlfichier contenant la base de données qui était à l'origine .myd, .myiet les .frmfichiers. Vous pouvez ensuite l'importer sur un autre serveur via phpMyAdmin en créant une nouvelle base de données et en appuyant sur 'Importer' dans la barre de navigation, puis en suivant les étapes pour l'importer

Kaspar Lee
la source
5

Vous pouvez copier les fichiers dans un répertoire de sous-répertoire nommé de manière appropriée du dossier de données tant qu'il s'agit de la même version EXACTE de mySQL et que vous avez conservé tous les fichiers associés dans ce répertoire. Si vous n'avez pas tous les fichiers, je suis sûr que vous allez avoir des problèmes.

cgp
la source
Si je n'ai pas la même version EXACTE de MySQL, que dois-je faire?
Jo Sprague
2

La description ci-dessus n'était pas suffisante pour que les choses fonctionnent pour moi (probablement dense ou paresseux), j'ai donc créé ce script une fois que j'ai trouvé la réponse pour m'aider à l'avenir. J'espère que ça aide les autres

vim fixperms.sh 

#!/bin/sh
for D in `find . -type d`
do
        echo $D;
        chown -R mysql:mysql $D;
        chmod -R 660 $D;
        chown mysql:mysql $D;
        chmod 700 $D;
done
echo Dont forget to restart mysql: /etc/init.d/mysqld restart;
dny238
la source
-2

Pour ceux qui ont Windows XP et MySQL Server 5.5 installé - l'emplacement de la base de données est C: \ Documents and Settings \ All Users \ Application Data \ MySQL \ MySQL Server 5.5 \ data, sauf si vous avez changé l'emplacement dans l'installation de MySql Workbench GUI.

Démon
la source
3
La question est de récupérer à partir de types de fichiers spécifiques, et non de savoir où ces fichiers peuvent être trouvés sur Windows XP MySQL 5.5.
Danpe