Restauration de la base de données MySQL à partir de fichiers physiques

140

Est-il possible de restaurer une base de données MySQL à partir des fichiers de base de données physiques. J'ai un répertoire qui contient les types de fichiers suivants:

client.frm
client.MYD
client.MYI

mais pour environ 20 autres tables.

J'utilise généralement mysqldump ou un outil similaire pour tout obtenir dans un fichier SQL, alors quelle est la manière de traiter ces types de fichiers?

Abdullah Jibaly
la source
J'ai le même problème: plusieurs fichiers avec les extensions FRM, MYD et MYI. J'ai aussi des fichiers ib_logfile0, ib_logfile1 et ibdata1. Je ne peux pas accéder à un serveur en cours d'exécution ou créer un vidage. J'ai essayé d'exécuter un nouveau serveur MySQL et d'utiliser les fichiers, mais je n'ai pas réussi ... Quelqu'un a-t-il une procédure claire?
flo5783

Réponses:

132

Une table MySQL MyISAM est la combinaison de trois fichiers:

  • Le fichier FRM est la définition de table.
  • Le fichier MYD est l'endroit où les données réelles sont stockées.
  • Le fichier MYI est l'endroit où les index créés sur la table sont stockés.

Vous devriez pouvoir les restaurer en les copiant dans votre dossier de base de données (sous Linux, l'emplacement par défaut est /var/lib/mysql/)

Vous devez le faire lorsque le serveur n'est pas en cours d'exécution.

Vincent
la source
64
cela n'est vrai que pour les tables MyISAM. InnoDB stocke ses tables et ses index dans un seul tablespace *, qui se compose par défaut des 3 fichiers ibdata1, ib_logfile0 et ib_logfile1. pour restaurer une base de données, vous auriez également besoin de ces fichiers. * Les tablespaces par table sont possibles, mais pas par défaut
ax.
21
Il dit qu'il a des fichiers .frm .myi et .myd. J'ai alors supposé qu'il s'agissait de tables MyISAM.
Vincent
5
Réponse précieuse, mais je devais aller plus loin pour que les choses fonctionnent correctement: comme je devais me connecter en tant que root pour restaurer les fichiers, l' mysqlutilisateur exécutant le mysqldprocessus ne pouvait pas y accéder. Faire un chmod -R mysql:mysql .sur le répertoire de données mysql est rapide et facile, mais comprendre, avant cela, pourquoi toutes mes bases de données resoterd semblaient ne pas avoir de tables prenait un peu plus de temps.
Edurne Pascual
10
herenvardo Je pense que vous vouliez dire chown pas chmod
Oliver M Grech
2
Pour récapituler certaines des notes importantes, vous devrez peut-être chownles fichiers copiés comme sudo chown -R mysql:mysql /var/lib/mysql
suit
50

D'après la réponse de @Vicent, je restaure déjà la base de données MySQL comme ci-dessous:

Étape 1. Arrêtez le serveur Mysql

Étape 2. Copiez la base de données dans votre dossier de base de données (sous Linux, l'emplacement par défaut est / var / lib / mysql). Gardez le même nom de la base de données, et le même nom de la base de données en mode mysql.

sudo cp -rf   /mnt/ubuntu_426/var/lib/mysql/database1 /var/lib/mysql/

Étape 3: Changer de propre et changer de mode le dossier:

sudo chown -R mysql:mysql /var/lib/mysql/database1
sudo chmod -R 660 /var/lib/mysql/database1
sudo chown  mysql:mysql /var/lib/mysql/database1 
sudo chmod 700 /var/lib/mysql/database1

Étape 4: Copiez ibdata1 dans votre dossier de base de données

sudo cp /mnt/ubuntu_426/var/lib/mysql/ibdata1 /var/lib/mysql/

sudo chown mysql:mysql /var/lib/mysql/ibdata1

Étape 5: copiez les fichiers ib_logfile0 et ib_logfile1 dans votre dossier de base de données.

sudo cp /mnt/ubuntu_426/var/lib/mysql/ib_logfile0 /var/lib/mysql/

sudo cp /mnt/ubuntu_426/var/lib/mysql/ib_logfile1 /var/lib/mysql/

N'oubliez pas de changer votre propre et de changer la racine de ces fichiers:

sudo chown -R mysql:mysql /var/lib/mysql/ib_logfile0

sudo chown -R mysql:mysql /var/lib/mysql/ib_logfile1

ou

sudo chown -R mysql:mysql /var/lib/mysql

Étape 6 (facultative): Mon site a une configuration pour stocker les fichiers dans un emplacement spécifique, puis je les copie exactement à l'emplacement correspondant.

Étape 7: Démarrez votre serveur Mysql. Tout revient et en profite.

C'est ça.

Voir plus d'informations sur: https://biolinh.wordpress.com/2017/04/01/restoring-mysql-database-from-physical-files-debianubuntu/

biolinh
la source
4
+1 pour des instructions détaillées étape par étape. Mais j'ai édité certaines déclarations pour vraiment refléter ce qu'elles devraient être.
Peter
Erreur # 1932, impossible d'accéder aux données. Les bases de données apparaissent, mais les données ne sont pas accessibles. Exécution de XAMPP 7.2.12 sur MAC OS X Mojave.
Steve1754a
@ Steve1754a l'erreur peut provenir de plusieurs raisons 1. Déplacez-vous une base de données de Mac OS vers Mac OS? 2. Veuillez vérifier la permission de ces fichiers / données / table
biolinh
Réponses: 1. Oui; 2. Je l'ai fait. J'ai dû entreprendre une reconstruction complète de ma DB. Impossible de trouver une solution. Morale de l'histoire: créez toujours une sauvegarde de la base de données. J'aurais aimé qu'il y ait un moyen facile de le faire automatiquement dans XAMPP.
Steve1754a
1
tu as sauvé ma vie
SpongePablo
8

Si vous restaurez le dossier, n'oubliez pas de chown les fichiers dans mysql: mysql

chown -R mysql:mysql /var/lib/mysql-data

sinon vous obtiendrez des erreurs en essayant de supprimer une base de données ou d'ajouter une nouvelle colonne, etc.

et redémarrez MySQL

service mysql restart
Joël Davey
la source
2
ce n'est pas vraiment une réponse à la question mais cela a été très utile.
ryantuck
En fait, vous ne devriez pas tout chown à mysql, le dossier de la base de données mysql devrait conserver le groupe racine
Galvani
8

J'ai le même problème mais je n'ai pas réussi à récupérer la base de données, en suivant les instructions ci-dessus.

Je n'ai pu récupérer que les dossiers de base de données mysql à partir de mon système d'exploitation Ubuntu. Mon problème est de savoir comment récupérer ma base de données avec ces dossiers de données mysql illisibles. Je suis donc revenu à win7 OS pour l'environnement de développement.

* REMARQUE J'ai un serveur de base de données existant fonctionnant dans win7 et je n'ai besoin que de quelques fichiers de base de données à récupérer à partir des fichiers récupérés. Pour récupérer avec succès les fichiers de base de données à partir du système d'exploitation Ubuntu, je dois installer fraîchement le serveur de base de données mysql (même version d'Ubuntu OS dans mon système d'exploitation win7) pour tout récupérer dans cet ancien serveur de base de données.

  1. Créez un autre nouveau serveur de base de données mysql de la même version à partir des fichiers récupérés.

  2. Arrêtez le serveur mysql

  3. copiez le dossier récupéré et collez-le dans la base de données mysql (C: \ ProgramData \ MySQL \ MySQL Server 5.5 \ data).

  4. copiez le fichier ibdata1 situé dans le dossier installé Linux mysql et collez-le dans (C: \ ProgramData \ MySQL \ MySQL Server 5.5 \ data). Remplacez simplement l'existant ou effectuez une sauvegarde avant de le remplacer.

  5. démarrez le serveur mysql et vérifiez si vous avez réussi à récupérer les fichiers de la base de données.

  6. Pour utiliser la base de données récupérée dans mon serveur mysql actuellement utilisé, exportez simplement la base de données récupérée et importez-la mon serveur mysql existant.

J'espère que cela vous aidera, car rien d'autre n'a fonctionné pour moi.

Ivan Igniter
la source
1
La méthode fonctionne également sur ubuntu / debian avec les fichiers ibdata1, ib_logfile0 et ib_logfile1 et le dossier de base de données. l'utilisateur ne sera pas copié, mais vous pourrez alors ajouter un nouvel utilisateur à la base de données et le vider avec cela.
bokorben le
2

Avec MySql 5.1 (Win7). Pour recréer des bases de données (InnoDbs), j'ai remplacé tout le contenu des répertoires suivants (paramètres my.ini):

datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data/"
innodb_data_home_dir="C:/MySQL Datafiles/"

Après cela, j'ai démarré MySql Service et tout fonctionne bien.

sergey.olifirenko
la source
1

Oui, ça l'est! Ajoutez-les simplement à votre dossier de base de données (selon le système d'exploitation) et exécutez une commande telle que "MySQL Fix Permissions". Cela a réenregistré la base de données. Vérifiez également que les autorisations correctes sont également définies sur les fichiers.

Filip Ekberg
la source
Je l'ai fait, mais je ne reconnais pas les tables. Comme je l'ai dit dans mon commentaire sur la réponse précédente.
orezvani
0

Une fois, j'ai copié ces fichiers dans le dossier de stockage de la base de données pour une base de données mysql qui fonctionnait, j'ai démarré la base de données et j'ai attendu qu'elle "répare" les fichiers, puis je les ai extraites avec mysqldump.

Spikolynn
la source
-1

Dans mon cas, simplement supprimer le tc.log dans / var / lib / mysql était suffisant pour redémarrer mariadb / mysql.

SirJohnFranklin
la source
ce n'est pas un problème de pouvoir démarrer / redémarrer le serveur mysql.
Oluwatumbi