2013-02-12 17 views
12

Le righe di una tabella sono state erroneamente cancellate dal database. Abbiamo un backup di db che si traduce in un file SQL che possono ripristinato in questo modo:Come ripristinare una singola tabella da un backup postgresql .sql?

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

Questo finisce per fare un ripristino completo a livello locale. Ma quello di cui abbiamo bisogno è ripristinare le righe di una singola tabella in produzione. Qualche consiglio su come farlo funzionare con PostgreSQL 9.1?

Grazie

risposta

10

Non lo fanno i backup di SQL se avete bisogno di ripristinare la sola tabella, ecc Use pg_dump's -Fc option - il formato "personalizzato". Questo può essere ripristinato usando pg_restore. Il ripristino selettivo è possibile, così come lo sono tutti i tipi di altre utili funzionalità. pg_restore può convertire un dump in formato personalizzato in un dump SQL in seguito, se necessario.

Se sei bloccato con una discarica esistente, le uniche opzioni sono:

  • utilizzare un editor di testo per estrarre i dati della tabella di destinazione in un file separato e solo ripristinare tale; oppure

  • Ripristinare il dump in un database usa e getta quindi utilizzare pg_dump per prelevare un dump selettivo includendo solo quella tabella. Dal momento che è "usa e getta", puoi utilizzare un'istanza Pg separata su qualche macchina veloce ma non sicura, dove accendi tutti i "fai in modo veloce ma mangia i miei dati se vuoi" opzioni come fsync=off. Devi MAI impostare quello in produzione.

+0

È possibile creare il backup di 'pg_dumpall' nel formato' -Fc'? – vyegorov

+0

@vyegorov, pg_dumpall non ha flag -F - Può eseguire il dump del database solo in formato SQL. – mys

4

È possibile utilizzare grep + sed in Roder per ottenere dati della tabella:

In primo luogo, è necessario identificare i confini:

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

Al fine di estrarre i dati per la tabella test2:

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

Nota, è necessario sottrarre uno dal secondo numero (ad esempio escludere la copia successiva stmt)

Ora è possibile caricare new_table_name.sql e ripristinare i dati necessari. Ora, è possibile caricare i dati nella nuova tabella

0

Mi capita di avere lo scarico pg_dumpall in giro. E vorrei ripristinare la tabella denominata users dal database edc, poiché molto probabilmente lo avrà tabelle ugualmente denominate in diversi database e persino schemi.

per il mio caso, il seguente sed oneliner funziona:

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

Cosa fa:

  1. /^\\connect edc/,/^\\connect/ limita la ricerca di essere la portata del mio database;
  2. {…} eseguirà tutti i comandi interni per l'intervallo;
  3. /\susers\(\s\|$\)/ corrisponde a tutte le linee con users su proprio, incluso alla fine della riga;
  4. /;\|\\\./ abbinamento con linee ; o contenenti \.
  5. p costringe le linee corrispondenti per essere emessi (nota, che sed viene richiamato con -n).

A seconda della complessità dei dati, potrebbe essere necessario modificare questo.

Tutto ciò che dovete fare è inviare l'output sed al comando psql con gli interruttori a destra.

15

io non sono a conoscenza di alcun attrezzo per questo, ma questo one-liner estratti precious_table da my_backup.sql di file:

sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql 
+1

Il mio prezioso ... tavolo. –

2

C'è un modo semplice.

'pg_restore' ha un'opzione '--table/-t'.

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

Utilizzare "-h" per l'host remoto.Vedere altre opzioni here

+1

non funziona se il dump è nel formato di testo normale – emaillenin

+1

Right, sorry, il file dovrebbe essere fatto da 'pg_dump' prima –

Problemi correlati