Exportar e importar um banco de dados PostgreSQL com um nome diferente?

36

Existe uma maneira de exportar um banco de dados PostgreSQL e depois importá-lo com outro nome?

Estou usando o PostgreSQL com Rails e geralmente exporto os dados da produção, onde o banco de dados é chamado de blah_production e importo no desenvolvimento ou teste com os nomes blah_development e blah_staging. No MySQL isso é trivial, pois a exportação não tem o banco de dados em qualquer lugar (exceto um comentário, talvez), mas no PostgreSQL parece ser impossível. Isso é impossível?

Atualmente estou despejando o banco de dados dessa maneira:

pg_dump blah > blah.dump

Eu não estou usando as opções -c ou -C. Esse dump contém instruções como:

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

Quando tento importar com

psql blah_devel < blah.dump

Eu obtenho

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

Talvez o problema não seja realmente o banco de dados, mas o papel?

Se eu despejo desse jeito:

pg_dump --format=c blah > blah.dump

e tente importá-lo desta maneira:

pg_restore -d blah_devel < tmp/blah.psql

Eu recebo esses erros:

pg_restore: WARNING:  database "blah" does not exist
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1513; 1259 16435 TABLE checks blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.checks OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1509; 1259 16409 TABLE users blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1508; 1259 16407 SEQUENCE users_id_seq blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users_id_seq OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1824; 0 0 ACL public postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: REVOKE ALL ON SCHEMA public FROM postgres;
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: GRANT ALL ON SCHEMA public TO postgres;
WARNING: errors ignored on restore: 11

Alguma idéia?

Eu vi algumas pessoas usando scripts sed para modificar o despejo. Eu gostaria de evitar essa solução, mas se não houver alternativa, vou aceitar. Alguém escreveu um script para alterar o nome do banco de dados do despejo para garantir que nenhum dado seja alterado?

    
por pupeno 28.01.2011 / 16:31

3 respostas

40

A solução foi despejar assim:

pg_dump --no-owner --no-acl blah > blah.psql

e importá-lo assim:

psql blah_devel < blah.psql > /dev/null

Ainda recebo este aviso:

WARNING:  database "blah" does not exist

mas o resto parece funcionar.

    
por 29.01.2011 / 21:48
11

Se você estiver criando um dump de texto, poderá exportar o banco de dados sem os CREATE DATABASE bits (ou seja, não especifique as opções -c e - C para pg_dump ); Isso impedirá que o Postgres tente descartar, crie & conectar-se ao banco de dados.

Se você estiver usando um dos formatos de arquivo, poderá especificar a opção -d para pg_restore para nomear o banco de dados para o qual deseja restaurar.

Verifique as páginas de manual para pg_dump e pg_restore para obter mais detalhes, e não se esqueça de montar um macaco de rascunho antes de tentar isso nos sistemas de produção, caso eu tenha deixado de fora alguns detalhes importantes.

    
por 28.01.2011 / 16:51
6

Agora o pg_restore tem a opção -d e você pode definir o nome do banco de dados para importar dados.

na origem :

pg_dump -v -Fc mydb.dmp mydb

em dest :

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp

    
por 09.12.2015 / 09:07