Loading…

Database Mirroring – Operation Mode High Performance – Parte 3

Fala Pessoal,

Neste post continuarei o teste do Operation Mode High Performance. Caso ainda não tenham visto os posts anteriores, sugiro que os leia antes de continuar:

Database Mirroring – Operation Mode High Performance – Parte 1

Database Mirroring – Operation Mode High Performance – Parte 2

Novamente, com o loop de insert rodando no servidor A (Principal), para esse teste, eu parei o serviço do SQL Server do servidor A:

Contudo, dessa vez o pessoal da infraestrutura não conseguiu resolver o problema do Servidor A. Logo, eu tive que acabar com o mirror para que o Log da database do servidor B não ficasse crescendo sem parar.

Para acabar com o mirror, executei o comando: alter database mirror1 set partner off

Logo após, rodando a query abaixo, é possível ver que o mirror não existe mais:
SELECT db.name, mirroring_state_desc, mirroring_safety_level_desc,mirroring_witness_state_desc
FROM sys.database_mirroring m
JOIN sys.databases db ON db.database_id = m.database_id
where name = ‘Mirror1’

Mesmo com o mirror não existindo mais, a base do servidor B continua com o status restoring:

Para deixá-la online, deve-se rodar o comando: restore database mirror1 with recovery

Entretanto, ao executá-lo, recebi o seguinte erro:

Msg 5094, Level 16, State 2, Line 1
The operation cannot be performed on a database with database snapshots or active DBCC replicas.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

Isso aconteceu porque eu tinha um snapshot na database do servidor B que era o mirror.

Esse snapshot deve ser excluído com o comando abaixo:
drop database mirror1_snapshot

Onde Mirror1_Snapshot é o nome da database snapshot que eu criei. Posteriormente farei um post sobre database snapshot no database mirroring.

Executando o comando “restore database mirror1 with recovery” novamente, a database ficou online.

Algum tempo depois a galera da Infraestrutura abriu um chamado no fornecedor de Hardware e conseguiram voltar o servidor A. Ao fazer isso, a database desse servidor também ficou online automaticamente. Isso pode gerar um problema grave, pois imagina se existirem muitas aplicações e serviços apontando para o servidor A. Quando o servidor A morre e o servidor B passa a receber as aplicações e serviços, ele se torna o servidor com dados mais atualizados. Agora, imagina que você esqueceu de redirecionar alguma aplicação ou serviço do servidor A para o B, quando o servidor A fica disponível, suas aplicações e serviços podem ficar manipulando dados no servidor A e B. Isso vai gerar um GRANDE problema dependendo do tamanho do seu ambiente. Então, deve-se ter um cuidado especial com essa situação e mapear TODAS as aplicações e serviços que utilizam uma database presente em um Database Mirroring.

Uma solução para isso seria um redirecionamento de DNS. As aplicações utilizariam um ALIAS chamado DBProducao e esse ALIAS apontaria para um servidor físico chamado ServerA com IP 192.0.0.1. Caso aconteça algum problema com esse servidor, o database mirror fará um failover para o serverB com IP 192.0.0.2. Assim, basta você realizar o redirecionamento de DNS do Alias DBProducao para que ele responda pelo IP 192.0.0.2. Com isso, não existe o risco de nenhuma aplicação ou serviço gravar dados em um local indevido.

Continuando o teste, agora vamos verificar como ficou a sincronização dos dados entre os dois servidores com a volta do servidor A.

O servidor B (ambiente5\inst1) que era o mirror, possui dados até o Cod e data abaixo:
Cod: 32610        Data: 2012-01-05 15:25:12.710

Após o servidor A (que era o Principal) ficar online, executei a query abaixo para selecionar os dados que existiam no servidor A, mas ainda não haviam sido espelhados para o servidor B:

select * from mirror1..Teste where cod >= 32610 order by data desc

Comparando o resultado cheguei à conclusão:

Perdi dados de 2012-01-05 15:25:12.710 até 2012-01-05 15:25:22.747, ou seja, 10 segundos.

Isso porque meu ambiente estava fazendo apenas um insert em uma tabela. Agora imagina em um ambiente grande onde a quantidade de dados atualizados é alta. A perda de dados seria considerável. Contudo, ela ainda pode ser menor do que se você tivesse apenas uma rotina de backup e perdesse os arquivos de log de alguma database. Nesse caso, você não conseguiria salvar o Tail Log e só teria os backups do log já realizados. Como esse job deve rodar a cada 5 minutos, por exemplo, a perda de dados pode ser muito maior do que em um mirror com High Performance.

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

Até o próximo post.

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

Deixe uma resposta