Restaurando a partir de um Database Snapshot

 

No artigo anterior sobre database snapshots, falamos sobre o conceito e o funcionamento desse novo recurso que está disponível na versão Enterprise Edition do SQL Server 2005, assim como também vimos um exemplo prático de sua utilização. Neste artigo, daremos continuidade ao assunto e veremos como reverter o estado de um banco de dados a partir de um snapshot.

Como uma alternativa à restauração de banco de dados a partir de backups, qualquer usuário com permissões de RESTORE DATABASE no banco de dados origem, pode reverter o banco de dados ao seu estado inicial de quando o snapshot foi criado. Esta tarefa pode ser apropriada no momento em que um banco de dados fica inconsistente, como por exemplo, a exclusão acidental de uma tabela. É importante salientar que ter um plano regular de backup e testar a restauração destes, é fundamental para proteger o banco de dados de erros.

O processo de reverter um banco de dados a partir do snapshot subscreve todas as alterações feitas no banco de dados desde que o snapshot foi criado, copiando as páginas do snapshot de volta ao banco de dados origem. Apenas as páginas que sofreram modificação são revertidas. A operação também reconstrói o log do banco de dados.

A operação de reverter um banco de dados a partir de seu snapshot não é suportado quando:

 

F   O banco de dados origem possuir filegroups compactados ou marcados como somente leitura.

F   O banco de dados origem possuir arquivos offline, mas que estavam online durante a criação do snapshot.

F   Existir mais de um snapshot para o mesmo banco de dados.

Antes de restaurar um banco de dados é importante considerar que:

F   O snapshot é uma cópia incompleta dos arquivos de um banco de dados.

F   Durante a operação de restore, tanto o snapshot como o banco de dados são marcados como “In Restore” e se tornam indisponível.

F    Como a operação de restore automaticamente reconstrói o log do banco de dados, é recomendado o full backup do banco de dados e do log antes da restauração.

Como reverter um banco de dados com base no snapshot

Vamos ver através de um exemplo prático, os procedimentos para reverter um banco de dados com base em um snapshot. Usaremos como banco de dados origem o AdventureWorks, que vem junto com a instalação do SQL Server 2005. Antes de qualquer coisa, é recomendável que seja feito o backup desse banco de dados. Em seguida, preceda com os seguintes passos:

1.     Clique em Start, All Programs, Microsoft SQL Server 2005 e então em SQL Server Management Studio.

2.     Na caixa de diálogo Connect to Server, informe os valores conforme a tabela abaixo.

 

Propriedade

Valor

Server Type

Database Engine

Server Name

Localhost

Authentication

Windows Authentication

 

3.     No SQL Management Studio, clique no botão New Query na barra de ferramentas.

4.     Na nova janela de consulta, execute o seguinte código Transact-SQL para criar um snapshot do banco de dados:

 

CREATE DATABASE AdventureWorks_Snapshot_07102006 ON

( NAME = N'AdventureWorks_Data',

  FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AW_07102006.ss')

AS SNAPSHOT OF AdventureWorks

 

5.     Na janela Object Explorer, expanda Database, Database Snapshots, e então confirme a existência de um snapshot chamado AdventureWorks_Snapshot_07102006. Você poderá precisar fazer o refresh da lista de database snapshots para que o novo snapshot esteja visível. Outra forma de listar os snapshots é através da seguinte consulta ao catálogo sys.databases:

 

SELECT * FROM sys.databases

WHERE source_database_id IS NOT NULL

 

6.     Clique no botão New Query. Na nova janela de consulta, execute o seguinte código Transact-SQL:

 

DROP TABLE AdventureWorks.Sales.Individual

 

7.     Clique no botão New Query. Execute as duas consultas abaixo e observe que a tabela Sales.Individual existe apenas no snapshot AdventureWorks_Snapshot_07102006.

 

USE AdventureWorks

IF  EXISTS (SELECT * FROM sys.objects

             WHERE object_id = OBJECT_ID(N'[Sales].[Individual]')

               AND type in (N'U'))

PRINT 'Tabela [Sales].[Individual] encontrada no BD AdventureWorks'

ELSE

PRINT 'Tabela [Sales].[Individual] não encontrada no BD AdventureWorks'

 

USE AdventureWorks_Snapshot_07102006

IF  EXISTS (SELECT * FROM sys.objects

             WHERE object_id = OBJECT_ID(N'[Sales].[Individual]')

               AND type in (N'U'))

PRINT 'Tabela [Sales].[Individual] encontrada no snapshot AdventureWorks_Snapshot_07102006'

ELSE

PRINT 'Tabela [Sales].[Individual] nao encontrada no snapshot AdventureWorks_Snapshot_07102006'

 

8.     Clique no botão New Query. Na nova janela de consulta, execute o seguinte código Transact-SQL para reverter o estado do banco de dados AdventureWorks.

 

USE master

RESTORE DATABASE AdventureWorks

FROM DATABASE_SNAPSHOT = 'AdventureWorks_Snapshot_07102006'

 

9.     Retorne à janela de consulta anterior que contém o código SELECT, e então clique no botão Execute. Agora, o resultado deverá ser diferente, pois a tabela Sales.Individual existe no banco de dados e no snapshot.

10.   Feche o SQL Management Studio e clique em No se perguntado para salvar os arquivos.

Conclusões

Neste artigo, vimos que além de servir como base para consultas e relatórios, o snapshot pode ser usado como uma alternativa de cópia de segurança. Através de um exemplo simples e prático, revertemos o estado de um banco de dados ao estado anterior à criação do snapshot. Espero que este artigo tenha sido proveitoso e até a próxima.