web-dev-qa-db-fra.com

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 composée de toutes nos tables, soit environ 440 Mo. Je veux restaurer le contenu d'un seul des tableaux de la mysqldump. Est-ce possible? Théoriquement, je pourrais simplement couper la section qui reconstruit le tableau que je veux mais je ne sais même pas comment éditer efficacement un document texte de cette taille.

163
Mobius

Vous pouvez essayer d'utiliser sed pour extraire uniquement la table souhaitée.

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

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

Ceci va copier dans le fichier mytable.dump ce qui est situé entre CREATE TABLE mytable et le prochain 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).

243
uloBasEI

J'ai utilisé une version modifiée de la commande sed d'uloBasEI. Il inclut la commande DROP précédente et lit jusqu'à ce que mysql soit déchargé des données dans votre table (UNLOCK) Travaillé pour moi (ré) importer wp_users sur un tas de sites Wordpress.

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
95
bryn

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

Créez une base de données temporaire (par exemple, une restauration):

mysqladmin -u root -p créer une restauration

Restaurez le vidage complet dans la base de données temporaire:

mysql -u root -p restaurer <fulldump.sql

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

mysqldump restaurer mytable> mytable.sql

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

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

44
Martijn Kools

Une solution simple serait de créer simplement un dump de la 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

Puis importez-le normalement et il importera uniquement le tableau vidé.

12
Brom558

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 voudrais juste grep pour

INSERT INTO `the_table_i_want`

et dirigez la sortie dans mysql. Jetez un coup d'œil à la première table de la décharge avant pour vous assurer que vous obtenez le bon moyen INSERT.

Edit: OK, le formatage est correct cette fois-ci.

8
JCCyC

Vous devriez essayer la commande @bryn, mais avec le délimiteur `, sinon, vous extrairez également les tables ayant un préfixe ou un suffixe, voici ce que je fais habituellement:

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

Également à des fins de test, vous voudrez peut-être 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 ensuite utiliser la commande mysql:

mysql -u root -p'password' mydatabase < mytable_restore.sql
7
Maxime Biette
  1. Sauvegarde

    $ mysqldump -A | gzip > mysqldump-A.gz
    
  2. Restaurer une seule table

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
    
6
y.tk

Une solution possible consiste à restaurer dans une base de données temporaire et à vider cette table uniquement de la base de données temporaire. Ensuite, utilisez le nouveau script.

4
Tim Hoolihan

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

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

par exemple. Restaurez une table à partir d'un fichier de vidage de la base de données:

tbdba-restore-mysqldump.pl -t votre-table -s votredb -f backup.sql

3
user1097790

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
pjl

Vous pouvez utiliser l'éditeur vi. Type:

vi -o mysql.dump mytable.dump

pour ouvrir le code complet mysql.dump et un nouveau fichier mytable.dump. Recherchez l'insertion appropriée dans la ligne en appuyant sur /, puis tapez une phrase, par exemple: "insérer dans` mytable` ", puis copiez cette ligne à l'aide de yy. Passez au fichier suivant par ctrl+w puis down arrow key, collez la ligne copiée avec pp. Enfin, sauvegardez le nouveau fichier en tapant :wq et l'éditeur tout à fait vi par :q.

Notez que si vous avez vidé les données en utilisant plusieurs insertions, vous pouvez les copier toutes 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 MB.

1
mtoloo

La plupart des éditeurs de texte modernes devraient pouvoir gérer un fichier texte de cette taille, si votre système le permet.

En tout cas, je devais le faire une fois très rapidement et je n’avais pas le temps de trouver des outils. J'ai mis en place une nouvelle instance MySQL, importé l'intégralité de la sauvegarde, puis recraché le tableau souhaité.

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

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

1
Bryan Migliorisi
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 solutions ci-dessus, car toutes les sauvegardes SQL ne contiennent pas d'instruction DROP TABLE. Celui-ci fonctionnera avec toutes sortes de décharges.

1
Weston Ganger

Les solutions 'sed' mentionnées précédemment sont Nice mais, comme mentionné, non sécurisées à 100%

  • Vous pouvez avoir des commandes INSERT avec des données contenant: ... CREATE TABLE ... (peu importe) ... mytable ...

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

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

Je voudrais vérifier la syntaxe exacte de la version de dump utilisée et effectuer une recherche de modèle plus restrictive:

Évitez ". *" Et utilisez "^" pour vous assurer que nous commençons au début de la ligne . Et je préférerais saisir le "DROP" initial 

Dans l’ensemble, cela fonctionne mieux pour moi:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
0
phil_w

Les fragments de SQL sont bloqués avec "Structure de table pour la table my_table" et "Transfert de données pour la table my_table."

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

find/n "pour la table` "sql.txt

Les éléments suivants seront retournés:

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

[4384] - Structure de table pour la table my_table

[4500] - Données de dumping pour la table my_table

[4514] - Structure de table pour la table some_other_table

... etc.

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

0
Kuyenda

La table doit présenter la même structure dans dump et database.

`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
Neminath

Obtenez un éditeur de texte décent comme Notepad ++ ou Vim (si vous le maîtrisez déjà). Recherchez le nom de la table et vous devriez pouvoir sélectionner uniquement les commandes CREATE, ALTER et INSERT pour cette table. Il peut être plus facile de naviguer avec votre clavier plutôt qu'avec une souris. Et je voudrais m'assurer que vous êtes sur une machine avec beaucoup ou RAM pour qu'il n'y ait pas de problème pour charger tout le fichier à la fois. Une fois que vous avez surligné et copié les lignes dont vous avez besoin, il serait judicieux de ne sauvegarder que la partie copiée dans son propre fichier de sauvegarde, puis de l'importer dans MySQL.

0
Cameron

J'ai essayé quelques options incroyablement lentes. Cela divise un cliché de 360 ​​Go en quelques minutes:

Comment diviser la sortie de mysqldump en fichiers plus petits?

0
Kohjah Breese

En 2008, j’avais besoin de le faire aussi. J'ai écrit un script Perl qui le fera, et c'est maintenant ma méthode de choix. Résume également comment procéder dans awk ou comment restaurer et extraire ailleurs. Récemment, j'ai ajouté cette méthode sed à la liste. Vous trouverez 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
JaredC