Implementando Database Snapshot
16 de setembro de 2013 1 Comentário
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.
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
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)
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
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:
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.
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