29 Mart 2013 Cuma

MS SQL'de Yedekleme (Backup)

Merhaba Webkolog takipçileri!

Veri tabanları, modern uygulamaların kalbidir. Şirketinizin müşteri bilgileri, finansal kayıtları, siparişleri gibi kritik veriler, veri tabanlarınızda saklanır. Peki, ya bir felaket durumuyla karşılaşırsak? Donanım arızası, siber saldırı, yanlışlıkla yapılan bir silme işlemi... İşte bu noktada, veri kaybını önlemenin ve iş sürekliliğini sağlamanın altın kuralı devreye giriyor: Yedekleme (Backup)! Bugün sizlerle, MS SQL Server'da yedekleme işlemlerini nasıl yapacağımızı, farklı yedekleme tiplerini ve geri yükleme süreçlerini detaylıca inceleyeceğiz. Hazırsanız, verilerimizi güvende tutmaya başlayalım!

---

Neden Yedekleme Yapmalıyız?

Veri tabanı yedeklemeleri, olası felaket senaryolarına karşı bir sigorta gibidir. Başlıca nedenleri şunlardır:

  • Veri Kaybını Önleme: En temel amacı, donanım arızaları, yazılım hataları veya insan hataları sonucu veri kaybını engellemektir.
  • Afet Kurtarma: Birincil sunucunun tamamen kullanılamaz hale gelmesi durumunda, verileri ikincil bir konuma geri yükleyerek iş sürekliliğini sağlamak.
  • Geri Yükleme Noktası: Yanlışlıkla yapılan bir işlem (örneğin tüm verilerin silinmesi) sonrası veri tabanını belirli bir zamana geri döndürme.
  • Test Ortamları Oluşturma: Canlı ortamdaki verileri test veya geliştirme ortamlarına kopyalama.
  • Yasal ve Uyumluluk Gereksinimleri: Bazı sektörler veya düzenlemeler, belirli bir süre boyunca veri yedeklemesini zorunlu kılar.
---

Yedekleme Tipleri: İhtiyaca Göre Strateji Belirleme

MS SQL Server, farklı senaryolara uygun çeşitli yedekleme tipleri sunar. Bu tipleri doğru anlamak ve uygun bir yedekleme stratejisi oluşturmak çok önemlidir.

1. Tam Yedekleme (Full Backup)

Veri tabanının tamamının (tüm veriler ve işlem günlüğü dahil) bir kopyasını alır. Bir tam yedek, bir veri tabanını belirli bir noktaya geri yüklemek için gerekli tüm bilgileri içerir.

-- Basit bir tam yedekleme
BACKUP DATABASE veritabani_adi
TO DISK = 'C:\SQLYedekler\veritabani_adi_full.bak'
WITH NAME = 'Veritabanı Tam Yedeği',
     DESCRIPTION = 'Tüm veri tabanının tam yedeği',
     COMPRESSION; -- Yedeği sıkıştırır, disk alanından tasarruf sağlar

-- Var olan bir yedek dosyasının üzerine yazmak için WITH INIT kullanılır
BACKUP DATABASE OgrenciBilgi
TO DISK='E:\yedekler\ogrencibilgi.bak'
WITH INIT; -- Eğer dosya varsa üzerine yazar
2. Fark Yedekleme (Differential Backup)

En son alınan tam yedekten sonra veri tabanında değişen tüm verileri yedekler. Daha küçük boyutlu ve daha hızlıdır. Geri yükleme için hem en son tam yedeğe hem de en son fark yedeğine ihtiyacınız vardır.

-- Fark yedekleme (önce tam yedek alınmış olmalı)
BACKUP DATABASE veritabani_adi
TO DISK = 'C:\SQLYedekler\veritabani_adi_diff.bak'
WITH DIFFERENTIAL,
     NAME = 'Veritabanı Fark Yedeği',
     DESCRIPTION = 'Son tam yedekten bu yana değişen verilerin yedeği';
3. İşlem Günlüğü Yedekleme (Transaction Log Backup)

