SQL Server 2005: Database Snapshot'lar

Dark-Man

Kıdemli Üye
5 Ocak 2013
4,430
9
I Don't Know
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;

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.
Database Snapshotların Dezavantajları
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.
Nasıl Kullanırım?
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.

1000001186_dbschema.jpg

Şekil 1.2: articles tablosunun şeması

Bu tabloya deneme amacıyla iki kayıt ekliyorum.
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

Ş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

Ş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

Ş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

Ş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

Ş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
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.