Eu tenho um banco de dados PostgreSQL 9.4 rodando no CentOS 7.3. O banco de dados é bastante vanilla e instalado via https://yum.postgresql.org/ .
Estou tentando fazer backup deste banco de dados e testar uma restauração em outro host. Se eu tentar restaurar usando --set ON_ERROR_STOP=on
, a restauração falhará. Por que é isso?
Meu procedimento de backup é baseado nas recomendações em https://www.postgresql.org/docs/9.4/static/backup-dump.html . Eu uso o seguinte comando, após uma nova instalação do Postgres, que inclui o initdb.
pg_dumpall --clean | gzip | split --suffix-length=4 --numeric-suffixes --additional-suffix=.split.gz --bytes 1G - postgres.pg_dumpall.
Isso produz uma série de arquivos como este:
[postgres@db1 backups]$ ls
postgres.pg_dumpall.0000.split.gz
postgres.pg_dumpall.0001.split.gz
...
postgres.pg_dumpall.0040.split.gz
[postgres@db1 backups]$
Para restaurar, pensei que poderia usar cat
, gunzip
e psql --set ON_ERROR_STOP=on
. Porém isso não funciona:
[postgres@db2 ~]$ cat postgres.pg_dumpall.*.split.gz | gunzip | psql --set ON_ERROR_STOP=on postgres
SET
SET
SET
ERROR: database "foo" does not exist
[postgres@db2 ~]$
O comando será concluído se eu remover --set ON_ERROR_STOP=on
, mas não tenho certeza se o arquivo de backup é válido ou não.
A
--clean
opção parapg_dumpall
adicionar comandos para descartar cada banco de dados e recriá-los. Se o banco de dados não existir, oDROP DATABASE foo
comando falhará com um erro, o que interromperá seu script comON_ERROR_STOP
ativado.Use
--clean --if-exists
inpg_dumpall
para gerar comandos que primeiro verificarão se o banco de dados existe antes de eliminá-lo. Esses comandos produzirão avisos em vez de erros se o banco de dados não existir.Para remover outros comandos que estão causando um problema, você pode usar
sed
aftergunzip
para remover esse comando do script. Você deve entender o que o comando está fazendo antes de removê-lo (neste caso, tentando excluir o superusuário). Vários comandos sed seriam separados por;
dentro da string entre aspas dada ased
. Este comando deved
eleger as linhas onde o script tentará descartar e recriar apostgres
conta do superusuário.