Implementando Database Snapshot

Fala Galera,

Hoje iremos ver como criar um snapshot de um banco de dados e de que forma utilizar esta fotografia para fazer um restore em uma base de dados onde um update foi executado de forma incorreta.

Primeiro alguns conceitos deverão ser apresentados:

Um snaptshot é uma fotografia, somente leitura,  de uma base de dados em um dado momento no tempo; O acesso a esse DB é realizado de forma transparente, como se fosse uma base normal. Algumas possíveis utilizações dessa feature seria disponibilizar uma forma pela qual os clientes acessariam um DB  de exclusivo para relatórios, evitando assim concorrência na base original ou quando alguma mudança brusca nos dados ocorrer, permitindo assim um recover mais rápido da base.

Algumas premissas devem ser levadas em consideração quando se cria um snapshot, por exemplo:

  •  A base de dados snapshot deverá, obrigatoriamente, estar na mesma instância da base original.
  • Os snapshots NÃO são substitutos para os backups normais.
  • Não é possível criar um snapshot de bases de sistema como: master, tempdb ou model
  • Os comandos restore/backup database não são permitidos.
  • O sistema de arquivos deve ser NTFS, não há suporte para FAT32.
  • Catalogos FullText não podem ser usados com o database snapshot.
  • […]

Uma lista completa das limitações do database snapshot poderá ser encontrada em:

http://technet.microsoft.com/en-us/library/ms189940(v=sql.105).aspx

Não é possível criar um snapshot por uma interface gráfica, somente através de comandos transaction SQL. O comando utilizado para se criar um database snaptshot é o já conhecido CREATE DATABASE.

As mesmas permissões concedidas para um usuário que cria uma base de dados normal servirá para criar um snapshot (CREATE ANY DATABASE e ALTER ANY DATABASE) , a menos que o DB base seja espelhado, neste caso será necessário ser membro da role sysAdmin.

Para nossos exemplos iremos primeiramente será necessário criar uma base de dados

CREATE DATABASE EX_SNAPSHOT
GO
USE EX_SNAPSHOT

Agora uma nova tabela populada com registros falsos.

CREATE TABLE REGISTROS(
ID INT IDENTITY(1,1) PRIMARY KEY,
   TEXTO VARCHAR(max),
   DATA DATETIME DEFAULT (GETDATE()
)
GO
INSERT INTO REGISTROS (TEXTO)VALUES
('TEXTO 1'),
('TEXTO 2'),
('TEXTO 3'),
('TEXTO 4'),
('TEXTO 5'),
('TEXTO 6'),
('TEXTO 7'),
('TEXTO 8'),
('TEXTO 9'),
('TEXTO 10')

Estes são os dados contidos na nossa base de dados normal.

Imagem

Agora iremos criar um snaptshot baseado no banco de dados EX_SNAPSHOT, lembrando que a propriedade “NAME” deverá ser o nome lógico da base origial, esta informação poderá ser obtida através da DMV:

select NAME from sys.databases where database_id = DB_ID('EX_SNAPSHOT')

Script para criação do snapshot.

CREATE DATABASE DB_SNAPSHOT_3 ON(
NAME = 'EX_SNAPSHOT',
      FILENAME = 'D:\DB_SNAPTSHOT3.MDF'
) AS SNAPSHOT OF EX_SNAPSHOT 

Imagem

Conforme já foi dito, um database snapshot é read-only, ou seja, não são permitidas escritas ou atualizações nos dados lá contidos; O próximo comando irá simular um update no snapshot para que possamos observar o erro retornado.

USE DB_SNAPSHOT
GO
UPDATE REGISTROS SET [TEXTO].WRITE('123 ',0,0)

Imagem

Sabendo disso agora iremos fazer o mesmo update na base de dados original e após isso um select em cada uma das bases para que possamos constatar que existem diferenças entre as tabelas, e que um update na base original não afeta de nenhuma maneira seu snapshot.

USE EX_SNAPSHOT
GO
UPDATE REGISTROS SET TEXTO.Write('123 ',0,0)

SELECT * FROM DB_SNAPSHOT.DBO.REGISTROS
SELECT * FROM EX_SNAPSHOT.DBO.REGISTROS

Imagem

Suponhamos que você tenha feito um update de forma incorreta e deseja, através do snapshot, recuperar a base de dados original para que ela volte no estado que estava quando o snapshot foi tirado; Há apenas um porém, se você possuir mais um database snapshot eles deverão ser removidos, apenas um único pode existir, caso contrário o seguinte erro é apresentado:

Imagem

Agora iremos mudar o contexto do banco de dados para o Master e realizar o restore baseado no único snapshot que foi mantido.

USE master
GO
RESTORE DATABASE EX_SNAPSHOT FROM DATABASE_SNAPSHOT = 'DB_SNAPSHOT

Simples e fácil, basta fazer um select na tabla do DB ex_Snapshot e veremos que os registros retornaram para o estado que estavam no momento que o snapshot foi tirado.

Imagem

Bom é isso pessoal, espero que vocês tenham conseguido entender, pelo menos do básico, de como e onde utilizar essa feature do MS SQL Server.

[]’s

BLOG DO ZOUZA

"Lifelong Learner" - Compartilhando e Adquirindo Conhecimentos!

Blog - Thiago Carlos de Alencar

Aprendendo SQL Server !

SQL Authority with Pinal Dave

SQL Server Performance Tuning Expert

Vitor Fava

Let s Learn, Practice and Share some knowledge

Diego Nogare

DBCC DumpMemory 'TECH','ALL'

Gustavo Maia Aguiar

Artigos, dicas e algumas reflexões sobre o SQL Server

Kimberly L. Tripp

DBCC DumpMemory 'TECH','ALL'

Thiago Zavaschi R2

www.zavaschi.com

Blog do Luti

DBCC DumpMemory 'TECH','ALL'

Luan.Moreno a.k.a [SQL.Soul]

Lead Database Consultant at Pythian

Blog do Leka

let's make things better