Sadece işlem günlüğünü (transaction log) yedekler. Bu, veri tabanınızın en son tam veya fark yedeğinden sonraki tüm işlemleri içerir. Özellikle büyük ve yoğun işlem gören veri tabanlarında, veri kaybını minimuma indirmek için kullanılır. İşlem günlüğü yedeklemesi yapabilmek için veri tabanının Kurtarma Modeli (Recovery Model) FULL veya BULK_LOGGED olmalıdır.

-- İşlem günlüğü yedekleme
BACKUP LOG veritabani_adi
TO DISK = 'C:\SQLYedekler\veritabani_adi_log.trn' -- Genellikle .trn uzantısı kullanılır
WITH NAME = 'Veritabanı Log Yedeği',
     DESCRIPTION = 'En son log yedeğinden bu yana olan işlemler';

-- İşlem günlüğünü kesmeden yedekleme (genellikle felaket kurtarma senaryolarında kullanılır)
BACKUP LOG db_ismi
TO DISK = 'C:\\BizimYedek.bak'
WITH NO_TRUNCATE;
---

Yedekten Geri Yükleme (Restore) İşlemleri

Yedeklediğimiz verileri geri yüklemek, yedekleme işleminin en kritik adımıdır. Doğru sıra ve seçeneklerle yapılmalıdır.

1. Yedekleme Dosyası Bilgilerini Görüntüleme

Bir yedek dosyasının içeriğini (hangi yedekleri içerdiği, hangi sırada alındığı vb.) görmek için kullanılır.

RESTORE HEADERONLY FROM DISK = 'C:\SQLYedekler\veritabani_adi_full.bak';

Bu komut, yedek dosyası içindeki her bir yedek set için detaylı bilgileri (FileNumber, BackupType, BackupFinishDate vb.) gösterir. Bu bilgiler, geri yükleme yaparken hangi yedek setini kullanacağımızı belirlemek için önemlidir (WITH FILE = n).

2. Tam Veri Tabanını Geri Yükleme
-- Sadece tam yedeği geri yükleme (Veritabanı kullanıma hazır olur)
RESTORE DATABASE OgrenciBilgi
FROM DISK='E:\yedekler\ogrencibilgi.bak'
WITH REPLACE; -- Mevcut aynı isimli veri tabanını üzerine yazar (DİKKAT!)
3. Tam Yedek, Fark Yedek ve Log Yedek ile Geri Yükleme Senaryosu

Genellikle bir tam yedekle başlanır, ardından fark yedeği ve en son olarak da işlem günlüğü yedekleri sırasıyla uygulanır.

-- Adım 1: Tam yedeği NORECOVERY ile geri yükle (veri tabanını 'Restoring' modunda bırakır)
RESTORE DATABASE OgrenciBilgi
FROM DISK='E:\yedekler\ogrencibilgi_full.bak'
WITH REPLACE, NORECOVERY;

-- Adım 2: Fark yedeğini NORECOVERY ile geri yükle
RESTORE DATABASE OgrenciBilgi
FROM DISK='E:\yedekler\ogrencibilgidiff.bak'
WITH NORECOVERY;

-- Adım 3: İşlem günlüğü yedeğini geri yükle (opsiyonel: belirli bir zamana kadar)
RESTORE LOG OgrenciBilgi
FROM DISK='E:\yedekler\ogrencibilgi_log1.trn'
WITH FILE = 1, -- Eğer bir yedekleme dosyası içinde birden fazla log yedeği varsa
     STOPAT = '2025-06-29 14:40:00', -- Bu zamana kadar olan işlemleri uygula
     RECOVERY; -- En son yedekleme uygulandıktan sonra veri tabanını kullanıma aç
