Estou configurando o failover automático de banco de dados em C # com o SQL Server 2008 e tenho uma 'alta segurança com espelho de failover automático' usando uma instalação de testemunha e minha cadeia de conexão se parece com
"Server=tcp:DC01; Failover Partner=tcp:DC02; database=dbname; uid=sewebsite;pwd=somerndpwd;Connect Timeout=10;Pooling=True;"
Durante o teste, quando eu desativo o serviço SQL Server no servidor principal, o failover automático funciona como um encanto, mas se eu colocar o servidor principal offline (desligando o servidor ou eliminando a placa de rede), o failover automático não funciona e meu site apenas atinge o tempo limite.
Encontrei este artigo em que o segundo último post sugere que é porque estamos usando pipes nomeados que não funcionam quando o principal fica offline, mas forçamos o TCP em nossa cadeia de conexão.
O que estou faltando para que esse failover automático de banco de dados funcione?
fonte
Respostas:
Depois de trabalhar com a MS por uma semana, descobrimos por que isso acontece.
Essencialmente, o aplicativo não está executando o failover porque precisa ter certeza de que o banco de dados falhou - e a conexão sql está atingindo o tempo limite antes que a conexão determine que o banco de dados falhou.
O processo para confirmar se o banco de dados falhou (com todas as configurações padrão do registro tcp) é:
Quando o principal está inoperante, essa comunicação leva cerca de 21 segundos porque:
Portanto, se a sua conexão sql não estiver aguardando 21 segundos (provavelmente mais na realidade), o tempo limite será excedido antes de terminar esta dança e não sofrerá failover.
A solução é definir o tempo limite da sua cadeia de conexão para um valor grande; usamos 60 segundos apenas para garantir a segurança.
Felicidades
fonte
Gostaria de saber se as condições do failover automático não estão sendo atendidas no momento dos seus testes? Especificamente - se o banco de dados não estiver sincronizado com o espelho (verifique o estado de espelhamento de sys.database_mirroring) no momento da falha E / OU se a testemunha e o espelho não estiverem conectados naquele momento (teste por pings entre as funções participantes).
Você também pode ter uma situação em que seu Parceiro e o Espelho não estejam conectados, mas os bancos de dados do parceiro e do Espelho ainda estejam conectados à testemunha de forma independente. Nesse caso, a testemunha não vê nada de errado (e, portanto, nenhum failover). Mas você mencionou que desligou o servidor, portanto isso parece menos provável.
Ou você está dizendo que o failover eventualmente acontece, mas sua reconexão falha? Nesse caso, o tempo de detecção e failover varia dependendo de como o principal falhou e o tempo total para recuperar o banco de dados espelho.
fonte