Sql & Veritabanı İle Veri Tabanı İçin Otomatik Zamanlanmış Yedekleme Nasıl Yapılır?

Sql & Veritabanı İle Veri Tabanı İçin Otomatik Zamanlanmış Yedekleme Nasıl Yapılır?
Sql & Veritabanı İle Veri Tabanı İçin Otomatik Zamanlanmış Yedekleme Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Otomatik yedekleme sistemine başlamadan önce ortamınızın hazır olduğundan emin olmalısınız. İşletim sistemi düzeyinde zamanlanmış görevleri (Task Scheduler veya Cron Jobs) yönetebilme yetkinliğine sahip olmanız gerekir.

  • Veritabanı Erişimi: Yönetici (sysadmin veya root) düzeyinde yetki.
  • Depolama Alanı: Yedeklerin tutulacağı güvenli, tercihen farklı bir fiziksel disk veya bulut depolama birimi.
  • Yetkilendirme: Yedekleme betiğinin çalışacağı kullanıcı hesabının, veritabanı üzerinde "BACKUP" yetkisine sahip olması.
  • Sistem Araçları: Linux sistemler için crontab, Windows sistemler için Task Scheduler (Görev Zamanlayıcı).

SQL Server Üzerinde Yedekleme Stratejisi

SQL Server'da yedekleme işlemini otomatize etmek için en etkili yöntem T-SQL (Transact-SQL) komutlarını bir "SQL Server Agent" görevi ile çalıştırmaktır. Aşağıdaki kod bloğu, veritabanınızı belirli bir dizine tarih damgasıyla yedeklemenizi sağlar.

-- Veritabanı yedekleme scripti
DECLARE @BackupPath NVARCHAR(256) = 'C:\Backups\Veritabani_' + CONVERT(VARCHAR(8), GETDATE(), 112) + '.bak';
BACKUP DATABASE [ProjeDB] 
TO DISK = @BackupPath 
WITH FORMAT, INIT, NAME = 'Tam Yedekleme', SKIP, NOREWIND, NOUNLOAD, STATS = 10;
GO

Bu komut, ProjeDB isimli veritabanını belirtilen dizine o günün tarihini içeren bir isimle kaydeder. FORMAT ve INIT parametreleri, dosyanın üzerine yazılmasını ve temiz bir yedek oluşturulmasını sağlar.

Linux Sistemlerde MySQL/MariaDB İçin Cron Job Kullanımı

Linux tabanlı sistemlerde mysqldump aracı, veritabanı yedekleme standartıdır. Bu işlemi otomatize etmek için crontab kullanılır. Aşağıdaki örnek, her gece saat 03:00'te çalışan bir otomasyonu temsil eder.

# Crontab dosyasına eklenecek satır
0 3 * * * /usr/bin/mysqldump -u yedek_kullanici -p'Sifre123' veritabani_adi > /home/backups/db_yedek_$(date +\%Y\%m\%d).sql

Bu satır, sistemin zamanlayıcısına her gün saat 03:00'te yedekleme komutunu tetiklemesi talimatını verir. Güvenlik gerekçesiyle şifreyi doğrudan komut satırına yazmak yerine, .my.cnf yapılandırma dosyasını kullanmanız önerilir.

Yedekleme Yöntemlerinin Karşılaştırılması

Hangi yöntemi seçeceğiniz, projenizin büyüklüğüne ve kullandığınız veritabanı motoruna bağlıdır. Aşağıdaki tablo, farklı stratejilerin avantajlarını özetlemektedir.

Yöntem Avantaj Dezavantaj
SQL Agent (MS SQL) Entegre ve yönetimi kolay Lisans maliyeti gerektirebilir
Cron Job (MySQL) Hafif ve ücretsiz Hata yönetimi manuel yapılmalı
Bulut Tabanlı Servisler Felaket kurtarma (DR) hazır İnternet bağımlılığı

Güvenlik ve Hata Yönetimi

Kritik Uyarı: Yedek dosyalarınız, veritabanınızın tüm içeriğini barındırır. Bu dosyaları şifrelemeden genel erişime açık sunucularda tutmak, büyük bir güvenlik zafiyetidir. Yedeklerinizi mutlaka AES-256 gibi güçlü algoritmalarla şifreleyin ve "3-2-1" kuralını (3 kopya, 2 farklı ortam, 1 kopya şirket dışında) uygulayın.

