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
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.
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
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
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
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:
/^\\connect edc/,/^\\connect/
limite la recherche à la portée de ma base de données;{…}
effectuera toutes les commandes internes pour la plage;/\susers\(\s\|$\)/
fait correspondre toutes les lignes avec users
seule, y compris à la fin de la ligne;/;\|\\\./
fait correspondre les lignes avec ;
ou contenant \.
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.