PostgreSQL: Como criar uma cópia completa do esquema do banco de dados no mesmo banco de dados?


26

Como posso copiar meu publicesquema no mesmo banco de dados com estrutura de tabela completa, dados, funções, fk, pk e etc.
Minha versão do Postgres é 8.4
PS. Preciso copiar o esquema NÃO do banco de dados


Você tem mais esquemas, ou apenas public?
a_horse_with_no_name

Eu tenho esquemas públicos e de demonstração. E eu preciso copiar de demonstração para a criação de conta demo ...

Isso seria útil para você poder fazer.
precisa saber é o seguinte

Respostas:


19

Não há uma maneira simples de fazer isso no próprio pg_dump / pg_restore. Você pode tentar o seguinte se conseguir remover o banco de dados temporariamente.

  1. Faça um despejo de seu esquema público usando pg_dump
  2. execute "ALTER SCHEMA public RENAME TO public_copy"
  3. Restaure seu dump do seu esquema público da etapa 1 usando pg_restore

como posso acessar pg_dump e pg_restore via PHP?

Isso depende de onde você está executando o banco de dados. Você pode acessar o pg_dump e o pg_restore no shell do seu servidor. Se você não tem acesso shell, então você pode tentar usar do PHP shell_exec , caso contrário, você precisa olhar para um método de backup alternativa, talvez usando um PostgreSQL GUI Ferramenta

11
+1 Essa é a solução mais inteligente até agora. Comando Shell seria algo parecido com este ( mais no manual ): pg_dump -n my_schema -f '/path/to/file.pgsql' my_db. Mais fácil como superusuário ( postgres) com peerautorização sem pw pg_haba.conf. Restaurar depois de ter renomeado o esquema original: psql my_db -f '/path/to/file.pgsql'. Se você possui um dump SQL simples, não precisa pg_restore.
Erwin Brandstetter

Existe uma maneira fácil, veja minha resposta. O pg_dump suporta a opção -n para escolher um esquema. Em seguida, basta editar o nome do esquema no dump e recarregar.
Scott Marlowe

2
Simplesmente renomear o esquema não atualizará as referências dentro das funções: gist.github.com/pschultz/5387172 . Substituir o nome é despejo é muito mais confiável se você buscar e substituir corretamente.
Peter

9
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

Se você está preso ao php, use os tiques traseiros

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

ou o comando exec (). Para a mudança, você pode usar o sed da mesma maneira.

Aqui estão mais 6 caracteres


11
é mais seguro renomear o esquema e carregar de volta o esquema original em backup, especialmente quando o nome do esquema pode aparecer como conteúdo (por exemplo public).
Art

7

Usando o pgAdmin, você pode fazer o seguinte. É bem manual, mas pode ser tudo o que você precisa. Uma abordagem baseada em script seria muito mais desejável. Não tenho certeza de como isso funcionará se você não tiver acesso de administrador e se o seu banco de dados for grande, mas deve funcionar bem em um banco de dados de desenvolvimento que você possui no computador local.

  1. Clique com o botão direito do mouse no nome do esquema que deseja copiar e clique em Backup. (Você pode ir mais fundo que isso e escolher apenas fazer backup da estrutura em vez de ambas).

  2. Atribua um nome ao arquivo de backup e também escolha um formato. (Eu costumo usar Tar.)

  3. Clique em backup.

  4. Clique com o botão direito do mouse no esquema do qual você fez backup e clique em Propriedades e renomeie-o para outra coisa temporariamente. (por exemplo, temprename )

  5. Clique na raiz dos esquemas e clique com o botão direito do mouse no navegador de objetos, clique em criar novo esquema e dê ao esquema o nome de público . Esse será o esquema no qual você está copiando do seu backup.

  6. Clique com o botão direito do mouse no novo público de esquema da etapa 5. e clique em restaurar. Restaure a partir do arquivo de backup na etapa 3.

  7. Renomeie o novo esquema público para um nome diferente (por exemplo, newschema ).

  8. Esquema Rename temprename mudança do passo 4 de volta para o nome original.


O novo esquema criado na etapa 5 deve ter o mesmo nome do esquema do qual você fez backup, caso contrário, o pgAdmin não restaurará nada.
Cao Minh Tu

5

Você poderia usar

CREATE DATABASE new_db TEMPLATE = old_db;

Solte todos os esquemas que você não precisa:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

A única desvantagem é que todas as conexões com o old_db devem ser determinadas antes que você possa criar a cópia (portanto, o processo que executa o CREATE DATABASE instrução deve se conectar, por exemplo, ao template1)

Se isso não for uma opção, pg_dump / pg_restore é a única maneira de fazer isso.


11
Antes de fazer essa pergunta, usei um método semelhante de clonar um banco de dados. Mas gasta muito tempo e acho que a clonagem de apenas esquema é muito mais rápido ...

@sigra: o método de clonagem do a_horse é o mais rápido disponível para bancos de dados, porque os arquivos reais podem ser apenas copiados, o que economiza muita sobrecarga. Duvido que um despejo e uma recarga do esquema sejam mais rápidos, a menos que o esquema seja apenas uma pequena parte de todo o banco de dados. Portanto, marque +1 nesta resposta, mesmo que ela não responda à pergunta real.
Erwin Brandstetter

É muito trabalhoso clonar um único esquema. despejar o esquema, renomeá-lo no despejo e recarregar é muito mais rápido.
Scott Marlowe

@ ScottMarlowe: depende de qual é o maior esquema. Se o maior é um dos descartados, sim, eu concordo.
a_horse_with_no_name

2

expandindo a resposta user1113185 , aqui está um fluxo de trabalho completo usando o psql / pg_dump.

A seguir, exporta todos os objetos old_schemae os importa para um novo new_schemaesquema, como userno dbnamebanco de dados:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.