Estou tentando executar o seguinte comando:
sshpass -p "pass" ssh [email protected] "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db
Eu recebo:
failed: FATAL: database "new_db" does not exist
Estou tentando executar o seguinte comando:
sshpass -p "pass" ssh [email protected] "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db
Eu recebo:
failed: FATAL: database "new_db" does not exist
Isso ocorre porque é a maneira como o pg_restore funciona.
O manual do pg_restore é o seguinte:
O -d restaurará no banco de dados fornecido se e somente se -C não for usado. Se -C for usado, o banco de dados será usado como "launchpad", não como destino.
Em resumo, você quer (limpar existente): (observe que o nome do banco de dados é
postgres
)ou (criar novo)
ou (criar novo explicitamente)
Veja o que a SCO disse para mais detalhes.
Deixe-me reformular a resposta do @Izap, porque eu tive que ler todas as respostas várias vezes para descobrir as coisas ...
As ferramentas de gerenciamento de banco de dados precisam, em alguns casos, de um banco de dados para se conectar, a fim de realizar operações de manutenção.
pg_restore
precisa de um, por exemplo, quando solicitado a criar o banco de dados para o qual restauraremos os dados.Vamos parar e definir alguns termos aqui:
Portanto, o problema que vejo
pg_restore
é que ele usa a mesma semântica (mesmo parâmetro de opção) para 2 coisas completamente diferentes.-d
/--dbname
é entendido como o banco de dados de manutenção quando--create
usado. No entanto, quando não é usado, de--dbname
repente se torna o banco de dados de destino .Vamos defini-los em nosso shell para maior clareza:
Então você tem:
Isso significa que , apenas removendo a
--create
opção, pode-se inadvertidamentepg_restore
usar o banco de dados de manutenção como o banco de dados de destino .Eu gostaria que eles tivessem feito a escolha de usar
--maintenance-db
como emcreatedb
, sempre usando--dbname
para o alvo.Para ser um pouco mais explícito, foi isso que eu fiz que resolveu o problema para mim:
Crie um banco de dados vazio com o nome que você deseja: (no meu caso o nome de usuário era 'postgres')
Em seguida, ele solicitará sua senha. Neste ponto, você estará logado como [nome de usuário]. Digite o seguinte:
Agora saia da sessão e volte para sua sessão de terminal normal.
Restaure o banco de dados do arquivo que você configurou o nome do banco de dados de destino como o nome do banco de dados que você acabou de criar.
Onde [your_file_path/filename] é o local do arquivo db ou arquivo de texto que você deseja restaurar.