Question

J'ai une sauvegarde mysqldump de ma base de données mysql composée de toutes nos tables, soit environ 440 Mo.Je souhaite restaurer le contenu d'une seule des tables de mysqldump.Est-ce possible?Théoriquement, je pourrais simplement découper la section qui reconstruit le tableau souhaité, mais je ne sais même pas comment modifier efficacement un document texte de cette taille.

Était-ce utile?

La solution

Vous pouvez essayer d'utiliser sed pour extraire uniquement le tableau souhaité.

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 se trouve entre CREATE TABLE mytable et le prochain CREATE TABLE correspondant au tableau suivant.

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

Autres conseils

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 de nombreux sites Wordpress.

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

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

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

  

mysqladmin -u racine -p créer une restauration

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

  

mysql -u racine -p restaurer < fulldump.sql

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

  

mysqldump restaure ma table > mytable.sql

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

  

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

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

Importez-le ensuite normalement et le tableau importé ne sera importé.

D'une manière ou d'une autre, tout processus faisant cela devra parcourir tout le texte 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 vers mysql. Jetez un coup d'œil à la première table du dump précédemment pour vous assurer que vous obtenez le bon moyen INSERT.

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

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 pouvez modifier 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
  1. Sauvegarde

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

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

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

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. Restaurer 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

Cela peut aussi aider.

# 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'

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

Quoi qu’il en soit, j’ai dû le faire une fois très rapidement et je n’ai pas eu le temps de trouver des outils. J'ai mis en place une nouvelle instance MySQL, importé l'intégralité de la sauvegarde, puis recraché uniquement 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.

Vous pouvez utiliser l'éditeur vi. Type:

vi -o mysql.dump mytable.dump

pour ouvrir le vidage entier 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 assez vi par :q.

Notez que si vous avez sauvegardé les données en utilisant plusieurs insertions, vous pouvez les copier toutes en même temps en utilisant NyyN est le nombre de lignes à copier.

Je l'ai fait avec un fichier de 920 Mo.

sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

Il s'agit d'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.

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`

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 mettre en surbrillance 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 de mémoire vive ou RAM pour ne pas avoir de problème à charger tout le fichier à la fois Une fois que vous avez mis en surbrillance 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.

Les fragments de SQL sont bloqués avec " Structure de la table pour la table my_table " et " Dumping des données pour la table some_other_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 si nécessaire.

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

Les éléments suivants seront renvoyés:

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

[4384] - Structure de table pour la table <=>

[4500] - Données de dumping pour la table <=>

[4514] - Structure de table pour la table <=>

... etc.

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

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

J'ai essayé quelques options, qui étaient incroyablement lentes.Cela a divisé un dump de 360 ​​Go en ses tables en quelques minutes :

Comment diviser la sortie de mysqldump en fichiers plus petits ?

Les solutions 'sed' mentionnées précédemment sont intéressantes mais pas sûres à 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 sauvegarde utilisée et effectuer une recherche de modèle plus restrictive:

Évitez ". * " et utilisez " ^ " pour nous assurer de commencer au début de la ligne. Et je préférerais saisir le "DROP" initial

Tout compte fait, cela fonctionne mieux pour moi:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top