A solução que eu criei é o seguinte script:
#!/bin/bash
# Copy/replace myDatabase from Ralph07 to Ralph12
dropdb -e -h 192.168.29.205 --no-password --if-exists -U postgres myDatabase
# createdb -e -h 192.168.29.205 --no-password -U postgres myDatabase # The database will automagically be created
pg_dump -C -h localhost --no-password -U postgres myDatabase | psql -h 192.168.29.205 --no-password -U postgres
192.168.29.205 é o endereço IP (estático) do computador de destino. Seu ip provavelmente será diferente.
Para que a opção --no-password funcione, você terá que editar ~ / .pgpass. O meu (editado!) Parece com o seguinte:
localhost:5432:*:postgres:MyPassword
192.168.29.205:5432:*:postgres:MyPassword
Veja, por exemplo, link para obter uma explicação sobre .pgpass
Você provavelmente também precisará editar o /etc/postgresql/9.6/main/postgresql.conf (se estiver usando o 9.6 do Postgres). Consulte o link
Esta solução parece ser robusta. Eu não tive nenhum problema com isso no curto período em que estive usando (menos de um dia). Se eu tiver problemas, reportarei aqui.
Outras soluções que vi online para descartar o banco de dados (ou seja, entrar no psql) não funcionaram para mim.
O que _não_ funcionou para mim
Para referência, o seguinte NÃO funcionou para eu eliminar o banco de dados.
UPDATE pg_database SET datallowconn = 'false' WHERE datname = 'myDatabase';
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'myDatabase' AND pid <> pg_backend_pid();
DROP DATABASE "myDatabase";
Eu recebo o erro "ERRO: não é possível descartar o banco de dados aberto no momento"
Mais uma pergunta:
Qual é a diferença entre dropdb e o código imediatamente acima?