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.
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?
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.
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