Database Mirroring – Tirando o servidor de Witness do Mirror em caso de falha
Olá Pessoal,
Continuando a série de posts sobre Database Mirroring que já tenho semi prontos (faltam mais 3 posts após esse), segue mais um teste realizado.
O objetivo desse teste é provar que o servidor de produção em um Mirror pode parar mesmo sem acontecer nenhum problema com ele. Em seguida, também é dada uma solução para evitar que isso aconteça.
Instancias participantes dos testes:
1 – Instancia5 – Servidor Principal que chamarei de Servidor A
2 – Instancia5\INST1 – Servidor Mirror que chamarei de Servidor B
3 – Instancia5\INST2 – Servidor Witness que chamarei de Servidor Witness
Nome da database espelhada: Mirror1
Quando o servidor de Witness está no ar ele possui o status CONNECTED na coluna mirroring_witness_state_desc da query abaixo:
SELECT db.name, m.mirroring_role_desc , mirroring_state_desc,mirroring_safety_level_desc,
mirroring_partner_instance, mirroring_witness_state_desc
FROM sys.database_mirroring m
JOIN sys.databases db ON db.database_id = m.database_id
where Name = ‘Mirror1’
Quando o servidor Witness fica indisponível, essa coluna retorna: DISCONNECTED:
Nesse momento, caso o servidor B (Mirror) fique Offline, o servidor de produção também ficará Offline mesmo sem ter acontecido nenhum problema com ele.
Na execução de uma simples query no servidor A: Use Mirror1
O erro abaixo é retornado:
Se no momento em que o servidor Witness ficar Offline, você retirá-lo do mirror, o seu servidor de produção não ficará vulnerável.
Para retirar o servidor Witness, basta executar o comando:
ALTER DATABASE mirror1 set witness off
Eliminando o servidor Witness do mirror, agora a coluna mirroring_witness_state_desc retorna o valor : UNKNOWN
Com isso voltamos para o Operation mode High Safety Without Failorver
Agora o servidor B (Mirror) pode cair que o principal não vai parar.
Minha sugestão: Criar o job com a query abaixo:
if (select mirroring_witness_state_desc
FROM sys.database_mirroring m
JOIN sys.databases db ON db.database_id = m.database_id
WHERE Name = ‘Mirror1’) = ‘DISCONNECTED’
begin
ALTER DATABASE mirror1 set witness off
End
Para adicionar o witness novamente basta executar o comando abaixo:
ALTER DATABASE Mirror1
SET WITNESS = ‘tcp://ambiente5.lab.local:5024’
Artigos relacionados:
Série de Posts sobre Database Mirroring
Database Mirroring – Como alterar o Operation Mode
Database Mirroring – Operation Mode High Performance – Parte 1
Database Mirroring – Operation Mode High Performance – Parte 2
Database Mirroring – Operation Mode High Performance – Parte 3
Database Mirroring – Operation Mode High Safety Without Failover – Parte 1
Database Mirroring – Operation Mode High Safety Without Failover – Parte 2
Database Mirroring – Operation Mode High Safety with Automatic Failover
Database Mirroring – Tempo Failover – HS With Automatic Failover com Timeout
Gostou desse Post?
Cadastre seu e-mail para receber novos Posts e curta minha Página no Facebook para receber Dicas de Leituras e Eventos sobre SQL Server.
Abraços,
Fabrício Lima
MCITP – Database Administrator
Consultor e Instrutor SQL Server
Trabalha com SQL Server desde 2006