SQL Server yedekleme stratejisi, otomasyon ve restore
SQL ServerSeviye: OrtaSüre: 30–90 dkKurulu bir SQL Server instance'ının (Linux ya da Windows; tek instance, FCI ya da AG replica'ları) yedeklerini kurar ve yedekten kurtarır. Yedekleme: recovery model seçimi, haftalık full + günlük differential + n dakikada bir log yedeği, COMPRESSION, CHECKSUM, sertifikayla şifreleme, retention ve zamanlama (SQL Server Agent T-SQL job'ları ya da Ola Hallengren; Express'te Task Scheduler / cron), tek seferlik COPY_ONLY yedek, yedek doğrulama ve zincir kontrolü. Kurtarma: full / differential / log zinciri restore, STOPAT ile belirli bir ana dönüş (PITR), işaretli transaction, WITH MOVE ile başka ada ya da sunucuya restore, veri dosyası kaybında tail-log + restore, page restore, master / msdb / model restore, login eşleme (orphaned user) ve şifreli yedekte sertifika yükleme.
Ne yapacağınızı senaryo kartından seçin; hata kodunu (ör. 824, 4305, 33111, 18456) katalog aramasına yazarak doğrudan ilgili senaryoya gelebilirsiniz. Tablo ya da sorgu sonucunu dosyaya aktarmak (yedek değil, veri taşıma) için bcp ile dışa aktarma.
Yapı: 1 sunucu, Failover Cluster Instance ya da Always On AG replica'ları (restore başka sunucuya: kaynak + hedef)
Senaryolar
- Yedekleme stratejisi kur (zamanlanmış yedekler + retention) — Yeni sunucu ya da düzenli yedeği olmayan veritabanı: full / differential / log job'ları, retention ve izleme kurulur.
- Tek seferlik yedek al (ör. değişiklik öncesi COPY_ONLY) — Değişiklik, patch ya da upgrade öncesi ya da test ortamına kopya için tek bir yedek; COPY_ONLY zinciri bozmaz.
- Yedekleri doğrula (geçmiş, VERIFYONLY, test restore) — Yedeklerin gerçekten açılabildiğini kanıtlamak için: yedek geçmişi, VERIFYONLY, HEADERONLY / FILELISTONLY ve geçici veritabanına test restore + CHECKDB.
- Yedek zinciri sağlam mı? (LSN boşluğu, eksik dosya) — Restore'dan önce ya da düzenli denetimde: msdb geçmişinden zinciri çıkarır; LSN boşluklarını, diskte olmayan dosyaları ve araya giren yedekleri bulur. Hiçbir şeyi değiştirmez.
- Veritabanını yedekten geri yükle (zincir, STOPAT / STOPATMARK, MOVE / REPLACE, başka sunucu) — Veri silindi ya da yanlış güncellendi, veritabanının kopyası gerekiyor ya da başka sunucuya taşınacak; instance çalışıyor. Full + differential + log zinciri, belirli bir an ya da işaretli transaction, farklı ad / dizin, tail-log ile son ana.
- Veritabanı açılmıyor: veri dosyası kayıp ya da bozuk (tail-log + restore) — Veritabanı RECOVERY_PENDING ya da SUSPECT, .mdf/.ndf okunamıyor ama instance çalışıyor: önce NO_TRUNCATE ile tail-log alınır, sonra son ana kadar restore edilir. Veritabanı işlem bitene kadar kapalıdır.
- Birkaç sayfa bozuk (Msg 823 / 824): page restore — Sorgular ya da CHECKDB belirli sayfalarda hata veriyor (msdb.dbo.suspect_pages): yalnız bozuk sayfalar yedekten geri yüklenir. Enterprise/Developer'da veritabanı açık kalır, Standard/Express'te kısa süre kapanır.
- master veritabanını geri yükle (tek kullanıcı modu) — master bozuk ya da login / linked server / sunucu ayarı kaybı: instance tek kullanıcı modunda (-m) başlatılır, master restore edilir, SQL Server kendini kapatır. Kesinti gerekir; instance hiç açılmıyorsa önce sistem veritabanları yeniden oluşturulur.
- msdb ya da model veritabanını geri yükle — Job'lar, yedek geçmişi, Database Mail (msdb) ya da yeni veritabanı şablonu (model) bozuk / kayıp: aynı build'de alınmış yedekten REPLACE ile geri yüklenir; Agent kısa süre durur.
- Restore sonrası kullanıcılar bağlanamıyor (orphaned user, login eşleme) — Veritabanı başka sunucuya taşındı ya da restore edildi, uygulama 'Login failed' alıyor: login'ler SID ve parola hash'iyle kaynaktan taşınır, kalan kullanıcılar login'e bağlanır. Veritabanı açık kalır.
- Şifreli yedek açılmıyor (sertifika yok, Msg 33111) — Yedek (ya da TDE'li veritabanının yedeği) sertifikayla şifreli ve bu sunucuda sertifika yok: thumbprint bulunur, sertifika private key ile yüklenir, yedek doğrulanır. Mevcut veritabanlarına dokunulmaz.
Başlamadan önce
- RPO (göze alınabilen veri kaybı) ve RTO (kabul edilebilir kesinti) iş birimiyle yazılı olarak belirlendi. Seçilen plan: …en fazla … dakika veri kaybı…son full/differential yedeğe dönüş (SIMPLE: bir güne kadar veri kaybı)…; restore süresi en büyük veritabanının test restore'u ile ölçülecek.
- SQL Server çalışıyor; mssql-tools18 (sqlcmd) kurulu ve … sysadmin. Betiği çalıştırmadan önce parolayı ekrana yazmadan değişkene alın: read -rsp 'Parola: ' SQLCMDPASSWORD; export SQLCMDPASSWORD ve sudo --preserve-env=SQLCMDPASSWORD bash <betik>.sh.
- PowerShell yönetici olarak (Başlat → "PowerShell" → sağ tık → Run as administrator; başlıkta Administrator:) ve SQL Server'da sysadmin olan bir Windows hesabıyla açıldı; sqlcmd PATH'te.
- Yedek dizini (…) veri diskinden ayrı bir diskte ve en az bir haftalık yedeklere yetecek boş alan var (kabaca: kullanılan veri boyutu × 2 + günlük değişim × gün sayısı; sıkıştırmayla genelde 3–5 kat daha az).
- Yedek dizini (…) veri diskinden ayrı bir diskte ve en az bir haftalık yedeklere yetecek boş alan var (kabaca: kullanılan veri boyutu × 2 + günlük değişim × gün sayısı; sıkıştırmayla genelde 3–5 kat daha az).
- Veritabanlarının boyutu biliniyor; yedek penceresi (full'ün süreceği zaman) iş saatleriyle çakışmıyor.
- Yedeklerin sunucu dışına (başka bir sunucu, NAS, nesne depolama, yedek yazılımı) kopyalanma yöntemi belirlendi. Aynı diskte duran yedek, disk ya da sunucu kaybında işe yaramaz.
- Restore yapılacak SQL Server sürümü yedeğin alındığı sürümle aynı ya da daha yeni. Daha yeni sürümde alınmış yedek eski sürüme restore edilemez (ör. 2022 → 2019 olmaz).
- Uygulama ekibi bilgilendirildi ve uygulama durduruldu: üzerine restore edilen veritabanındaki tüm bağlantılar kesilir ve restore süresince veritabanı kullanılamaz.
- Hedefte veri (…) ve log (…) dizinleri var, sahibi mssql ve restore edilecek veritabanının dosya boyutları kadar boş alan var (yedeğin boyutu değil; FILELISTONLY'deki Size değerleri).
- Hedefte veri (…) ve log (…) dizinleri var, SQL Server servis hesabının yazma yetkisi var ve restore edilecek veritabanının dosya boyutları kadar boş alan var.
- Hedef sunucudan (…) kaynağa (…) …SSH (root ya da sudo yetkili kullanıcı) ile…SMB yönetim paylaşımı (…) ile… erişilebiliyor; yedek dosyaları kopyalanabilir.
Rehberin aşamaları
- Mevcut durum — Veritabanlarını ve son yedekleri listele
- Yedekleme stratejisi — Yedek dizinini hazırla · Yedek dizinini hazırla · Recovery model'i ayarla (…) · AG yedek tercihini ayarla (…) · Tercih edilen replica'yı kontrol et · Sertifikayı oluştur ve yedeğini al (şifreleme) …
- Tek seferlik yedek — …COPY_ONLY full yedek al…Full yedek al…Differential yedek al…Log yedeği al… (…) · Yedek geçmişini kontrol et (msdb.dbo.backupset)
- Restore — Restore zincirini yedek geçmişinden bul · Yedek dosyalarını hedef sunucuya kopyala · Yedek dosyalarını hedef sunucuya kopyala · Sertifikayı hedef sunucuya yükle · Sertifikayı hedef sunucuya yükle · Yedek dosyalarını incele (VERIFYONLY, HEADERONLY, FILELISTONLY) …
- Yedek doğrulama — Yedek geçmişini kontrol et (msdb.dbo.backupset) · Yedek dosyasını incele (VERIFYONLY, HEADERONLY, FILELISTONLY) · Test restore yap ve DBCC CHECKDB çalıştır
- Yedek zinciri kontrolü — Teşhis: zincirin durumu (veritabanı + msdb geçmişi) · Yedek dosyaları diskte mi? · Yedek dosyaları diskte mi? · Zincirdeki her yedeği doğrula (VERIFYONLY) · Sonrası: zincir kırıksa yeni full yedek al
- Veri dosyası kayıp / bozuk: tail-log + restore — Teşhis: veritabanının ve dosyalarının durumu · Teşhis: dosyalar diskte mi, log dosyası sağlam mı? · Teşhis: dosyalar diskte mi, log dosyası sağlam mı? · Güvenlik ağı: kalan dosyaların kopyasını al · Güvenlik ağı: kalan dosyaların kopyasını al · Tail-log yedeği al (NO_TRUNCATE) …
- Page restore (bozuk sayfalar) — Teşhis: bozuk sayfaları bul (suspect_pages, CHECKDB) · Teşhis: sayfa hangi tabloya / index'e ait? · Güvenlik ağı: log yedeği al, log yedek job'larını durdur · Restore sırasını msdb geçmişinden çıkar (PAGE) · Tail-log yedeği al (NORECOVERY): veritabanı kapanır · Bozuk sayfaları geri yükle ve log yedeklerini uygula (NORECOVERY) …
- master restore — Teşhis: yedek dosyası, sürüm ve kaybolacaklar · Teşhis: SQL Server neden açılmıyor? · Teşhis: SQL Server neden açılmıyor? · Sistem veritabanlarını yeniden oluştur (master açılmıyor) · Sistem veritabanlarını yeniden oluştur (master açılmıyor) · SQL Server'ı tek kullanıcı modunda başlat …
- msdb / model restore — Teşhis: durum, sürüm ve yedek dosyası · Güvenlik ağı: mevcut … veritabanının yedeği · SQL Server Agent'ı durdur · … veritabanını geri yükle (REPLACE) · SQL Server Agent'ı başlat · Doğrula
- Login eşleme (orphaned user) — Teşhis: yetim kullanıcıları bul (hedef) · Login betiğini kaynakta üret (SID + parola hash) · Login betiğini kaynakta üret (SID + parola hash) · Login betiğini hedefe kopyala ve çalıştır · Login betiğini hedefe kopyala ve çalıştır · Kalan kullanıcıları login'e bağla (ALTER USER WITH LOGIN) …
- Şifreli yedek: sertifikayı yükle — Teşhis: bu sunucudaki sertifikalar ve master key · Teşhis: sertifika dosyasının thumbprint'i · Teşhis: sertifika dosyasının thumbprint'i · Sertifikayı private key ile yükle · Sertifikayı private key ile yükle · Doğrula: yedek artık okunuyor …