Queda conexão MySql (sc_apl_default)

Existe alguma macro (ou outra forma limpa) que redirecione para uma determinada aplicação quando a conexão com o banco de dados é interrompida, assim como a nova sc_apl_default?

Em situações específicas preciso reiniciar o servidor do BD e aí a mensagem de erro do MySql aparece na tela, e isso não é nada profissional. Quero redirecionar o sistema para o banco espelhado quando o principal “cair” e vice versa.

Certamente alguém já passou por isso. Como resolveu?

Desde já agradeço.

Nelson bom dia,

Programaticamente eu desconheço, pode ser que algum colega mais experiente já tenha feito isso, mas eu não sei se tem de fato. O que é feito é o redirecionamento diretamente no próprio host para que, caso caia a conexão com o banco, o host automaticamente cria a conexão para outro provedor, mas isso leva sempre alguns segundos e pode ocasionar uma rápida interrupção do acesso.

EU nunca passei por isso não. Meu banco fica no ar 24 horas do dia.

Ficar testando a conexão a cada n segundos seria um desgaste desnecessário.

Ideal mesmo é o banco não sair do ar.

Se for propositalmente tirar o banco do ar deve antes avisar os usuários e travar o sistema.

Geralmente manutenções programadas são avisadas com antecedência.

Nunca aconteceu isso comigo em 11 anos com o SC. Verifique seu provedor-servidor.

No meu caso, o banco tem alguns milhões de registros que são acessado 24x7 e quando preciso reiniciar o servidor master (por motivos que não são relevantes para a questão), o sistema fica temporariamente indisponível. Seria bem fácil verificar se a conexão está disponível, se o SC permitisse, ou houvesse uma macro de escape para essa situação. O problema é que parece que a primeira coisa que o SC faz ao carregar uma App é a conexão com o banco e não dá para colocar nenhum código antes disso. ou dá?

Reiniciar o servidor de banco de dados com o sistema em uso não é relevante a questão? Mas é justamente por isso que sua aplicação perde a conexão e é justamente por isso que postou ese tópico aqui.
Meus servidores tem reiniciação automática aos domingos de madrugada.
O SC e ferramenta alguma vai ter uma função que detecte a queda da conexão. Nem reescrevendo todo o seu sistema na unha prevendo todas as falhas e realizando algum procedimento de prevenção.

eu faria assim

se for na conexão eu criaria uma aplicação blank e colocaria como a aplicação inicial, nela testaria o acesso ao Banco
com pdo manualmente, pode usar o PDOException para retornar erro e redirecionaria para uma outra aplicação blank com uma mensagem, caso Ok ai vai para o seu login

se for no select colocaria algo em cada aplicação no onApplicationInit para verificar se esta OK, caso de erro redirecionaria para a mensagem, se ok não faria nada

único problema que se cair no meio de um insert ou update o usuário perderia os dados inseridos, isto não tem solução

Valeu Jair, foi exatamente assim que fiz, criei uma aplicação blank e coloquei como app inicial, mas isso só resolve a entrada, durante a navegação terei que testar a conexão antes de cada app chamada, o que seria bem simples se o SC não executasse a conexão antes de qualquer outro evento.
O que questionei seria ainda mais simples se o próprio SC pudesse redirecionar para uma outra app quando ele tenta uma conexão e ela falha.

Haroldo obrigado por responder, mas a causa da parada do servidor realmente não é relevante para o que questionei. A questão é sobre o SC. O servidor parou, seja lá por que motivo for, e ponto. Como o SC pode me ajudar a contornar um problema cuja resolução, no momento, depende de terceiros?

O tratamento de falhas de conexão com o SGBD é uma premissa básica de qualquer sistema. Deveria haver algo no SC para tratar isso, pelo menos redirecionando para outra app, e não printando um erro de conexão na tela usuário.

Coloque um servidor apache ou nginx em separado para fazer Load Balance.
E deixe os servidores de banco atrás dele.

O Scriptcase não faz.
E desde 2006 não me lembro de uma solicitação semelhante neste fórum.

Para tal tem que fazer um sistema na unha onde antes de cada instrução de INSERT, UPDATE, REPLACE, DELETE deve realizar um teste de conexão para saber se o banco esta no ar ou não e caso não, desviar para uma tela de mensagem bloqueando o acesso até o retorno do banco.

O Load Balance cai na questão de ser irrelevante o motivo de tirar o servidor do ar, algum banco de dados tem que servir ( o load balance faz isso) os dados as aplicações.
O Banco estaria em 2 servidores com sincronismo bidirecional (master to master).
Mas a questão pelo que eu entendi é: Vou desligar o servidor de bancos de dados e não vou avisar antecipadamente os usuários, quero que as aplicações detectem a falta de conexão e parem imediatamente desviando para algum lugar (uma tela de mensagem, sei lá o que) até que o servidor volte. Não pode haver corrupção de dados.

Para Load Balance necessita investimento em 3 servidores.

  • O Load Balance resolve. O Scriptcase não resolve.

Mas vamos lá:

Preciso desligar o servidor.
Aciono um parâmetro no sistema que força todos usuários irem alterando a conexão para outro servidor.
Eu acompanho até todos os usuários estiverem conectados no outro servidor espelhado.
Reinicio o servidor. Altero o parâmetro para os usuários voltarem ao servidor principal.

  • Só não posso reiniciar ainda com usuário conectado nesse servidor.

ou

Investir em Load Balance.

https://king.host/blog/2018/07/load-balance/

Boa, Alexandre, não tinha me lembrado dessa possibilidade, apesar de já usar o NGNIX como balanceador de carga da aplicação que acessa o banco.

Haroldo, nosso banco tem sincronismo bidirecional master/master, como você mencionou, e estão em dois datacenters diferentes, ou seja, já temos os dois servidores, montar um terceiro com o load balance é questão de poucos minutos. Vamos avaliar.

De qualquer forma, não seria muito mais simples se o SC tivesse uma macro para redirecionar a aplicação em caso da conexão falhar? Poderíamos ter uma aplicação para tratar o problema de forma adequada.

Nas topologias mais comuns, o banco está em um servidor diferente da aplicação. O fato do SGBD estar rodando não significa que a aplicação vai conseguir conectá-lo (tem a rede no meio), principalmente se estiverem em datacenters diferentes. É possível que sua aplicação em algum momento perca conexão com o BD e você nem fique sabendo, já que também não dá para gerar um log dessas falhas. Já pensou nisso?

Considero minha questão respondida.
Obrigado pelas contribuições.

Sugestão boa.
Será que a macro https://www.scriptcase.com.br/docs/pt_br/v9/manual/14-macros/01-visao-geral/#sc_error_continue em conjunto com a https://www.scriptcase.com.br/docs/pt_br/v9/manual/14-macros/01-visao-geral/#sc_error_exit
Não seriam um paleativo?