No artigo anterior, fizemos uma breve descrição das diferentes edições do Microsoft SQL Server 2005. Dando seqüência à exploração das melhorias e novos recursos do SQL Server 2005, neste artigo falaremos sobre snapshots de banco de dados, um novo recurso que está disponível somente na versão Enterprise Edition do SQL Server 2005.

O que são database snapshots

Um snapshot de banco de dados provê uma visão estática e somente leitura de um outro banco de dados (origem) num determinado ponto no tempo. Podemos criar múltiplos snapshots a partir de um banco de dados, que serão armazenados na mesma instância de servidor que o banco de dados de origem.

Snapshots podem ser usados para criar cópias de um banco de dados e usar estas cópias como fonte de consultas e relatórios. Durante um evento de erro, o snapshot também pode ser usado como uma cópia de segurança (backup) dos dados, permitindo que o um banco de dados seja restaurado ao estado em que este se encontrava quando da criação do snapshot. A perda de informações está limitada às transações de atualização ocorridas no banco de dados desde a criação do snapshot.

Entre as limitações envolvendo a criação de snapshots de banco de dados, encontramos as seguintes:

§         Um snapshot deve estar localizado no mesmo servidor que o banco de dados origem.

§         Snapshots não podem ser criados para os bancos de dados model, master ou temdb.

§         Não se pode fazer o backup ou restore de snapshots.

§         Não se pode fazer o attached ou dettached de snapshots.

§          Snapshots não podem ser criados em partições FAT32.

§         Todos os snapshots de um banco de dados devem ser apagados antes que o banco de dados origem seja apagado.

§         SQL Management Studio não suporta a criação de snapshots. Portanto, snapshots podem ser criados somente através de Transact-SQL.

Como os database snapshots funcionam

Embora que entender como os snapshots funcionam não seja essencial para o uso destes, é importante que qualquer desenvolvedor tenha este conhecimento.

Os snapshots trabalham em nível de página de dados (data-page). Antes que uma página do banco de dados origem é alterada pela primeira vez, a página original é copiada do banco de dados origem para o snapshot. Este processo é chamado de uma operação de copy-on-write. O snapshot armazena a página original, e desta forma preservando os registros de dados existentes quando o snapshot foi criado. As atualizações subseqüentes nos registros de uma página já modificada não afetam o conteúdo do snapshot. Este mesmo processo é repetido para cada página que é alterada pela primeira vez, e desta forma, o snapshot preserva as páginas originais para todos os registros de dados que tenham sido modificados desde a criação do snapshot.

Para armazenar as páginas originais copiadas, o snapshot usa um ou mais sparse files, que é um recurso do sistema de arquivos NTFS, onde, assim que os dados são gravados num sparse file, o NTFS aloca o espaço em disco necessário para armazenar estes dados.

Inicialmente, um sparse file é um arquivo vazio que não contém dados e que ainda não foi alocado espaço em disco para armazenar estes dados. Quanto mais e mais páginas de dados são modificadas no banco de dados origem, o arquivo vai aumentando de tamanho, podendo chegar ao tamanho do banco de dados de origem.

Uma operação de copy-on-write é mostrada na Figura 1. Os retângulos claros do diagrama do snapshot representam os espaços no arquivo que no momento não estão alocados. Quando ocorre a primeira modificação em uma página no banco de dados origem, o Database Engine escreve no arquivo e o sistema operacional aloca o espaço no snapshot para copiar a página original pra lá. O Database Engine então atualiza a página no banco de dados origem.

17-10pic01.JPG 

Figura 1. Operação de copy-on-write no snapshot

Para o usuário, os dados num snapshot parecem que nunca são modificados, pois as operações de leitura podem ser sempre executadas nas páginas de dados originais. Se uma página nunca foi modificada no banco de dados origem, uma operação de leitura no snapshot lê a página do banco de dados origem. A Figura 2 abaixo mostra uma operação de leitura num snapshot recém criado, onde o arquivo não possui nenhuma página de dados. Esta operação de leitura lê apenas do banco de dados origem.

17-10pic02.JPG 

Figura 2. Operação de leitura num snapshot recém criado

Depois que uma página de dados tenha sido modificada, uma operação de leitura no snapshot ainda acessa os dados da página original, que agora está armazenada no arquivo do snapshot. A Figura 3 ilustra uma operação de leitura no snapshot que acessa a página de dados depois que esta foi modificada no banco de dados origem. Esta operação lê a página original a partir do arquivo do snapshot.

17-10pic03.JPG 

Figura 3. Operação de leitura no snapshot

Criando um database snapshot

Vamos ver então como um snapshot é criado na prática através do uso do Transact-SQL. Para esta prática, usaremos como banco de dados origem o AdventureWorks, que vem junto com a instalação do SQL Server 2005.

Siga os seguintes passos para criar um snapshot usando Transact-SQL:

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, entre com o seguinte código Transact-SQL.

 

CREATE DATABASE AdventureWorks_Snapshot1000 ON

( NAME = N'AdventureWorks_Data',

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

AS SNAPSHOT OF AdventureWorks

 

5.       Clique no botão Execute.

6.       Na janela Object Explorer, expanda Database, Database Snapshots, e então confirme a existência de um snapshot chamado AdventureWorks_Snapshot1000. Você poderá precisar fazer o refresh da lista de database snapshots para que o novo snapshot esteja visível.

7.       Clique no botão New Query.

8.       Na nova janela de consulta, entre com o seguinte código Transact-SQL.

 

SELECT AddressID, AddressLine1, ModifiedDate

FROM AdventureWorks.Person.Address

WHERE AddressID = 10

 

SELECT AddressID, AddressLine1, ModifiedDate

FROM AdventureWorks_Snapshot1200.Person.Address

WHERE AddressID = 10

 

9.       Clique no botão Execute e então observe o resultado. Ambas as consultas retornam o mesmo resultado.

10.   Clique no botão New Query.

11.  Na nova janela de consulta, entre com o seguinte código Transact-SQL.

 

UPDATE AdventureWorks.Person.Address

SET AddressLine1 = 2500 Race Court'

WHERE AddressID = 10

 

12.   Clique no botão Execute.

13.   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 o snapshot ainda possui o valor original.

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

Conclusões

Pudemos ver neste artigo o uso e funcionamento de snapshots de banco de dados, um novo recurso existente no SQL Server 2005 Enterprise Edition. Usuários podem executar consultas num snapshot para autoria de relatórios, ou mesmo usar o snapshot para restaurar o estado do banco de dados origem em caso de falha deste.