Come posso copiare il mio public
schema 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
Come posso copiare il mio public
schema 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
Risposte:
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.
pg_dump -n my_schema -f '/path/to/file.pgsql' my_db
. Più semplice come superutente ( postgres
) con peer
autorizzazione 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
.
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
public
.).
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.
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).
Assegna un nome al file di backup e scegli anche un formato. (Di solito uso Tar.)
Fai clic su Backup.
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 )
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.
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.
Rinominare il nuovo schema pubblico con un nome diverso (ad es. Newschema ).
Rinomina la modifica del nome tem dello schema dal passaggio 4 al nome originale.
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.
espandendo sulla risposta user1113185 , ecco un flusso di lavoro completo usando psql / pg_dump.
Quanto segue esporta tutti gli oggetti old_schema
e li importa nel nuovo new_schema
schema, come user
nel dbname
database:
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
public
?