234 votes

Puis-je restaurer une seule table à partir d'un fichier mysql mysqldump complet ?

J'ai une sauvegarde mysqldump de ma base de données mysql comprenant toutes nos tables, ce qui représente environ 440 Mo. Je veux restaurer le contenu d'une seule des tables à partir de la sauvegarde mysqldump. Est-ce possible ? Théoriquement, je pourrais simplement couper la section qui reconstruit la table que je veux mais je ne sais même pas comment éditer efficacement un document texte de cette taille.

2 votes

Pour info, vous pouvez aussi utiliser mydumper . Cela crée un vidage logique comme mysqldump, mais il produit des fichiers séparés par table, et il peut faire à la fois le vidage et le chargement en multi-thread, donc il prend moins de temps.

342voto

uloBasEI Points 1418

Vous pouvez essayer d'utiliser sed afin d'extraire uniquement la table que vous voulez.

Disons que le nom de votre table est mytable et le fichier mysql.dump est le fichier contenant votre énorme dump :

$ sed -n -e '/CREATE TABLE.*mytable/,/CREATE TABLE/p' mysql.dump > mytable.dump

Cela copiera dans le fichier mytable.dump ce qui est situé entre CREATE TABLE mytable et le suivant CREATE TABLE correspondant au tableau suivant.

Vous pouvez ensuite ajuster le fichier mytable.dump qui contient la structure de la table mytable et les données (une liste de INSERT ).

6 votes

C'est encore mieux que ma réponse car cela prend en charge la CREATE TABLE aussi, mais vous devriez chercher avec les guillemets pour ne pas obtenir une autre table appelée "thisismytabletoo".

1 votes

Vrai. Je n'étais pas sûr que les noms de tables dans tous les dumps mysql soient toujours entourés de guillemets ou que "CREATE TABLE mytable" soit également possible. Nous pouvons facilement adapter la première regexp si nous savons à quoi ressemble le dump. Un deuxième problème pourrait être que la table mytable n'est pas unique (une dans la base de données db1, et une autre dans la base de données db2). Les deux seront exportés dans le fichier mytable.dump. Si la table n'est pas unique, nous pouvons utiliser la même commande sed, d'abord avec CREATE DATABASE afin d'extraire uniquement la bonne base de données. Ensuite, utilisez la commande sed avec CREATE TABLE.

0 votes

Oui, JCCyC. Ce truc a fait exactement ce dont j'avais besoin avec zéro monkeybusiness. Merci beaucoup à vous et à uloBasEl !

152voto

bryn Points 873

J'ai utilisé une version modifiée de la commande sed de uloBasEI. Elle inclut la commande DROP précédente, et lit jusqu'à ce que mysql ait fini de déverser les données dans votre table (UNLOCK). Cela m'a permis de (ré)importer *wp_users* sur un certain nombre de sites Wordpress.

sed -n -e '/DROP TABLE.*mytable/,/UNLOCK TABLES/p'

4 votes

Il s'agit en fait d'une bien meilleure solution que celle choisie comme réponse, ci-dessus. Je n'arrive pas à croire qu'elle n'ait pas obtenu plus de votes positifs.

10 votes

Je suggère d'ajouter au moins des guillemets au nom de la table : `mytable` pour éviter les tables correspondantes mytable2 et ainsi de suite comme dans mon cas.

0 votes

Maxim, cela n'a pas fonctionné car il n'y avait pas de fichier source dans l'exemple ni de stdout et de fichier de destination. J'ai modifié l'exemple pour les inclure (mydump.sql > tabledump.sql) et cela devrait fonctionner maintenant.

61voto

Martijn Kools Points 51

Cela peut être fait plus facilement ? Voici comment je l'ai fait :

Créer une base de données temporaire (par exemple, restaurer) :

mysqladmin -u Root -p create restore

Restaurer le dump complet dans la base de données temporaire :

mysql -u Root -p restore < fulldump.sql

Videz la table que vous voulez récupérer :

mysqldump restore mytable > mytable.sql

Importez la table dans une autre base de données :

mysql -u Root -p base de données < mytable.sql

4 votes

C'est ce dont la plupart des gens ont besoin.

6 votes

Según cette suggestion d'édition vous devez ajouter le paramètre "--one-database", pour vous assurer que vous ne restaurez que un base de données et ne pas détruire tout le reste.

19 votes

Pour les bases de données vraiment énormes, cela peut être très bizarre - restaurer 150 Go de données pour une table de 100 Mo.

13voto

Brom558 Points 51

Une solution simple serait de créer un dump de la seule table que vous souhaitez restaurer séparément. Vous pouvez utiliser la commande mysqldump pour le faire avec la syntaxe suivante :

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql

Ensuite, importez-le normalement, et il n'importera que la table vidée.

9voto

JCCyC Points 2732

D'une manière ou d'une autre, tout processus faisant cela devra parcourir le texte entier du dump et l'analyser d'une manière ou d'une autre. Je chercherais juste

INSERT INTO `the_table_i_want`

et envoyer la sortie dans mysql. Jetez un coup d'oeil à la première table dans le vidage précédent, pour vous assurer que vous obtenez les INSERTs de la bonne manière.

Edit : OK, le formatage est correct cette fois.

0 votes

Je suis stupide de ne pas avoir pensé immédiatement à le greffer. Grep me sauve la mise tous les jours, on dirait. Les deux autres suggestions étaient également excellentes et c'est ce que j'aurais fait sans les merveilles de grep. Merci à tous !

6 votes

Si vous pensez que vous aimez grep, lorsque vous apprendrez awk vous deviendrez son heureux esclave sexuel : fr.wikipedia.org/wiki/Awk

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X