Puis-je restaurer une seule table depuis un fichier mysql mysqlump complet?

J’ai une sauvegarde mysqldump de ma firebase database mysql composée de toutes nos tables, ce qui représente environ 440 Mo. Je veux restaurer le contenu d’une seule des tables du mysqldump. Est-ce possible? Théoriquement, je pourrais juste couper la section qui reconstruit le tableau que je veux, mais je ne sais même pas comment éditer efficacement un document de cette taille.

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

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

Cela copiera 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 mytable.dump qui contient la structure de la table mytable et les données (une liste de INSERT ).

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 ait fini de transférer les données sur votre table (UNLOCK). Travaillé pour moi (ré) importer wp_users dans un tas de sites WordPress.

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

Cela peut se faire plus facilement? C’est comme ça que je l’ai fait:

Créez une firebase database temporaire (par exemple, restauration):

mysqladmin -u root -p create restore

Restaurez le vidage complet dans la firebase database temporaire:

mysql -u root -p restaurer

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

mysqldump restore mytable> mytable.sql

Importer la table dans une autre firebase database:

mysql -u root -p database

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

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

Ensuite, importez-le normalement, et il importera uniquement la table vidée.

D’une manière ou d’une autre, tout processus effectuant cette opération devra parcourir l’intégralité du texte de la sauvegarde et l’parsingr d’une manière ou d’une autre. Je voudrais juste

 INSERT INTO `the_table_i_want` 

et diriger la sortie vers mysql. Jetez un coup d’œil à la première table du fichier de vidage pour vous assurer que les instructions INSERT sont correctes.

Edit: OK, j’ai eu le bon formatage cette fois-ci.

Vous devriez essayer la commande @bryn mais avec le délimiteur `sinon vous allez également extraire 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 souhaiterez peut-être 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 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 une firebase database temporaire et à ne vider que cette table de la firebase database 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 firebase database:

tbdba-restore-mysqldump.pl -t yourtable -s yourdb -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 être capables de gérer un fichier texte de cette taille, si votre système le permet.

Quoi qu’il en soit, je devais 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, importé toute la sauvegarde puis recraché la table que je voulais.

Ensuite, j’ai importé cette table dans la firebase database 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 à la fois le fichier 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: “Insérez dans` mytable` “, puis copiez cette ligne avec yy . Passer au fichier suivant par ctrl+w puis down arrow key , coller la ligne copiée avec pp . Enfin, sauvegardez le nouveau fichier en tapant :wq et l’éditeur vi par :q .

Notez que si vous avez vidé les données en utilisant plusieurs insertions, vous pouvez toutes les copier (yank) à la fois en utilisant Nyy dans lequel N est le nombre de lignes à copier.

Je l’ai fait avec un fichier de 920 Mo de taille.

 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, car toutes les sauvegardes SQL ne contiennent pas d’instruction DROP TABLE . Celui-ci va travailler à toutes sortes de décharges.

Obtenez un éditeur de texte décent comme Notepad ++ ou Vim (si vous êtes déjà compétent). Recherchez le nom de la table et vous devriez pouvoir mettre en évidence 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 m’assurerais que vous êtes sur une machine avec beaucoup de mémoire vive ou de mémoire vive afin de ne pas avoir de problème pour charger le fichier entier en une fois. Une fois que vous avez mis en évidence 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 morceaux de SQL sont bloqués avec “Structure de la table pour la table my_table ” et “Données de my_table 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 si nécessaire.

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

Les éléments suivants seront retournés:

———- SQL.TXT

[4384] – Structure de la table pour la table my_table

[4500] – Données de my_table 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 seulement comment les utiliser … enquêter.

ne serait-il pas plus simple de créer une firebase database de test, de restaurer la firebase database entière, puis de transférer la table unique dans un fichier – puis de restaurer les données dans votre firebase database “production”?

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

J’ai essayé quelques options incroyablement lentes. Ce fractionnement d’un vidage de 360 ​​Go dans ses tables en quelques minutes:

Comment diviser la sortie de mysqldump en fichiers plus petits?

Les solutions «sed» mentionnées précédemment sont agréables mais, comme mentionné, elles ne sont pas 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 la vérifier manuellement)

Je voudrais vérifier la syntaxe exacte de la version de vidage utilisée et avoir une recherche de modèle plus ressortingctive:

Evitez “. *” Et utilisez “^” pour vous assurer de commencer au début de la ligne. Et je préférerais saisir la première «DROP»

Dans l’ensemble, cela fonctionne mieux pour moi:

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