Estou executando um script powershell no Windows que se conecta a um banco de dados postgres.
Em condições normais, tudo funciona bem, mas estou tentando tornar o sistema mais robusto e fazer tudo reiniciar automaticamente após uma falha de energia ou reinicialização.
O problema é que, embora tanto o script quanto o banco de dados sejam iniciados com êxito na inicialização, o script faz muito mais rapidamente - na verdade, ele é reiniciado antes que o banco de dados fique disponível.
O script se conecta com uma string de conexão que inclui isso....
Timeout=60;CommandTimeout=8
Meu entendimento (talvez falho?) é que Timeout=60
se refere ao tempo limite da conexão e deve significar "tente se conectar ao banco de dados por até 60 segundos e, se nenhuma conexão for feita, encerre com uma mensagem de erro". Porém, na prática a tentativa de conexão falha imediatamente com o erro
the database system is starting
Por que está falhando imediatamente e não espera por 60 segundos? Existe alguma maneira de testar se o banco de dados foi reiniciado antes de tentar se conectar? Ou eu só preciso continuar tentando me conectar até que seja bem-sucedido?
O tempo limite só funciona como você espera quando o banco de dados está funcionando e em um estado adequado para "negociar" e aceitar conexões. É quando essa "negociação" demora muito que você obtém o tempo limite.
No entanto, até que o banco de dados entre nesse estado, ele efetivamente não está lá , como se o servidor estivesse inativo, portanto, o argumento de tempo limite não entra em jogo.
Seu cluster PostgreSQL provavelmente iniciará como um serviço do Windows.
Os serviços podem ter dependências entre eles para que eles iniciem na "ordem certa". Talvez seja necessário empacotar seus scripts para que possam ser controlados por meio da mesma infraestrutura de serviço.
Ou você apenas coloca uma chamada para timeout em seu script e o faz "esperar" um pouco, na esperança de que o banco de dados esteja pronto no momento em que continuar.