Makale Özeti

Bu yazımızda SQL Server 2005 ile birlikte gelen database snapshot kavramını inceleyeceğiz.

Makale




SQL Server 2005 Database Snapshots

SQL Server 2005 ile gelen yeni özelliklerden biri de snapshot database alabilmek oldu. Bugüne kadar disaster recovery olarak gruplandırılan felaket kurtarma konusu içine daha çok backup ve restore işlemleri dahil ediliyordu. Bütün veri kurtarma senaryolarında veri kaybetme riski mevcuttu ve halen de bu risk devam ediyor.

Örnek olarak bir günün sabahında full backup alınıp, öğlen saatlerinde de differential backup alındığını varsayalım. Akşam üzeri yapılan bir hata veya ters bir durumdan bir önceki duruma dönebilmek için son full backup üzerine son diff backup’ı restore ederek o anki duruma geri dönebiliyorduk. Fakat hatanın oluştuğu an ile son diff backup anı arasında geçen süredeki veriler kaybediliyordu. Bunların önüne geçmek için Transaction Log backup’ını da devreye sokarak geçmiş kayıtlardan istediğiniz gün ve saate geri dönebiliyorduk. Fakat yine de her zaman veri kaybetme riski mevcuttu. SQL 2005 ile backup ve restore işlemlerine dair bir takım değişiklikler geldi. Fakat bunların dışında çok yeni bir kavram olarak database snapshot’ları karşımıza çıktı.

Database snapshot , veritabanın o anki resmidir. Salt okunur bir kopya veritabanıdır. Yaratıldığı ilk anda veritabanının o anki durumunun resmini çeker fakat sadece state bilgisini tutar, içi boştur. Veritabanında bir değişiklik olduğu anda snapshot veritabanına yazılır. Yaptığınız tüm değişiklikler snapshot veritabanına yazıldığı için , geçmiş bir kaydı snapshot veritabanından sorgulayarak geri dönüş yapabilirsiniz. Bu şekilde sadece değişiklikleri kayıt altına aldığı için optimal boyut ve performansta bir yedek veritabanı kullanmış oluyoruz. Snapshot veritabanının bir diğer özelliği de değişiklik yapılmamış bir tablo üzerinde kayıt sorgulaması yapıldığı zaman istemciyi direkt olarak orjinal veritabanına yönlendirmesidir.

Snapshot veritabanları , salt okunur attach ve detach edilemez , üzerine backup ve restore işlemleri yapılamaz bir özelliğe sahiptir. Kullanım şekli oldukça basittir. Üzerinden aldığınız sorguları SELECT.. INTO ifadeleri ile orjinal veritabanına aktarabilir veya UPDATE ..SET ifadelerinde değiştirilmesini istediğiniz değerleri snapshot veritabanından çekebilirsiniz.

Örnek bir uygulama ile snapshot kavramını pekiştirelim:

CREATE DATABASE AdventureWorks_dbsnapshot_1800
ON (NAME = AdventureWorks_Data,
FILENAME = ’C:\SnapshotData\AdventureWorks_Data.ss’)
AS SNAPSHOT OF AdventureWorks
GO

Bu komut c:\SnapshotData dizini altına AdventureWorks veritabanının snapshot’ını yaratır.

USE AdventureWorks_dbsnapshot_1800
SELECT *
FROM HumanResources.Employee
GO

Bu komut ile snapshot veritabanının HumanResources.Employee tablosundan tüm kayıtlar listelenir. Fakat snapshot yaratıldıktan sonra bu tabloda herhangibir değişiklik yapılmadığı için bu sorgu istemciyi direkt olarak orjinal veritabanı olan AdventureWorks’a yönlendirir.

Şimdi orjinal veritabanında bir değişiklik yaparak, bu değişikliği snapshot veritabanında gözlemleyelim.

USE AdventureWorks
UPDATE HumanResources.Employee
SET LoginID = ’Secret’ + LoginID
GO

Bu komut ile AdventureWorks veritabanında Employee tablosundaki tüm kayıtların başına Secret kelimesi yazdırıyoruz.

USE AdventureWorks
SELECT *
FROM HumanResources.Employee
GO
USE AdventureWorks_dbsnapshot_1800
SELECT *
FROM HumanResources.Employee
GO

Bu şekilde AdventureWorks veritabanında kayıtların son hali, sanpshot veritabanı AdventureWorks_dbsnapshot_1800 veritabanında ise kayıtların eski hali bulunmaktadır. Eski verilerimize geri dönmek için:

USE AdventureWorks
INSERT INTO HumanResources.Employee
SELECT *
FROM
AdventureWorks_dbsnapshot_1800. HumanResources.Employee

komutu kullanılabilir.

Son olarak snapshot veritabanının salt okunur olduğunu ve üzerinde backup restore ve attach/detach gibi işlemlerin yapılamayacağını tekrar hatırlatalım.


Onur Kulabaş
Yazılım Danışmanı


Sorularınız için onur.kulabas@bilgeadam.com