por que o pg_restore ignora --create? Erro: falha: FATAL: o banco de dados "new_db" não existe

16

Estou tentando executar o seguinte comando:

sshpass  -p "pass" ssh  x@1.2.3.4 "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db

Eu recebo:

failed: FATAL:  database "new_db" does not exist
andilabs
fonte

Respostas:

19

Isso ocorre porque é assim que o pg_restore funciona.

O manual do pg_restore tem a seguinte redação :

-C, --create Crie o banco de dados antes de restaurá-lo. Se --clean também for especificado, descarte e recrie o banco de dados de destino antes de conectar-se a ele.

Quando essa opção é usada, o banco de dados nomeado com -d é usado apenas para emitir os comandos DROP DATABASE e CREATE DATABASE iniciais . Todos os dados são restaurados no nome do banco de dados que aparece no arquivo morto .

O -d será restaurado no banco de dados especificado se e somente se -C não for usado. Se -C for usado, o banco de dados será usado como uma "barra de ativação", não como o destino.

SCO
fonte
6
Para esclarecer: não há como criar um nome de banco de dados arbitrário e restaurá-lo com ele pg_restore. A opção -C pode criar apenas um banco de dados cujo nome corresponde ao nome do banco de dados no arquivo de despejo. Para restaurar em um banco de dados arbitrário, você deve executar o CREATE DATABASE new_db;psql antes de executar pg_restore --dbname=new_db.
Lucas
meu comandodocker-compose -p dump_import -f docker/dump_import.yml run --rm be bash -c 'waitforit -host=postgres -port=5432 -timeout=30 && export PGPASSWORD=$DATABASE_PASSWORD && createdb --echo --port=$DATABASE_PORT -host=$DATABASE_HOST --username=$DATABASE_USER $DATABASE_NAME && pg_restore --format=c --dbname=$DATABASE_URL_WITHOUT_QUERY tmp/full.dump && echo "Import done"'
srghma
5
Por que as ferramentas precisam ser confusas quando podem ser fáceis?
Augustin Riedinger
8

Em resumo, você deseja (limpar existente): (observe o nome do banco de dados postgres)

pg_restore -c -d postgres db.dump

ou (criar novo)

pg_restore -C -d postgres db.dump

ou (criar novo explicitamente)

createdatabase the_database
pg_restore -d the_database db.dump

Veja o que a SCO disse para mais detalhes.

lzap
fonte
Sua primeira sugestão não funcionou na pg_restore: [archiver] -C and -c are incompatible options
versão
Posso confirmar que isso funciona (após a edição e após corrigir o erro de ortografia do "postgres"). pg_restore -C -d postgres db.dumppode parecer assustador, mas não faz nada no banco de dados do postgres, apenas o usa para a conexão inicial.
Zilk 16/03/19
0

Para ser um pouco mais explícito, foi o que fiz que resolveu o problema para mim:

  1. Crie um banco de dados vazio com o nome que você deseja: (no meu caso, o nome de usuário era 'postgres')

    psql -U [username]

Em seguida, será solicitada sua senha. Neste ponto, você estará logado como [nome de usuário]. Digite o seguinte:

    CREATE DATABASE [dbname];

Agora saia da sessão e volte à sua sessão normal do terminal.

  1. Restaure o banco de dados do arquivo em que você definiu o nome do banco de dados de destino como o nome do banco de dados que você acabou de criar.

    cat [your_file_path/filename] | psql -U [username] [dbname]

Onde [your_file_path / filename] é o local do arquivo db ou do arquivo de texto que você deseja restaurar.

AntiPawn79
fonte
Ao criar o backup usando a -Fopção de, é necessário usar o pg_restore para restaurar o backup, a menos que você use o -F pque produz um arquivo de texto sem formatação com frases sql.
EAmez 9/09/19