SQL Server 2005 ile gelen yeniliklerden biri Database Snapshotlar. Bu özellik bize veritabanının snapshot oluşturulduğu anki içeriğini sunan, read-only bir kopyasını sunar, böylece veritabanının sorgulamalar için kullanılabilecek read-only bir kopyasını elde etmiş oluruz.
Peki bu özelliğin veritabanının yedeğini alarak ikinci bir kopyasını oluşturmaktan farkı ne?
İlk bakışta bir fark yok gibi görünse de, database snapshot özelliğinin iç yapısına baktığımızda veritabanının ikinci bir kopyasını oluşturmakla aynı şey olmadığını görüyoruz. Hemen bakalım;
Şekil 1.1: Database Snapshot Mimarisi
Şekil 1.1'de görebileceğiniz üzere bir database snapshot oluşturduğumuz zaman orjinal veritabanında yer alan tüm verilerin bir kopyası oluşturulmaz. Database Snapshot'a gelen okuma talepleri eğer orjinal veritabanı üzerindeki değişikliğe uğramamış alanları sorguluyorsa, sorgulama orjinal veritabanından yapılır. Sadece orjinal veritabanında bir değişiklik olduğu zaman değiştirilen verilerin değiştirilmeden önceki hali database snapshot dosyasına yazılır. Şekil 1.1'de orjinal veritabanının sadece %10'luk bölümünde değişiklik gerçekleşmiş durumda olduğu ve snapshot dosyasına sadece bu %10'luk bölüm aktarıldığı için database snapshot dosyamız orjinal veritabanının yaklaşık %10'u civarında bir dosya boyutuna sahiptir.
Database Snapshotların Sunduğu Avantajlar
Her teknoloji gibi database snapshotlarda avantajlara sahip olduğu gibi bazı kısıtlamalar ve dezavantajlar da içermektedir. Database Snapshotların dezavantajları özetle şunlardır:
Database Snapshotları kullanmak için elinizde iki alternatif vardır. Birincisi t-sql kodları yazarak (ki gerçekten çok karmaşık kodlar değildir bu kodlar) database snapshotları oluşturabilir ve yönetebilirsiniz. İkinci (ve tavsiye edilen
) yöntemse benim geliştirdiğim database snapshot manager uygulamasını kullanmak. Ben örneği kendi uygulamamı kullanarak vereceğim ancak her işlemde arkaplanda çalıştırılan kodları da belirteceğim.
Örnek senaryomuzda yazgelistir adındaki veritabanı üzerinde çalışıyor olacağız. Bu veritabanında aşağıdaki şemaya sahip bir makaleler tablomuz var.
Şekil 1.2: articles tablosunun şeması
Bu tabloya deneme amacıyla iki kayıt ekliyorum.
Şekil 1.3: örnek veri
Database Snapshot Oluşturmak
Bu noktada veritabanının bir database snapshot'ını oluşturuyorum. Database Snapshot Manager ile snapshot oluşturmak için önce sunucuya bağlantı oluşturuyor, sonra snapshot alacağınız veritabanını seçip, snapshot için bir isim verip disk üzerinde (sunucunun diski, networkte bir klasör belirtemiyorsunuz) hangi dosyada oluşturulacağını belirtiyoruz ve oluştur diyoruz.
Şekil 1.4: Database Snapshot oluşturuldu
Örneğimizdeki işlemin arkaplanında çalışan kod şu şekilde oluyor:
CREATE DATABASE yazgelistirSnapshot1 ON
(NAME = yazgelistir,
FILENAME = 'C:\snapshots\yages1.dbs' )
AS SNAPSHOT OF yazgelistir
Oluşturduğumuz snapshot Management Studio içinde Database Snapshots alanında listelenmektedir ve kaynak veritabanının snapshot oluşturulduğu anki tüm içeriğini birebir yansıtmaktadır ancak önceden belirttiğim gibi burada gördüğümüz veriler kaynak veritabanında değişmemişse kaynak veritabanının veri dosyasınadan, değişiklik olmuşsa snapshot için belirttiğiniz veri dosyasından gelmektedir.
Şekil 1.5: Management Studio içinde Database Snapshot
Oluşturulan snapshot'ı artık bir veritabanı gibi görerek içindeki tablolardan sorgulama yapmamız mümkündür ancak unutmamalıyızki database snapshotlar read-only dir. Dolayısıyla update/insert ve delete komutlarını kullandığımızda hata (bkz: şekil 1.6) alırız.
Şekil 1.6: Database snapshotlar read-only çalıştığı için insert/update ve delete komutlarını desteklememektedir.
Veritabanını Database Snapshot'tan Restore Etmek
Şimdi orjinal veritabanında yer alan iki satırı siliyorum.
Şekil 1.7: articles tablosundaki tüm kayıtları sildik.
Restore için Database Snapshot Manager'da ilgili ekranı açarak önce sunucu üzerinden bir database snapshot sonra restore edeceğim veritabanını seçiyorum.
Şekil 1.8: Veritabanını Database Snapshot'tan Restore Etmek
Bu işlem tamamlandığında veritabanı database snapshot'ı oluşturduğum andaki halinde geri dönüyor. Hatırlayacak olursak iki adet kayıt vardı veritabanında. Veritabanındaki articles tablosunun içeriğine yeniden baktığımızda sildiğimiz iki satırın geri geldiğini görüyoruz.
Peki bu özelliğin veritabanının yedeğini alarak ikinci bir kopyasını oluşturmaktan farkı ne?
İlk bakışta bir fark yok gibi görünse de, database snapshot özelliğinin iç yapısına baktığımızda veritabanının ikinci bir kopyasını oluşturmakla aynı şey olmadığını görüyoruz. Hemen bakalım;
![1000001186_dbsnapshot.jpg](http://www.yazgelistir.com/Makaleler/Resimler/1000001186_dbsnapshot.jpg)
Şekil 1.1: Database Snapshot Mimarisi
Şekil 1.1'de görebileceğiniz üzere bir database snapshot oluşturduğumuz zaman orjinal veritabanında yer alan tüm verilerin bir kopyası oluşturulmaz. Database Snapshot'a gelen okuma talepleri eğer orjinal veritabanı üzerindeki değişikliğe uğramamış alanları sorguluyorsa, sorgulama orjinal veritabanından yapılır. Sadece orjinal veritabanında bir değişiklik olduğu zaman değiştirilen verilerin değiştirilmeden önceki hali database snapshot dosyasına yazılır. Şekil 1.1'de orjinal veritabanının sadece %10'luk bölümünde değişiklik gerçekleşmiş durumda olduğu ve snapshot dosyasına sadece bu %10'luk bölüm aktarıldığı için database snapshot dosyamız orjinal veritabanının yaklaşık %10'u civarında bir dosya boyutuna sahiptir.
Database Snapshotların Sunduğu Avantajlar
- Database Snapshotlar orjinal database ile sadece değişiklik olmuş veriler olması halinde diyalog kurduğu için snapshot oluşturma işlemi son derece hızlıdır.
- Sparse dosyasına sadece orjinal veritabanında değişiklik olduğunda veri yazıldığı için disk alanı sadece değişikliğe uğrayan veri oranında olacaktır. Veritabanının ikinci bir kopyasını oluşturma işleminde olduğu gibi kullanılan disk alanı iki katına çıkmayacaktır.
- Aynı veritabanı için istediğiniz kadar snapshot oluşturabilirsiniz. Böylece veritabanının farklı zamanlardaki durumları üzerinde istediğiniz zaman çalışabilirsiniz.
- Backup ve Restore işlemlerine göre hem çok daha kolay hem de çok daha hızlıdır.
- Çok az efor sarfederek statik bir raporlama ortamı oluşturabilirsiniz.
- Ana veritabanındaki hasar görmüş, yanlışlıkla değiştirilmiş veriler snapshot aracılığıyla düzeltilebilir, ana veritabanı restore edilebilir.
Her teknoloji gibi database snapshotlarda avantajlara sahip olduğu gibi bazı kısıtlamalar ve dezavantajlar da içermektedir. Database Snapshotların dezavantajları özetle şunlardır:
- Raporlama v.b. nedenlerle performans sorunları yaşıyorsanız, Database Snapshotlar sizin için bir çözüm sunmayacak aksine sorununuzu daha da büyütecektir. Bunun nedeni database snapshotların değişmemiş verileri ana veritabanınızdan okuyacak olmasıdır.
- Database Snapshotlar ana veritabanına bağlı oldukları için ana veritabanınızı offline moda almanız halinde ilgili veritabanına bağlı snapshotlara erişmek mümkün olmayacaktır.
- Database Snapshot özelliği sadece Enterprise Edition'da bulunmaktadır.
- Sürekli değişen verilerin bulunduğu veritabanları için çok ideal bir yöntem olduğunu söyleyemem.
- Snapshotlarda full-text indexing desteklenmemektedir.
Database Snapshotları kullanmak için elinizde iki alternatif vardır. Birincisi t-sql kodları yazarak (ki gerçekten çok karmaşık kodlar değildir bu kodlar) database snapshotları oluşturabilir ve yönetebilirsiniz. İkinci (ve tavsiye edilen
Örnek senaryomuzda yazgelistir adındaki veritabanı üzerinde çalışıyor olacağız. Bu veritabanında aşağıdaki şemaya sahip bir makaleler tablomuz var.
![1000001186_dbschema.jpg](http://www.yazgelistir.com/Makaleler/Resimler/1000001186_dbschema.jpg)
Şekil 1.2: articles tablosunun şeması
Bu tabloya deneme amacıyla iki kayıt ekliyorum.
![1000001186_sampledata.jpg](http://www.yazgelistir.com/Makaleler/Resimler/1000001186_sampledata.jpg)
Şekil 1.3: örnek veri
Database Snapshot Oluşturmak
Bu noktada veritabanının bir database snapshot'ını oluşturuyorum. Database Snapshot Manager ile snapshot oluşturmak için önce sunucuya bağlantı oluşturuyor, sonra snapshot alacağınız veritabanını seçip, snapshot için bir isim verip disk üzerinde (sunucunun diski, networkte bir klasör belirtemiyorsunuz) hangi dosyada oluşturulacağını belirtiyoruz ve oluştur diyoruz.
![1000001186_dbsm1.jpg](http://www.yazgelistir.com/Makaleler/Resimler/1000001186_dbsm1.jpg)
Şekil 1.4: Database Snapshot oluşturuldu
Örneğimizdeki işlemin arkaplanında çalışan kod şu şekilde oluyor:
CREATE DATABASE yazgelistirSnapshot1 ON
(NAME = yazgelistir,
FILENAME = 'C:\snapshots\yages1.dbs' )
AS SNAPSHOT OF yazgelistir
Oluşturduğumuz snapshot Management Studio içinde Database Snapshots alanında listelenmektedir ve kaynak veritabanının snapshot oluşturulduğu anki tüm içeriğini birebir yansıtmaktadır ancak önceden belirttiğim gibi burada gördüğümüz veriler kaynak veritabanında değişmemişse kaynak veritabanının veri dosyasınadan, değişiklik olmuşsa snapshot için belirttiğiniz veri dosyasından gelmektedir.
![1000001186_dbscontent.jpg](http://www.yazgelistir.com/Makaleler/Resimler/1000001186_dbscontent.jpg)
Şekil 1.5: Management Studio içinde Database Snapshot
Oluşturulan snapshot'ı artık bir veritabanı gibi görerek içindeki tablolardan sorgulama yapmamız mümkündür ancak unutmamalıyızki database snapshotlar read-only dir. Dolayısıyla update/insert ve delete komutlarını kullandığımızda hata (bkz: şekil 1.6) alırız.
![1000001186_updatefailed.jpg](http://www.yazgelistir.com/Makaleler/Resimler/1000001186_updatefailed.jpg)
Şekil 1.6: Database snapshotlar read-only çalıştığı için insert/update ve delete komutlarını desteklememektedir.
Veritabanını Database Snapshot'tan Restore Etmek
Şimdi orjinal veritabanında yer alan iki satırı siliyorum.
![1000001186_emptytable.jpg](http://www.yazgelistir.com/Makaleler/Resimler/1000001186_emptytable.jpg)
Şekil 1.7: articles tablosundaki tüm kayıtları sildik.
Restore için Database Snapshot Manager'da ilgili ekranı açarak önce sunucu üzerinden bir database snapshot sonra restore edeceğim veritabanını seçiyorum.
![1000001186_dbsm2.jpg](http://www.yazgelistir.com/Makaleler/Resimler/1000001186_dbsm2.jpg)
Şekil 1.8: Veritabanını Database Snapshot'tan Restore Etmek
Bu işlem tamamlandığında veritabanı database snapshot'ı oluşturduğum andaki halinde geri dönüyor. Hatırlayacak olursak iki adet kayıt vardı veritabanında. Veritabanındaki articles tablosunun içeriğine yeniden baktığımızda sildiğimiz iki satırın geri geldiğini görüyoruz.
![1000001186_restored.jpg](http://www.yazgelistir.com/Makaleler/Resimler/1000001186_restored.jpg)