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

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

156
demandé sur Mobius 2009-06-18 20:50:32

19 réponses

Vous pouvez essayer d'utiliser sed pour 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 alors ajuster le fichier mytable.dump qui contient le structure du tableau mytable , et des données (une liste de INSERT ).

229
répondu uloBasEI 2016-08-10 09:55:09

j'ai utilisé une version modifiée de la commande sed d'uloBasEI. Il inclut la commande de goutte précédente, et lit jusqu'à ce que mysql soit fait en déchargeant des données sur votre table (déverrouiller). Travaillé pour moi (re)importer wp_users vers un tas de sites Wordpress.

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
92
répondu bryn 2016-08-10 09:55:33

cela peut-il être fait plus facilement? C'est comme ça que je l'ai fait:

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

mysqladmin -u root -p créer restaurer

de Restaurer le vidage complet de la temp de la base de données:

mysql-u root-p restore < fulldump.sql

Vidage de la table que vous souhaitez récupérer:

mysqldump restaurer matable > mytable.sql

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

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

40
répondu Martijn Kools 2013-04-25 12:58:25

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

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

puis l'importer comme d'habitude, et elle importera seulement la table sous-évaluée.

12
répondu Brom558 2013-08-08 09:34:24

D'une manière ou d'une autre, tout processus faisant cela devra passer par tout le texte du dump et l'analyser d'une manière ou d'une autre. Je viens de grep pour

INSERT INTO `the_table_i_want`

et Piper la sortie dans mysql. Jetez un coup d'oeil à la première table dans la décharge avant, pour s'assurer que vous obtenez L'INSERT est le bon chemin.

Edit: OK, a obtenu la mise en forme de droit en ce moment.

8
répondu JCCyC 2009-06-18 16:57:00

vous devriez essayer la commande @bryn mais avec le 'delimiter sinon vous extrairez aussi les tables ayant un préfixe ou un suffixe, c'est ce que je fais habituellement:

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql

également à des fins de test, vous pouvez vouloir changer le nom de la table avant d'importer:

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql

pour importer vous pouvez alors utiliser la commande mysql:

mysql -u root -p'password' mydatabase < mytable_restore.sql
7
répondu Maxime Biette 2013-09-18 12:40:00
  1. Sauvegarde

    $ mysqldump -A | gzip > mysqldump-A.gz
    
  2. Restauration à table unique

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
    
5
répondu y.tk 2015-02-23 11:10:33

une façon possible de gérer cela est de restaurer à une base de données temporaire, et de vider juste cette table de la base de données temporaire. Alors utilisez le nouveau script.

4
répondu Tim Hoolihan 2009-06-18 16:57:48

cet outil peut être ce que vous voulez: tbdba-restore-mysqldump.pl

https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl

p.ex. restauration d'une table à partir d'un fichier dump de base de données:

tbdba-restore-mysqldump.pl -c'est votre sauvegarde BD-F.sql

3
répondu user1097790 2011-12-14 12:41:20

cela peut aider aussi.

# mysqldump -u root -p database0 > /tmp/database0.sql
# mysql -u root -p -e 'create database database0_bkp'
# mysql -u root -p database0_bkp < /tmp/database0.sql
# mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want'
2
répondu pjl 2014-01-02 14:45:26

les éditeurs de texte les plus modernes devraient être capables de gérer un fichier texte de cette taille, si votre système est à la hauteur.

de toute façon, j'ai dû le faire une fois très rapidement et je n'ai pas eu le temps de trouver des outils. J'ai créé une nouvelle instance MySQL, j'ai importé toute la sauvegarde et j'ai craché juste la table que je voulais.

puis j'ai importé cette table dans la base de données principale.

C'était fastidieux, mais plutôt facile. Bonne chance.

1
répondu Bryan Migliorisi 2009-06-18 16:58:53

Vous pouvez utiliser l'éditeur vi. Type:

vi -o mysql.dump mytable.dump

