web-dev-qa-db-fra.com

Comment restaurer une seule table à partir d'une sauvegarde postgresql .sql?

Les lignes d'une table ont été supprimées par erreur de la base de données. Nous avons une sauvegarde de la base de données qui donne un fichier SQL qui peut être restauré comme ceci:

psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql

Cela finit par faire une restauration complète localement. Mais ce dont nous avons besoin, c’est de restaurer les lignes d’une seule table en production. Des conseils sur la façon de faire fonctionner cela avec PostgreSQL 9.1?

Merci

13
AnApprentice

Ne faites pas de sauvegardes SQL si vous avez besoin d'une restauration à table unique, etc. Utilisez l'option pg_dump de -Fc - le format "personnalisé". Cela peut être restauré en utilisant pg_restore. La restauration sélective est possible, de même que toutes sortes d'autres fonctionnalités utiles. pg_restore peut convertir un cliché de format personnalisé en un cliché SQL ultérieurement si vous en avez besoin.

Si vous êtes bloqué avec un dump existant, vos seules options sont:

  • Utilisez un éditeur de texte pour extraire les données de la table cible dans un fichier séparé et restaurez-les simplement. ou

  • Restaurez le vidage dans une base de données jetable, puis utilisez pg_dump pour effectuer un vidage sélectif incluant uniquement cette table. Comme il est jetable, vous pouvez utiliser une instance distincte de Pg sur une machine non chargée mais rapide, mais non sécurisée, dans laquelle vous activez toutes les options "accélérez, mais mangez mes données si vous le souhaitez" telles que fsync=off. Vous devriezNE JAMAISdéfinir cela en production.

10
Craig Ringer

Je ne connais aucun outil pour cela, mais ce one-liner extrait precious_table du fichier my_backup.sql:

sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql
17
Zouppen

Vous pouvez utiliser grep + sed dans roder pour obtenir des données de table:

Tout d'abord, vous devez identifier les limites:

$ fgrep -Ehn '^(COPY |CREATE TABLE )' db.sql
49:CREATE TABLE test (
60:CREATE TABLE test2 (
71:CREATE TABLE test3 (
82:COPY test (i) FROM stdin;
100090:COPY test2 (i) FROM stdin;
200098:COPY test3 (i) FROM stdin;

Pour extraire les données de la table test2:

sed -n '100090,200097p' < db.sql | sed -e 's/^COPY test2/COPY new_table_name/' > new_table_name.sql

Notez que vous devez soustraire un du deuxième nombre (c.-à-d. Exclure la copie suivante).

Vous pouvez maintenant charger new_table_name.sql et restaurer les données dont vous avez besoin. Maintenant, vous pouvez charger des données dans une nouvelle table

5
mys

Il y a un moyen facile.

'pg_restore' a une option '--table/-t'. 

pg_restore -a -t your_table /path/to/dump.sql

Utilisez '-h' pour l'hôte distant. Voir les autres options here

2
Sergii Mostovyi

Il se trouve que pg_dumpall dump around. Et j'aimerais restaurer la table nommée users à partir de la base de données nommée edc, car vous avez très probablement will ainsi nommé des tables dans différentes bases de données et même des schémas.

Pour mon cas, la sed oneliner suivante fonctionne:

sed -ne '/^\\connect edc/,/^\\connect/{/\susers\(\s\|$\)/,/;\|\\\./p}' pg92.dump

Ce qu'il fait:

  1. /^\\connect edc/,/^\\connect/ limite la recherche à la portée de ma base de données;
  2. {…} effectuera toutes les commandes internes pour la plage;
  3. /\susers\(\s\|$\)/ fait correspondre toutes les lignes avec users seule, y compris à la fin de la ligne;
  4. /;\|\\\./ fait correspondre les lignes avec ; ou contenant \.
  5. p force la sortie des lignes correspondantes (notez que sed est appelé avec -n).

Selon la complexité de vos données, vous devrez peut-être modifier cela.

Tout ce que vous avez à faire est de diriger la sortie sed vers la commande psql avec les commutateurs de droite.

0
vyegorov