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


26

Come posso copiare il mio publicschema nello stesso database con la struttura completa della tabella, i dati, le funzioni, fk, pk ecc. La
mia versione di Postgres è 8.4
PS Ho bisogno di copiare lo schema NON il database


Hai più schemi o solo public?
a_horse_with_no_name

Ho schemi pubblici e demo. E devo copiare la demo per creare un account demo ...

Questa sarebbe una cosa utile da fare.
Kuberchaun,

Risposte:


19

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 del tuo schema pubblico dal passaggio 1 usando pg_restore

come posso accedere a pg_dump e pg_restore tramite PHP?

Dipende da dove stai eseguendo il database. Puoi accedere a pg_dump e pg_restore dalla shell sul tuo server. Se non si dispone dell'accesso alla shell, è possibile provare a utilizzare PHP shell_exec , altrimenti è necessario cercare un metodo di backup alternativo, magari utilizzando uno strumento GUI PostgreSQL

1
+1 Questa è la soluzione più intelligente finora. Comando di shell sarebbe simile a questa ( più nel manuale ): pg_dump -n my_schema -f '/path/to/file.pgsql' my_db. Più semplice come superutente ( postgres) con peerautorizzazione pw-less in pg_haba.conf. Ripristino dopo aver rinominato lo schema originale: psql my_db -f '/path/to/file.pgsql'. Se si dispone di un dump SQL semplice, non è così necessario pg_restore.
Erwin Brandstetter,

C'è un modo semplice, vedi la mia risposta. pg_dump supporta l'opzione -n ​​per la scelta di uno schema. Quindi basta modificare il nome dello schema nel dump e ricaricare.
Scott Marlowe,

2
La semplice ridenominazione dello schema non aggiorna i riferimenti all'interno delle funzioni: gist.github.com/pschultz/5387172 . Sostituire il nome è che il dump è molto più affidabile se si ottiene la ricerca e si sostituisce correttamente.
Peter,

9
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


1
è più sicuro rinominare lo schema e ricaricare lo schema originale di cui è stato eseguito il backup, specialmente quando il nome dello schema potrebbe apparire come contenuto (ad es public.).
artm,

7

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. (per esempio temprename )

  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 tasto destro del mouse sul nuovo schema pubblico dal passaggio 5. e fare clic su Ripristina. Ripristina dal file di backup al passaggio 3.

  7. Rinominare il nuovo schema pubblico con un nome diverso (ad es. Newschema ).

  8. Rinomina la modifica del nome tem dello schema dal passaggio 4 al nome originale.


Il nuovo schema creato nel passaggio 5 deve avere lo stesso nome dello schema di cui è stato eseguito il backup, altrimenti pgAdmin non ripristinerà nulla.
Cao Minh Tu

5

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 il CREATE DATABASE istruzione deve connettersi, ad esempio a template1)

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


1
Prima di porre questa domanda, ho usato un metodo simile per clonare un database. Ma passa molto tempo e penso che la clonazione di solo schema sia molto più veloce ...

@sigra: il metodo di clonazione di a_horse è il più veloce disponibile per i database, perché i file effettivi possono essere appena copiati, il che consente di risparmiare un sacco di sovraccarico. Dubito che un dump e il ricaricamento dello schema saranno più veloci a meno che lo schema non sia solo una piccola parte dell'intero db. Quindi, +1 per questa risposta anche se non risponde alla domanda effettiva posta.
Erwin Brandstetter,

È un sacco di lavoro per clonare un singolo schema. scaricare lo schema, rinominarlo nel dump e ricaricare è molto più veloce.
Scott Marlowe,

@ScottMarlowe: dipende da quale sia lo schema più grande. Se il più grande è uno di quelli abbandonati, allora sì, sono d'accordo.
a_horse_with_no_name l'

2

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

Quanto segue esporta tutti gli oggetti old_schemae li importa nel nuovo new_schemaschema, come usernel dbnamedatabase:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.