Estou testando uma atualização do PostgreSQL 8.2.1 para 9.2 em uma máquina virtual executando uma distribuição Linux personalizada. O procedimento de atualização é o seguinte:
- Iniciar o
pg
serviço - Vácuo todos os DBs (não tenho certeza se isso é necessário)
- Backup com
pg_dumpall
- Interrompa o
pg
serviço - Afaste o diretório em que os dados estão armazenados (
/var/pg
; é uma configuração simples de servidor único) - Instale o PostgreSQL 9.2
initdb
- Iniciar o servidor
- Restaurar os dados despejados
reindexdb
todos os bancos de dados- Recrie a
referential_constraints
visualização - Limpe todos os DBs (é necessário o AFAIK após esta atualização)
Este procedimento funciona bem em um host, fazendo backup e restaurando sem problemas. Em outra máquina com um banco de dados diferente, os pontos 1 a 7 funcionam bem, mas o servidor não inicia a menos que eu adicione um sleep 1
depois initdb
, e mesmo assim os dados despejados não podem ser restaurados porque "o sistema do banco de dados está inicializando". Quais são as formas padrão de lidar com isso, exceto por esses terríveis hacks:
sleep
por um período generoso de tempo antes de qualquer operação,- até que funcione ou até que um tempo limite generoso seja alcançado, ou
- até aceitar uma consulta trivial ou atingir um tempo limite.
Edit: A " solução " não funcionou, afinal. O que é necessário para garantir que o banco de dados esteja pronto para executar uma restauração?
fonte
initdb
status de saída? Suponho que quando o trabalho estiver pronto.initdb
é executado de forma síncrona, portanto, quando o servidor é iniciado, eleinitdb
já foi concluído com êxito.Respostas:
O initdb não retorna até que esteja concluído; portanto, não deve haver nenhuma pausa entre ele e a inicialização do servidor. Houve erros no PostgreSQL, onde ele foi concluído sem liberar tudo para o disco primeiro. Não conheço nenhuma esquerda agora, mas a natureza dos bugs é que você nem sempre sabe sobre eles.
Se você usar o comando pg_ctl para iniciar o banco de dados, use os parâmetros "-w" para aguardar até que a inicialização seja concluída antes de retornar. Não faz nada extravagante - apenas faz o "já está pronto?" loop para você.
Observe que, se ocorrer uma falha no servidor com muitos dados que precisam ser reproduzidos antes que o servidor possa iniciar, o tempo limite definido por "-t" na espera do pg_ctl poderá ser muito baixo.
Não há motivo para VACUUM os bancos de dados de origem antes de fazer um pg_dump deles. Embora possa acelerar um pouco o despejo, o próprio vácuo levará mais tempo do que essa melhoria.
fonte
pg_restore -j
{morethan1}).postmaster
para iniciar o daemon, e ele não parece ter essa opção.o
trabalhandoA solução quebrada foi modificar o script init para verificar repetidamente se a porta relevante está em uso. Se não aparecer após um minuto, a inicialização é considerada como tendo falhado. Pseudo-código:Edit: Acontece que isso não é suficiente. A etapa de restauração:
Mensagem de erro:
fonte