J'ai une sauvegarde mysqldump de ma base de données mysql composée de toutes nos tables qui fait environ 440 mégaoctets. Je veux restaurer le contenu d'une seule des tables du 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 modifier efficacement un document texte de cette taille.
194
Réponses:
Vous pouvez essayer d'utiliser sed afin d'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 vidage:Cela copiera dans le fichier
mytable.dump
ce qui se trouve entreCREATE TABLE mytable
et le suivantCREATE TABLE
correspondant au tableau suivant.Vous pouvez ensuite ajuster le fichier
mytable.dump
qui contient la structure de la tablemytable
et les données (une liste deINSERT
).la source
Table structure for table
commentaire, au lieu de faire correspondre par CREATE TABLE. Cela garantira que la table suivante ne sera pas supprimée si l'on oublie de supprimer son instruction DROP TABLE et autorise la canalisation pour la restauration de table à commande unique (gzip | sed | mysql). Cependant, cette solution dépend de la syntaxe des commentaires mysqldump (je ne sais pas comment elle est standard).J'ai utilisé une version modifiée de la commande sed de uloBasEI. Il inclut la commande DROP précédente et lit jusqu'à ce que mysql ait terminé de vider les données dans votre table (UNLOCK). A travaillé pour moi (ré) important wp_users vers un tas de sites Wordpress.
la source
`mytable`
pour éviter de faire correspondre les tablesmytable2
, etc.sed
ne devrait pas interférer avec l'encodage ...DROP TABLE
(mon vidage MySQL ne l'avait pas) peuvent vouloir utiliser:sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql
Cela utilise les commentaires de table fournis avant chaque table dans un vidage MySQl, et garantit des lignes comme/*!40101 SET @saved_cs_client = @@character_set_client */;
être incluses.Cela peut-il être fait plus facilement? Voici comment je l'ai fait:
Créez une base de données temporaire (par exemple restauration):
Restaurez le vidage complet dans la base de données temporaire:
Videz la table que vous souhaitez récupérer:
Importez la table dans une autre base de données:
la source
Une solution simple serait de simplement créer un vidage de la table que vous souhaitez restaurer séparément. Vous pouvez utiliser la commande mysqldump pour le faire avec la syntaxe suivante:
Ensuite, importez-le comme d'habitude, et il importera uniquement la table sauvegardée.
la source
D'une manière ou d'une autre, tout processus faisant cela devra parcourir tout le texte du vidage et l'analyser d'une manière ou d'une autre. Je voudrais simplement
et canalisez la sortie dans mysql. Jetez un œil à la première table de la décharge avant, pour vous assurer que vous obtenez le INSERT de la bonne façon.
Edit: OK, le formatage est correct cette fois.
la source
Vous devriez essayer la commande @bryn mais avec le délimiteur `sinon vous extrairez également les tables ayant un préfixe ou un suffixe, c'est ce que je fais habituellement:
Également à des fins de test, vous souhaiterez peut-être modifier le nom de la table avant d'importer:
Pour importer, vous pouvez ensuite utiliser la commande mysql:
la source
Sauvegarde
Restaurer une table unique
la source
Une façon possible de résoudre ce problème consiste à restaurer dans une base de données temporaire et à vider uniquement cette table de la base de données temporaire. Utilisez ensuite le nouveau script.
la source
Cet outil 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 du fichier de vidage de la base de données:
la source
Il s'agit d'une meilleure solution que certaines des autres ci-dessus car tous les vidages SQL ne contiennent pas une
DROP TABLE
instruction. Celui-ci fonctionnera avec toutes sortes de décharges.la source
Cela peut aussi aider.
la source
La table doit présenter la même structure dans le vidage et la base de données.
ou
la source
La plupart des éditeurs de texte modernes devraient être capables de gérer un fichier texte de cette taille, si votre système est à la hauteur.
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é toute la sauvegarde et puis craché juste la table que je voulais.
J'ai ensuite importé cette table dans la base de données principale.
C'était fastidieux mais plutôt facile. Bonne chance.
la source
Vous pouvez utiliser l'éditeur vi. Type:
pour ouvrir à la fois le vidage entier
mysql.dump
et un nouveau fichiermytable.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 deyy
. Passer au fichier suivant parctrl+w
làdown arrow key
, collez la ligne copiée avecpp
. Enfin, enregistrez le nouveau fichier en tapant:wq
et tout à fait l'éditeur vi par:q
.Notez que si vous avez déversé les données à l' aide de multiples inserts , vous pouvez copier (Yank) tous à la fois en utilisant
Nyy
dans lequelN
le nombre de lignes à copier.Je l'ai fait avec un fichier de 920 Mo.
la source
Obtenez un éditeur de texte décent comme Notepad ++ ou Vim (si vous êtes déjà compétent avec lui). Recherchez le nom de la table et vous devriez pouvoir mettre en surbrillance 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 RAM ou de sorte qu'il n'y aura pas de problème de chargement du fichier entier à la fois. Une fois que vous avez mis en surbrillance et copié les lignes dont vous avez besoin, ce serait une bonne idée de sauvegarder uniquement la partie copiée dans son propre fichier de sauvegarde, puis de l'importer dans MySQL.
la source
Les morceaux de SQL sont bloqués avec «Structure de table pour table
my_table
» et «Dump des données pour tablemy_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 selon vos besoins.
trouver / n "pour la table" "sql.txt
Les éléments suivants seront retournés:
---------- SQL.TXT
[4384] - Structure de table pour table
my_table
[4500] - Données de dumping pour le tableau
my_table
[4514] - Structure de table pour table
some_other_table
... etc.
Cela vous donne les numéros de ligne dont vous avez besoin ... maintenant, si seulement je savais comment les utiliser ... enquêter.
la source
En 2008, j'avais aussi besoin de faire ça. J'ai écrit un script Perl qui le fera, et c'est maintenant ma méthode de choix. Résume également 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-tricks/extract-a-single-table-from-a-mysqldump-file.html
la source
J'ai essayé quelques options, qui étaient incroyablement lentes. Cela a divisé un vidage de 360 Go dans ses tables en quelques minutes:
Comment diviser la sortie de mysqldump en fichiers plus petits?
la source
Les solutions «sed» mentionnées précédemment sont agréables mais, comme mentionné, elles ne sont pas 100% sécurisées
Vous pouvez avoir des commandes INSERT avec des données contenant: ... CREATE TABLE ... (n'importe quoi) ... mytable ...
ou même la chaîne exacte "CREATE TABLE` mytable`; " si vous stockez des commandes DML par exemple!
(et si le tableau est énorme, vous ne voulez pas le vérifier manuellement)
Je vérifierais la syntaxe exacte de la version de vidage utilisée et aurais 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ère saisir le «DROP» initial
Dans l'ensemble, cela fonctionne mieux pour moi:
la source