it-swarm.it

PostgreSQL: Come creare una copia completa dello schema del database nello stesso database?

Come posso copiare il mio schema public nello stesso database con la struttura completa della tabella, i dati, le funzioni, fk, pk ecc.
La mia versione di Postgres è 8.4
P.S. Devo copiare schema NOT database

27
sigra

Non esiste un modo semplice per farlo in pg_dump/pg_restore stesso. È possibile provare quanto segue se si è in grado di rimuovere temporaneamente il database.

  1. Prendi un dump del tuo schema pubblico usando pg_dump
  2. eseguire "ALTER SCHEMA public RENAME TO public_copy"
  3. Ripristina il dump dello schema pubblico dal passaggio 1 utilizzando pg_restore
24
user1113185
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

Se sei bloccato con php, usa entrambi i tic posteriori

`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`

o il comando exec (). Per il resto puoi usare sed allo stesso modo.

Ecco altri 6 caratteri

9
Scott Marlowe

Utilizzando pgAdmin è possibile effettuare le seguenti operazioni. È piuttosto manuale, ma potrebbe essere tutto ciò di cui hai bisogno. Un approccio basato su script sarebbe molto più desiderabile. Non sono sicuro di come funzionerà se non hai accesso come amministratore e se il tuo database è grande, ma dovrebbe funzionare bene su un database di sviluppo che hai solo sul tuo computer locale.

  1. Fare clic con il tasto destro del mouse sul nome dello schema che si desidera copiare e fare clic su Backup. (Puoi andare più in profondità di questo e scegliere di eseguire il backup della struttura anziché di entrambi).

  2. Assegna un nome al file di backup e scegli anche un formato. (Di solito uso Tar.)

  3. Fai clic su Backup.

  4. Fare clic con il tasto destro del mouse sullo schema da cui è stato eseguito il backup e fare clic su Proprietà e rinominarlo temporaneamente in qualcos'altro. (ad es. nome tempr)

  5. Fare clic sulla radice degli schemi e fare clic con il tasto destro del mouse nel browser degli oggetti, quindi fare clic su crea nuovo schema e assegnare allo schema il nome pubblico. Questo sarà lo schema in cui stai copiando dal tuo backup.

  6. Fare clic con il pulsante destro del mouse sul nuovo schema pubblico dal passaggio 5. e fare clic su Ripristina. Ripristina dal file di backup al passaggio 3.

  7. Rinomina nuovo schema pubblico con un nome diverso (ad es. newschema).

  8. Rinomina schema temprename passa dal passaggio 4 al nome originale.

7
Kuberchaun

Puoi usare

CREATE DATABASE new_db TEMPLATE = old_db;

Quindi rilascia tutti gli schemi che non ti servono:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

L'unico inconveniente è che tutte le connessioni a old_db devono essere determinate prima di poter creare la copia (quindi il processo che esegue l'istruzione CREATE DATABASE Deve connettersi, ad esempio a template1)

Se questa non è un'opzione, pg_dump/pg_restore è l'unico modo per farlo.

5

espandendo su user1113185 risposta , ecco un flusso di lavoro completo usando psql/pg_dump.

Quanto segue esporta tutti gli oggetti di old_schema e li importa in nuovi new_schema schema, come user, nel database dbname:

psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
3
dwelle