Domanda

ho preso un dump di un database denominato temp1, utilizzando il comando follwing

$  pg_dump -i -h localhost  -U postgres -F c -b -v -f pub.backup temp1 

Ora voglio ristabilire la discarica in un database diverso chiamato "db_temp", ma nel senso che io voglio solo che tutte le tabelle dovrebbero essere creati in un "temp_schema" (non lo schema predefinito che si trova nella base di dati FMS temp1) che è nel database "db_temp".

Esiste un modo per fare questo comando utilizzando pg_restore?

Qualsiasi altro metodo anche apprezzato!

È stato utile?

Soluzione

Non c'è modo in pg_restore sé. Che cosa si può fare è utilizzare pg_restore per generare l'output SQL, e quindi inviare questo attraverso ad esempio uno script sed per cambiarlo. È necessario essere attenti a come si scrive lo script sed però, quindi non corrisponde e cambiare le cose all'interno dei dati.

Altri suggerimenti

C'è una soluzione semplice:

  • Crea il tuo dump backup in formato SQL pianura (formato "p" utilizzando il parametro o --format=p -F p)
  • Modifica la tua discarica pub.backup.sql con il vostro editor preferito e aggiungere le seguenti due righe nella parte superiore del file:

create schema myschema;

SET search_path TO myschema;

Ora è possibile ripristinare il dump backup con il comando

psql -f pub.backup.sql

Il comando set search_path to <schema> imposterà myschema come predefinito, in modo che si creano nuove tabelle e altri oggetti in questo schema, in modo indipendente dello schema "default" dove hanno vissuto prima.

Un modo veloce e sporco:

1) rename schema predefinito:

alter schema public rename to public_save;

2) Creare nuovo schema come schema predefinito:

create schema public;

3) ripristinare i dati

pg_restore -f pub.backup db_temp [and whatever other options]

4) gli schemi di ridenominazione in base alle esigenze:

alter schema public rename to temp_schema;
alter schema public_save rename to public;

Probabilmente il metodo più semplice sarebbe quella di rinominare semplicemente lo schema dopo il ripristino, cioè con il seguente SQL:

ALTER SCHEMA my_schema RENAME TO temp_schema

credo che perché si sta utilizzando il formato di archivio compresso per l'output di pg_dump non è possibile modificarlo prima di ripristinare. L'opzione sarebbe quella di utilizzare l'uscita di default e fare una ricerca e sostituire il nome dello schema, ma che sarebbe stato rischioso e potrebbe forse causa di dati di essere danneggiato se non si stava attenti.

Se avete solo pochi tavoli quindi è possibile ripristinare una tabella alla volta, pg_restore accetta -d database quando si specifica -t tablename. Naturalmente, si dovrà impostare lo schema prima di ripristinare le tabelle e poi risolvere gli indici e vincoli quando hai finito il ripristino delle tabelle.

In alternativa, impostare un altro server su una porta diversa, il ripristino utilizzando il nuovo server PostgreSQL, rinominare lo schema, discarica, e ripristinare nel database originale. Questo è un po 'un ripiego, naturalmente, ma otterrà il lavoro fatto.

Se siete avventurosi si potrebbe essere in grado di cambiare il nome del database nel file di dump utilizzando un editor esadecimale. Penso che è menzionato solo in un posto nella discarica e fintanto che i nuovi e vecchi nomi dei database sono gli stessi che dovrebbe funzionare. YMMV, non fare niente di simile in un ambiente di produzione, non prendetevela con me se questo fa saltare in aria e livelli vostra città natale, e tutto il resto le solite esclusioni di responsabilità.

Rinomina lo schema in un database temporaneo.

Esporta schema:

pg_dump --schema-only --schema=prod > prod.sql

Creare un nuovo database. Ripristinare l'esportazione:

psql -f prod.sql

ALTER SCHEMA prod RENAME TO somethingelse;

pg_dump --schema-only --schema=somethingelse > somethingelse.sql

(eliminare il database)

Per i dati si può semplicemente modificare il set search_path in alto.

Come ha fatto notare, non c'è alcun supporto diretto in pg_dump, psql o pg_restore per cambiare il nome dello schema nel corso di un dump del processo / restore. Ma è abbastanza semplice da esportare utilizzando il formato "plain" quindi modificare il file sql. Questo script Bash fa le nozioni di base:

rename_schema () {

  # Change search path so by default everything will go into the specified schema
  perl -pi -e "s/SET search_path = $2, pg_catalog/SET search_path = $3, pg_catalog, $2;/" "$1"

  # Change 'ALTER FUNCTION foo.' to 'ALTER FUNCTION bar.'
  perl -pi -e 's/^([A-Z]+ [A-Z]+) '$2'\./$1 '$3'./' "$1"

  # Change the final GRANT ALL ON SCHEMA foo TO PUBLIC
  perl -pi -e 's/SCHEMA '$2'/SCHEMA '$3'/' "$1"

}

Utilizzo:

pg_dump --format plain --schema=foo --file dump.sql MYDB
rename_schema dump.sql foo bar
psql -d MYDB -c 'CREATE SCHEMA bar;'
psql -d MYDB -f dumpsql
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top