SQL Express yedek alma işlemi, SQL Server Express üzerinde SQL Server Agent bulunmadığı için ayrıca planlanmalıdır. Bu rehberde SQL scripti, sqlcmd ve Windows Task Scheduler kullanarak otomatik yedekleme oluşturacağız; ardından yedeğin gerçekten kullanılabilir olduğunu doğrulayacağız.
Amaç
Hedef; SQL Server Express veritabanlarının düzenli olarak .bak dosyasına yedeklenmesi, işlemin loglanması ve belirlenen saklama süresinden eski yedeklerin kontrollü biçimde temizlenmesidir.
Ön Koşullar
- SQL Server Express instance adı ve yedeklenecek veritabanlarının bilinmesi
- Yedek klasöründe SQL Server servis hesabının yazma yetkisi
sqlcmdaracının kurulu ve erişilebilir olması- Task Scheduler görevini çalıştıracak hesabın gerekli yerel izinlere sahip olması
1. Yedek Klasörünü Hazırlayın
D:SQL-BACKUP
Klasörü oluşturduktan sonra SQL Server servis hesabının bu dizine yazabildiğini doğrulayın. Yalnızca Task Scheduler hesabına izin vermek yeterli olmayabilir; BACKUP DATABASE işlemi dosyayı SQL Server servis bağlamında oluşturur.
2. backup.sql Dosyasını Oluşturun
Aşağıdaki örnek kullanıcı veritabanlarını tarih damgalı dosyalara yedekler. Önce test ortamında çalıştırın.
DECLARE @path nvarchar(260) = N'D:SQL-BACKUP';
DECLARE @date char(12);
DECLARE @sql nvarchar(max);
SET @date = CONVERT(char(8), GETDATE(), 112)
+ REPLACE(CONVERT(char(5), GETDATE(), 108), ':', '');
DECLARE db_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT name
FROM sys.databases
WHERE database_id > 4
AND state_desc = 'ONLINE';
DECLARE @db sysname;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @db;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = N'BACKUP DATABASE ' + QUOTENAME(@db)
+ N' TO DISK = N''' + @path
+ REPLACE(@db, '''', '''''') + N'_backup_' + @date + N'.bak'''
+ N' WITH CHECKSUM, INIT, STATS = 10;';
EXEC sys.sp_executesql @sql;
FETCH NEXT FROM db_cursor INTO @db;
END
CLOSE db_cursor;
DEALLOCATE db_cursor;
CHECKSUM yedekleme sırasında ek bütünlük kontrolü sağlar. Ancak başarılı bir BACKUP komutu tek başına geri yüklenebilirlik garantisi değildir; doğrulama ve restore testi ayrıca yapılmalıdır.
3. Komutu Windows Kimlik Doğrulamasıyla Çalıştırın
Mümkünse komut satırına SQL kullanıcı adı ve parolası yazmak yerine Windows Authentication kullanın:
sqlcmd -S .SQLEXPRESS -E -b -i "D:SQL-BACKUPbackup.sql" -o "D:SQL-BACKUPbackup.log"
-E: Windows Authentication kullanır.-b: SQL hatasında işlem için hata kodu döndürür; zamanlanmış görevin başarısızlığı fark etmesini kolaylaştırır.-i: çalıştırılacak SQL dosyasını belirtir.-o: çıktıyı log dosyasına yazar.
SQL Authentication zorunluysa parolayı düz metin CMD/BAT dosyasına gömmek yerine kurumunuzun secret/credential yönetim yöntemini kullanın.
4. Task Scheduler Görevini Oluşturun
- Task Scheduler üzerinden yeni bir görev oluşturun.
- Görevi gerekli minimum yetkiye sahip servis hesabıyla çalıştırın.
- Günlük veya ihtiyaca uygun tetikleyici tanımlayın.
- Program olarak
sqlcmd.exe, argüman olarak yukarıdaki parametreleri kullanın. - Görevi manuel çalıştırıp Last Run Result ve
backup.logçıktısını kontrol edin.
Task Scheduler hakkında ayrıntı için Görev Zamanlayıcı rehberine bakabilirsiniz.
5. Yedeği Doğrulayın
Oluşan dosyanın varlığını görmek yeterli değildir. SQL Server üzerinden yedek setini doğrulayın:
RESTORE VERIFYONLY
FROM DISK = N'D:SQL-BACKUPDatabase_backup_YYYYMMDDHHMM.bak'
WITH CHECKSUM;
RESTORE VERIFYONLY yararlı bir kontroldür fakat gerçek bir test restore işleminin yerini tutmaz. Kritik veritabanlarında periyodik olarak izole bir test instance’ına restore yapın.
6. Eski Yedekleri Kontrollü Temizleyin
Retention işlemini SQL Server içinden undocumented prosedürlere bağlamak yerine dosya sistemi katmanında açıkça yönetmek daha okunabilir olabilir. Örneğin PowerShell ile 7 günden eski .bak dosyalarını önce listeleyin:
Get-ChildItem 'D:SQL-BACKUP' -Filter *.bak -File |
Where-Object LastWriteTime -lt (Get-Date).AddDays(-7)
Çıktıyı doğruladıktan sonra kontrollü silme işlemi eklenebilir. Üretimde retention süresini kurumun yedekleme ve geri dönüş politikasına göre belirleyin.
Troubleshooting
Operating system error 5 — Access is denied
Yedek klasöründe SQL Server servis hesabının yazma yetkisini kontrol edin.
sqlcmd bulunamıyor
where sqlcmd ile aracın PATH içinde olup olmadığını kontrol edin. Gerekirse tam executable yolunu Task Scheduler görevinde kullanın.
Task Scheduler başarılı görünüyor fakat yedek yok
-b parametresini, SQL logunu, görev geçmişini ve SQL Server error logunu birlikte inceleyin. Görevin hangi kullanıcı bağlamında çalıştığını da doğrulayın.
Güvenlik ve Best Practice
- SQL
saparolasını BAT/CMD dosyasında düz metin tutmayın. - Yedek klasörüne yalnız gerekli hesapların erişmesini sağlayın.
- Yedekleri mümkünse üretim sunucusundan bağımsız ikinci bir konuma da kopyalayın.
- Başarılı job sonucu yerine restore edilebilirliği ölçün.
- Yedekleme ve retention hatalarını izlenebilir/loglanabilir hale getirin.
Sonuç
SQL Server Express üzerinde SQL Agent bulunmaması otomatik yedeklemeye engel değildir. sqlcmd, Task Scheduler ve kontrollü bir SQL scriptiyle süreç otomatikleştirilebilir. Kritik nokta yalnızca .bak üretmek değil; yetkileri doğru tasarlamak, hata kodlarını izlemek ve yedeği düzenli restore testleriyle doğrulamaktır.