pour ouvrir à la fois le dump entier mysql.dump et un nouveau fichier mytable.dump . Trouvez l'insertion appropriée dans la ligne en appuyant sur / , puis tapez une phrase, par exemple:" insert into `mytable`", puis copiez cette ligne en utilisant yy . Basculer au fichier suivant par ctrl+w puis down arrow key , coller la ligne copiée avec pp . Enfin enregistrer le nouveau fichier en tapant :wq et tout à fait vi éditeur par :q .

notez que si vous avez jeté les données en utilisant plusieurs inserts, vous pouvez les copier (yank) tous en même temps en utilisant Nyy dans lequel N est le nombre de lignes à copier.

je l'ai fait avec un fichier de 920 MO taille.

1
répondu mtoloo 2015-02-02 07:28:34
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

C'est une meilleure solution que certaines des autres ci-dessus parce que tous les dumps SQL ne contiennent pas une instruction DROP TABLE . Celui-ci va marcher va faire toutes sortes de décharges.

1
répondu Weston Ganger 2016-07-12 16:59:22

obtenir un éditeur de texte décent comme Notepad++ ou Vim (si vous êtes déjà compétent avec elle). Cherchez le nom de la table et vous devriez être en mesure de mettre en évidence seulement les commandes CREATE, ALTER et INSERT pour cette table. Il peut être plus facile de naviguer avec votre clavier qu'avec une souris. Et je m'assurerais que vous êtes sur une machine avec beaucoup de mémoire vive ou de mémoire vive pour qu'elle n'ait pas de problème à charger le fichier entier en une seule fois. Une fois que vous avez sélectionné et copié les lignes dont vous avez besoin, ce serait une bonne idée de sauvegarder juste la partie copiée dans son propre fichier de sauvegarde et ensuite l'importer dans MySQL.

0
répondu Cameron 2009-06-18 17:04:42

les morceaux de SQL sont bloqués avec "structure de Table pour la table my_table "et "données de Dumping pour la table my_table ."

vous pouvez utiliser une ligne de commande Windows comme suit pour obtenir les numéros de ligne pour les différentes sections. Ajustez la chaîne recherchée au besoin.

trouver /n "pour la table "" sql.txt

La suite sera retourné:

---------- SQL.TXT

[4384]-- Structure du tableau pour les tableaux my_table

[4500] -- données de Dumping pour la table my_table

[4514]-- structure de la Table pour la table some_other_table

... etc.

qui vous donne les numéros de ligne dont vous avez besoin... maintenant, si seulement je savais comment les utiliser... enquêter.

0
répondu Kuyenda 2009-06-18 18:24:02

en 2008, j'avais besoin de faire ça aussi. J'ai écrit un script Perl qui vais le faire, et c'est maintenant ma méthode de choix. Aussi résumé comment le faire en awk ou comment restaurer ailleurs et extraire. Récemment j'ai ajouté cette méthode sed à la liste aussi. Vous pouvez trouver le script et les autres méthodes ici: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html

0
répondu JaredC 2012-11-09 16:11:50

j'ai essayé quelques options, qui étaient incroyablement lents. Cela a divisé un dump de 360GO dans ses tables en quelques minutes:

Comment diviser la sortie de mysqldump en petits fichiers?

0
répondu Kohjah Breese 2017-05-23 12:18:23

Le sed solutions mentionnées précédemment sont sympa, mais comme mentionné pas sûr à 100%

  • vous pouvez avoir des commandes INSERT avec des données contenant: ... CREATE TABLE...(quoi.)..mytable...

  • ou même la chaîne exacte "créer la TABLE' mytable`;" si vous stockez des commandes DML par exemple!

(et si la table est énorme vous ne voulez pas vérifier que manuellement)

je vérifierais la syntaxe exacte de la version dump utilisée, et j'aurais une recherche de patron plus restrictive:

eviter".*" et l'utilisation "^" pour nous assurer de commencer au début de la ligne. Et je préférerais attraper le premier "DROP "

tout compte fait, cela fonctionne mieux pour moi:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
0
répondu phil_w 2017-01-17 12:24:04
La Table

devrait présenter la même structure dans le dump et la base de données.

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

ou

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`
0
répondu Neminath 2018-09-21 10:11:12