Life Consultant: Restore With StandBy

Posted on abril 8, 2013

4


Nessa vida de consultor, passamos por diversos desafios e dificuldades, é difícil ganhar espaço, pelo menos de primeira impressão, sempre passamos por essa repulsa é normal, mas com o tempo e mostrando seu trabalho tudo se normalizada. Com isso diversos desafios serão entregues em sua mão e você terá que dar sempre a melhor solução para a equipe e organização.

Essa série irá mostrar algumas das dificuldades e problemas que passamos nesse ramo. Irei detalhar o cenário e com isso a melhor solução encontrada para atender o problema.

 

O Cenário

O banco de dados do cliente é armazenado e administrado por outra empresa, porém há diversos problemas em se ter a informação, não se pode realizar nenhum SELECT no ambiente aonde fica armazenado a base de dados. Porém a empresa necessita das informações porque estão desenvolvendo uma nova solução de BI com isso é necessário que a busca da informação seja realizada de forma efetiva.

Conversando com a parte de segurança , banco de dados e gerente de TI foi dito que: Todas as bases de dados de banco de dados não disponilizam IP Externo de forma alguma e nem VPN ou seja assim fica difícil, com isso todas as opções são descartadas: Log Shipping, DB Mirror, Replicação.  A maneira que eles utilizavam anteriormente era D-1, ou seja a empresa disponibilizava um backup FULL todos os dias e eles restauravam, mas agora essa regra não satisfaz mais o negócio, é necessário que seja alterada para um delay bem menor.

A Solução 

A sugestão foi: A disponibilização de backps de log, e nem queiram imaginar a dificuldade que foi para que esses log’s fossem disponibilizados em um FTP. Como dito por eles, não adiantaria nada porque não há solução somente o D-1, e a reposta para toda a equipe foi: “Há uma solução sim e se chama RESTORE WITH STANDBY” ou seja, irei fazer um Log Shipping de forma “Manual” em um outro servidor de banco de dados para a solução desse problema.

A solução é: Receber o backup FULL e depois receber de 30 min em 30 min backups de log para a sincronização do banco de dados. Irei demonstrar aqui como fazer. Primeiro irei realizar a criação de um banco de dados e irei inserir valores para o mesmo para simular o banco de dados dele, depois irei realizar o RESTORE desse banco de dados para simular como irei manter os dados atualizados no outro servidor.

CREATE DATABASE StandyByDatabase

ON PRIMARY

(

       NAME = N’StandyByDatabase’,

       FILENAME = N’C:\BaseDados\mdf\StandyByDatabase.mdf’,

       SIZE = 3072KB,

       FILEGROWTH = 1024KB

)

LOG ON

(

       NAME = N’StandyByDatabase_log’,

       FILENAME = N’C:\BaseDados\ldf\StandyByDatabase_log.ldf’,

       SIZE = 1024KB,

       FILEGROWTH = 10%

)

go

 

ALTER DATABASE StandyByDatabase

SET RECOVERY FULL

go

 

USE StandyByDatabase

GO

 

CREATE TABLE dbo.DadosVendaProduto

(

       ID SMALLINT IDENTITY NOT NULL,

       NomeProduto VARCHAR(150) NOT NULL,

       ValorProduto DECIMAL(18,2) NOT NULL,

       Quantidade INT,

       DataRegistro DATETIME DEFAULT GETDATE()

)

 

INSERT INTO dbo.DadosVendaProduto

( NomeProduto ,

  ValorProduto ,

  Quantidade

)

VALUES (‘Ar Condicionado’,740.00,3), (‘Filtro de Ar’,20.01,6)

 

 

–BACKUP DATABASE

BACKUP DATABASE StandyByDatabase

TO DISK = ‘C:\BaseDados\backup\StandyByDatabase.bak’

WITH NOFORMAT, NOINIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10

GO

 

Após isso será realizado dois backup de logs que serão novos registros sendo inseridos dentro do banco de dados.

 

INSERT INTO dbo.DadosVendaProduto

( NomeProduto ,

  ValorProduto ,

  Quantidade

)

VALUES (‘Mesa de Quarto’,980.00,12), (‘Abajur de Quarto’,23.38,9)

 

BACKUP LOG StandyByDatabase

TO DISK = ‘C:\BaseDados\backup\StandyByDatabase_log.trn’

WITH NOFORMAT, NOINIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10

GO

 

INSERT INTO dbo.DadosVendaProduto

( NomeProduto ,

  ValorProduto ,

  Quantidade

)

VALUES (‘Cama’,1243.34,43), (‘Geladeira’,2460.03,2)

go

 

BACKUP LOG StandyByDatabase

TO DISK = ‘C:\BaseDados\backup\StandyByDatabase_log2.trn’

WITH NOFORMAT, NOINIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10

GO

 

Agora iremos simular os RESTORES do banco de dados no novo ambiente.

USE master

go

 

RESTORE DATABASE DadosRestoreStandyByDatabase

FROM DISK = N’C:\BaseDados\backup\StandyByDatabase.bak’

WITH STANDBY = N’C:\BaseDados\backup\ROLLBACK_UNDO_StandyByDatabase.bak’,

       MOVE ‘StandyByDatabase’ TO ‘C:\BaseDados\mdf\DadosRestoreStandyByDatabase.mdf’,

       MOVE ‘StandyByDatabase_log’ TO ‘C:\BaseDados\mdf\DadosRestoreStandyByDatabase_log.ldf’

GO

SELECT *

FROM DadosRestoreStandyByDatabase.dbo.DadosVendaProduto

image

(Figura 1 – Registros do Backup FULL.)

 

Dessa forma deixamos o banco de dados em estado STANDBY, desse modo a base de dados ficará em estado de leitura além de conseguirmos restaurar backups de LOG.

 

image

(Figura 2 – Banco de Dados em StandBy Mode.)

 

RESTORE LOG DadosRestoreStandyByDatabase

FROM DISK = N’C:\BaseDados\backup\StandyByDatabase_log.trn’

WITH STANDBY = N’C:\BaseDados\backup\ROLLBACK_UNDOLOG_StandyByDatabase_log.bak’

 

SELECT *

FROM DadosRestoreStandyByDatabase.dbo.DadosVendaProduto

 

image

(Figura 3 – Novos Registros adicionados ao banco de dados.)

 

Os registros de ID 3 e 4 foram adicionados após o LOG no modo StandBy Mode ter sido adicionado.

 

RESTORE LOG DadosRestoreStandyByDatabase

FROM DISK = N’C:\BaseDados\backup\StandyByDatabase_log2.trn’

WITH STANDBY = N’C:\BaseDados\backup\ROLLBACK_UNDOLOG_StandyByDatabase_log2.bak’

GO

 

SELECT *

FROM DadosRestoreStandyByDatabase.dbo.DadosVendaProduto

image

(Figura 4 – Novos Registros adicionados ao banco de dados.)

 

Os registros de ID 5 e 6 foram adicionados após o outro LOG ter sido adicionado ao banco de dados.

 

Conclusão

Toda vez que chegar um novo arquivo de log no FTP esse mesmo será baixado para um espelho de FTP (Sincronização com uma pasta) e depois restaurado dentro do banco de dados, assim o banco de dados terá um delay de 30min. É lógico que essa não é melhor solução mais para esse cenário é a que se encaixa melhor.