Domanda Voglio ripristinare il database con uno schema diverso


Ho preso un dump di un database chiamato temp1, usando il comando follwing

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

Ora voglio ripristinare il dump in un altro database chiamato "db_temp", ma in questo voglio solo che tutte le tabelle debbano essere create in un "temp_schema" (non lo schema predefinito che si trova nel database tempms fms) che è in il database "db_temp".

C'è un modo per farlo usando pg_restore comando?

Qualsiasi altro metodo è apprezzato!


44
2017-11-16 06:20


origine


risposte:


Non c'è modo in pg_restore stesso. Quello che puoi fare è usare pg_restore per generare l'output SQL, e quindi inviarlo attraverso uno script sed per cambiarlo. Devi stare attento a come scrivi quello script sed, quindi non combacia e cambia le cose all'interno dei tuoi dati.


9
2017-11-16 13:47



C'è una soluzione semplice:

  • Creare il dump di backup in formato SQL semplice (formato "p" utilizzando il parametro --format=p o -F p)
  • Modifica il tuo dump pub.backup.sql con il tuo editor preferito e aggiungi le seguenti due righe nella parte superiore del tuo file:

create schema myschema;

SET search_path TO myschema;

Ora è possibile ripristinare il dump di backup con il comando

psql -f pub.backup.sql

Il set search_path to <schema> comando imposterà myschema come predefinito, in modo che nuove tabelle e altri oggetti vengano creati in questo schema, indipendentemente dallo schema "predefinito" in cui sono vissuti prima.


49
2018-06-01 15:46



Un modo veloce e sporco:

1) rinominare lo schema di default:

alter schema public rename to public_save;

2) creare un nuovo schema come schema predefinito:

create schema public;

3) ripristinare i dati

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

4) rinominare gli schemi in base alle necessità:

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

34
2018-05-01 02:28



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

ALTER SCHEMA my_schema RENAME TO temp_schema

Credo che poiché si sta utilizzando il formato di archivio compresso per l'output di pg_dump non è possibile modificarlo prima del ripristino. L'opzione sarebbe quella di utilizzare l'output di default e fare una ricerca e sostituire il nome dello schema, ma sarebbe rischioso e potrebbe causare la corruzione dei dati se non si fa attenzione.


10
2017-11-16 06:46



Se hai solo pochi tavoli, puoi ripristinare un tavolo alla volta, pg_restore accetta -d database quando specifichi -t tablename. Ovviamente, dovrai configurare lo schema prima di ripristinare le tabelle e poi ordinare gli indici e i vincoli quando hai finito di ripristinare le tabelle.

In alternativa, configura un altro server su una porta diversa, ripristina usando il nuovo server PostgreSQL, rinomina lo schema, esegui il dump e ripristina nel tuo database originale. Questo è un po 'di kludge, naturalmente, ma farà il lavoro.

Se sei avventuroso potresti essere in grado di cambiare il nome del database nel file dump usando un editor esadecimale. Penso che sia menzionato solo in un punto della discarica e fintanto che i nomi dei database vecchi e nuovi siano gli stessi dovrebbe funzionare. YMMV, non fare nulla di simile in un ambiente di produzione, non incolpare me se questo esplode e livella la tua città, e tutto il resto dei soliti disclaimer.


3
2017-11-16 22:49



Rinominare lo schema in un database temporaneo.

Esporta lo schema:

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

Crea un nuovo database. Ripristina l'esportazione:

psql -f prod.sql

ALTER SCHEMA prod RENAME TO somethingelse;

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

(cancella il database)

Per i dati è sufficiente modificare il set search_path in cima.


1
2017-10-09 05:29



Come notato, non esiste un supporto diretto in pg_dump, psql o pg_restore per modificare il nome dello schema durante un processo di dump / restore. Ma è abbastanza semplice esportare usando il formato "semplice", quindi modificare il file .sql. Questo script Bash fa le basi:

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"

}

Uso:

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

0
2018-05-21 03:36