Bruno Perroni
DBA SQL Server com mais de 6 anos de experiência!

Database Snapshot

Eae pessoal, tudo certo com vocês?

Nesse post vou mostrar, como criar um snapshot de um banco de dados.

Para quem não sabe no SQL Server é possível criar uma cópia (somente leitura) do banco de dados, cópia essa chamada de snapshot.

Snapshots podem ter varias utilizações, as mais comuns são:

– Geração de Relatórios;

– Cópia de Segurança, caso seja necessário reverter o banco de dados principal ao seu estado original;

Sim, é possível restaurar um banco de dados a partir de um snapshot e dependendo do dano causado é mais vantajoso do que um restore.

Um banco de dados pode ter vários snapshots, enquanto houver espaço disponível no servidor, você pode criar quantos snapshots entender necessário, também tenha em mente que o I/O aumentará o que pode degradar a performance.

Snapshots também possuem várias limitações, como por exemplo: bancos de sistema não permitem a criação de snapshots, você não pode fazer um backup de um snapshot, não dá para desatachar/atachar um snapshot, full-text não é suportado, obviamente eles devem ser criados na mesma instancia do banco de dados original, dentre outras limitações.

Uma observação importante, caso você tente restaurar um banco de dados que possua um snapshot, primeiro você deve excluir o snapshot.

Bom, agora que já temos um overview do que é um snapshot, vamos ao nosso LAB.

E na verdade a sintaxe é bem simples, conforme podemos ver no script abaixo, o comando é parecido com o de criação de bancos de dados (create database).

Para descobrir o nome logico do database você pode usar a seguinte query.

SELECT name
FROM sys.master_files
WHERE database_id = DB_ID(N'AdventureWorks2017') --aqui vem o nome do banco de dados, nem sempre o nome lógico é igual ao nome do banco de dados;

Na primeira parte vem o nome do Snapshot, no exemplo, será AdventureWorks2017_Snapshot_18012021, a seguir, especificaremos o nome lógico do arquivo do banco de dados de origem (obtido pela query acima), em seguida vem o caminho do diretório onde ele será armazenado e posteriormente vem a definição do database que terá um snapshot, no nosso exemplo será o AdventureWorks2017.

CREATE DATABASE AdventureWorks2017_Snapshot_18012021 ON  
( NAME = AdventureWorks2017, --aqui vem o nome lógico, obtido na query acima. 
  FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\AdventureWorks_Snapshot_18012021.ss' )  
AS SNAPSHOT OF AdventureWorks2017;  
GO

Por padrão a extensão do arquivo é .ss, dessa forma fica fácil a sua identificação.

O nome também contém a palavra snapshot, para não haver confusão na hora de realizar consultas.

Como você pode ver, o snapshot é exatamente igual ao banco de dados.

Caso você queira excluir o snapshot, é só usar o comando abaixo:

DROP DATABASE AdventureWorks2017_Snapshot_Teste;

Espero que tenham gostado.