Yedekleme betiğinizin başarılı olup olmadığını anlamak için bir loglama mekanizması kurmalısınız. Aşağıdaki kod, bash betiği içinde hata kontrolünün nasıl yapılacağını gösterir.

#!/bin/bash
BACKUP_FILE="/backups/db_$(date +%F).sql"
if mysqldump -u root veritabani > $BACKUP_FILE; then
    echo "Yedekleme başarılı: $BACKUP_FILE" >> /var/log/db_backup.log
else
    echo "HATA: Yedekleme başarısız!" >> /var/log/db_backup.log
    exit 1
fi

Bu betik, işlem başarılıysa log dosyasına kayıt atar, başarısız olursa hata mesajı döndürür. Bu sayede sistem yöneticisi olarak yedekleme süreçlerini takip edebilirsiniz.

Otomatik Yedeklerin Test Edilmesi

Yedek almak kadar, alınan yedeğin geri yüklenebilir olduğunu doğrulamak da kritiktir. Ayda bir kez "Restore" testi yapmalısınız. Aşağıdaki örnek, bir SQL dosyasının geri yüklenmesi sürecini gösterir.

-- Geri yükleme işlemi (Dikkat: Mevcut veriyi siler)
USE master;
ALTER DATABASE ProjeDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE ProjeDB FROM DISK = 'C:\Backups\Veritabani_20260101.bak' WITH REPLACE;
ALTER DATABASE ProjeDB SET MULTI_USER;

Bu işlem, veritabanını tek kullanıcılı moda alarak yedeği üzerine yazar. İşlem bittikten sonra veritabanı tekrar çok kullanıcılı moda döndürülür.

Sıkça Sorulan Sorular

Yedekleme işlemleri veritabanı performansını etkiler mi?

Evet, özellikle büyük veritabanlarında yedekleme sırasında I/O (giriş/çıkış) yoğunluğu artar. Bu nedenle yedeklemeleri sistemin en yoğun olmadığı gece saatlerinde planlamalısınız.

Yedeklerimi ne kadar süre saklamalıyım?

Bu tamamen yasal düzenlemelere ve kurum politikasına bağlıdır. Genellikle günlük yedekler 1 ay, haftalık yedekler 6 ay ve aylık yedekler 1 yıl süreyle saklanır.

SQL Injection riski yedekleme için geçerli midir?

Yedekleme betikleri genellikle sistem seviyesinde çalıştığı için doğrudan SQL Injection riski taşımazlar. Ancak betik içine gömülen veritabanı kullanıcı bilgilerinin güvenliği, sistem güvenliğinin bir parçasıdır.

Bulut depolama yedekleme için güvenli mi?

Doğru yapılandırılmış (şifrelenmiş ve erişim kontrollü) bulut depolama çözümleri, fiziksel sunucu arızalarına karşı en güvenli yöntemdir.

Farklı veritabanı motorları için aynı aracı kullanabilir miyim?

Hayır, her veritabanı motorunun (MySQL, PostgreSQL, SQL Server) kendine has yedekleme araçları ve komutları vardır. Ancak zamanlama (Cron/Task Scheduler) mantığı hepsinde aynıdır.

İleri Seviye Yedekleme: Artımlı (Incremental) ve Diferansiyel Yedekleme Stratejileri

Otomatik yedekleme süreçlerinde veritabanı boyutunuz büyüdükçe, her seferinde tam yedek (full backup) almak hem disk alanını tüketir hem de sistem kaynaklarını aşırı yorar. Bu noktada, sadece değişen verileri yedekleyen stratejilere geçiş yapmak kritik bir önem taşır.

Artımlı Yedekleme Mantığı

Artımlı yedekleme, en son alınan yedekleme işleminden bu yana değişen verileri yakalar. Bu yöntem, yedekleme süresini ciddi oranda kısaltır ancak geri yükleme (restore) sırasında zincirleme bir bağımlılık oluşturur. Geri yükleme yaparken önce son tam yedeği, ardından sırasıyla tüm artımlı yedekleri uygulamanız gerekir.

SQL Server üzerinde artımlı yedekleme için DIFFERENTIAL parametresini kullanan örnek bir T-SQL betiği aşağıdadır:

-- Diferansiyel yedekleme komutu
BACKUP DATABASE [SirketVeritabani]
TO DISK = 'C:\Yedekler\Sirket_Diff.bak'
WITH DIFFERENTIAL, COMPRESSION, STATS = 10;