RESTORE Seçenekleri
  • WITH RECOVERY: Geri yükleme sonrası veri tabanını hemen kullanıma açar. Eğer bu seçenekle bir geri yükleme yapıldıysa, üzerine fark veya işlem günlüğü yedeği uygulanamaz. Bu varsayılan seçenektir.
  • WITH NORECOVERY: Geri yükleme sonrası veri tabanını 'Restoring' (geri yükleniyor) modunda bırakır. Bu durumda kullanıcılar veri tabanına erişemez. Üzerine ek fark veya işlem günlüğü yedekleri uygulanacaksa bu seçenek zorunludur.
  • WITH STANDBY: NORECOVERY ile benzerdir, ancak veri tabanı sadece salt okunur modda erişilebilir olur. Bu, felaket kurtarma senaryolarında, veri tabanı tam olarak kurtarılırken bile kullanıcıların eski verilere erişmesini sağlar.
  • WITH REPLACE: Eğer aynı isimde bir veri tabanı varsa, mevcut veri tabanını siler ve yedeği onun yerine geri yükler. Bu seçenek tehlikelidir ve dikkatli kullanılmalıdır!
  • WITH MOVE 'logical_file_name' TO 'physical_file_path': Veri tabanı dosyalarının (MDF, LDF) farklı bir fiziksel konuma geri yüklenmesi gerektiğinde kullanılır.
---

Diğer Yedekleme ve Geri Yükleme Konuları

Mirroring Media Set (Aynalanmış Medya Seti)

Yedeklerin birden fazla diske veya ağ konumuna aynı anda yazılmasını sağlar. Bir yedek kopyası bozulursa, diğer kopyadan kurtarma yapılabilir. Bu, yedekleme dosyasının da dayanıklılığını artırır.

BACKUP DATABASE veritabani_adi
TO DISK = 'C:\yedekler\yedek1.bak',
TO DISK = 'D:\yedekler\yedek2.bak' -- Birincil disk set
MIRROR TO DISK = '\\network_share\yedekler\yedek1_mirror.bak',
TO DISK = '\\network_share\yedekler\yedek2_mirror.bak' -- Aynalanmış disk set
WITH MEDIANAME='AynaliYedekSeti';
bcp Utility (Bulk Copy Program)

SQL Server'a veya SQL Server'dan veri kopyalamak için kullanılan bir komut satırı aracıdır. Tüm veri tabanının yedeklemesi için değil, belirli tabloların verilerini dosyalara aktarmak veya dosyalardan tabloya toplu veri yüklemek için kullanılır. Genellikle SQL Server servislerinin yüklü olduğu sunucularda CMD üzerinden çalıştırılır.

-- Tablodaki verileri bir dosyaya yedekleme (cmd'den çalıştırılır)
bcp "SELECT * FROM VeritabaniAdi.dbo.TabloAdi" out "C:\yedekler\TabloAdi.txt" -T -c

-- Bir dosyadan tabloya veri yükleme
bcp VeritabaniAdi.dbo.TabloAdi in "C:\yedekler\TabloAdi.txt" -T -c

Parametreler: -T (trusted connection), -c (karakter tipi), -t (alan ayırıcı), -r (satır sonu ayırıcı) vb.

MSDB Veri Tabanı ve Yedekleme Bilgileri

SQL Server, tüm yedekleme geçmişini msdb veri tabanında saklar. Bu veri tabanındaki sistem tabloları (örneğin backupset, backupmediafamily, backupfile), hangi veri tabanının ne zaman ve nasıl yedeklendiğine dair kritik bilgiler içerir. Bu bilgiler, geri yükleme senaryolarında veya yedekleme geçmişini denetlerken oldukça faydalıdır.

-- Son 10 yedeği listeleme örneği
SELECT TOP 10
    bs.database_name,
    bs.backup_start_date,
    bs.backup_finish_date,
    bs.type AS BackupType, -- D=Full, I=Diff, L=Log
    bmf.physical_device_name
FROM msdb.dbo.backupset bs
JOIN msdb.dbo.backupmediafamily bmf ON bs.media_set_id = bmf.media_set_id
ORDER BY bs.backup_start_date DESC;

Veri tabanı yedeklemesi, bir veri tabanı yöneticisinin veya geliştiricisinin en önemli sorumluluklarından biridir. Doğru yedekleme stratejisini belirlemek, düzenli olarak yedek almak ve bu yedekleri geri yükleme senaryolarında test etmek, olası veri kayıplarını ve iş kesintilerini minimuma indirmenin anahtarıdır. Unutmayın, yedeği olmayan veri, aslında hiç olmayan veridir!

Webkolog'u takipte kalın!

Hepinize hatasız ve başarılı veri tabanı yedeklemeleri dilerim!

0 yorum:

Yorum Gönder