Yedekleme Zinciri Yönetimi

Artımlı yedekleme kullanırken, yedekleme zincirinin kopmaması için dikkatli olmalısınız. Eğer zincirdeki bir dosya bozulursa veya kaybolursa, o noktadan sonraki tüm artımlı yedekler geçersiz kalacaktır. Bu nedenle, haftalık tam yedek ve günlük artımlı yedekleme periyodu (Grandfather-Father-Son stratejisi) en güvenli yaklaşımdır.

Yedekleme Süreçlerinde Hata Ayıklama ve Log Yönetimi

Otomatik yedekleme betikleriniz sessizce hata verebilir. Örneğin, disk alanı dolduğunda veya veritabanı kilitlendiğinde yedekleme başarısız olur ancak sistem bunu "başarılı" gibi raporlayabilir. Bu durumu engellemek için her yedekleme işleminin sonucunu bir log dosyasına yazmalı ve hata durumunda bildirim almalısınız.

Bash ile Hata Kontrollü Yedekleme Senaryosu

Aşağıdaki örnek, MySQL yedeklemesi sırasında hata oluşursa sistem yöneticisine bilgi veren veya log kaydı tutan bir yapı sunar:

#!/bin/bash
BACKUP_DIR="/var/backups/db"
DATE=$(date +%Y-%m-%d)
LOG_FILE="$BACKUP_DIR/backup_log_$DATE.log"

# Yedekleme komutu
mysqldump -u root -p'sifre' veritabani_adi > "$BACKUP_DIR/db_$DATE.sql" 2>> "$LOG_FILE"

# Hata kontrolü
if [ $? -eq 0 ]; then
    echo "[$DATE] Yedekleme başarıyla tamamlandı." >> "$LOG_FILE"
else
    echo "[$DATE] HATA: Yedekleme başarısız oldu!" >> "$LOG_FILE"
    # Buraya e-posta gönderen bir mail komutu eklenebilir
    mail -s "Yedekleme Hatası" admin@sirket.com < "$LOG_FILE"
fi

Performans Optimizasyonu İçin İpuçları

  • I/O Önceliği: Yedekleme işlemini nice veya ionice komutları ile düşük öncelikli çalıştırarak, veritabanının canlı sorgulara yanıt verme hızını koruyun.
  • Sıkıştırma: Yedekleri doğrudan sıkıştırılmış formatta (gzip, zstd) alarak disk yazma hızını ve depolama maliyetini optimize edin.
  • Zamanlama: Yedekleme işlemlerini veritabanı trafiğinin en düşük olduğu gece saatlerine planlayın.
Profesyonel Tavsiye: Yedekleme dosyalarınızı asla veritabanının kurulu olduğu aynı fiziksel disk üzerinde tutmayın. Bir disk arızası durumunda hem veritabanını hem de yedeği aynı anda kaybedebilirsiniz. Yedekleri mutlaka harici bir depolama birimine veya ağ sürücüsüne (NAS) kopyalayın.

Sonuç

Veritabanı yedekleme, bir yazılım projesinin sigortasıdır. SQL ve veritabanı sistemlerinde otomatik zamanlanmış yedekleme kurmak, başlangıçta karmaşık görünse de, yukarıdaki adımları takip ederek sürdürülebilir bir yapı kurabilirsiniz. Bir sonraki adım olarak, aldığınız yedeklerin otomatik olarak bulut depolama birimlerine (S3, Azure Blob vb.) aktarılmasını sağlayan entegrasyonları incelemenizi öneririm.

Yasal Sorumluluk Reddi: Bu makaledeki kod örnekleri ve yapılandırma önerileri genel eğitim amaçlıdır. Üretim ortamında (production) uygulamadan önce mutlaka bir test ortamında denemeli ve veritabanı yönetim uzmanınızın onayını almalısınız. Hatalı yapılandırmalardan kaynaklanabilecek veri kayıplarından yazar sorumlu tutulamaz.

Bu yazıya tepkinizi paylaşın:
Deniz Aydın

On yıllık yaşam tarzı editörlüğü deneyimimle karmaşık süreçleri herkesin anlayabileceği basit adımlara dönüştürüyorum. Okuyucuların günlük yaşam kalitesini artıracak uygulanabilir çözümler üretmeye odaklanıyorum.

Yorumlar (0)

Yorum Yaz