SQL Server’da Transaction Log Restore Komutlarını Üretme Yöntemi

Veritabanı yönetimi süreçlerinde, özellikle felaket kurtarma (Disaster Recovery) veya veritabanı taşıma operasyonlarında zaman en kritik faktördür. SQL Server yöneticileri için Full bir yedekten sonra gelen onlarca, hatta yüzlerce Transaction Log dosyasını manuel olarak geri yüklemek hem büyük bir zaman kaybına yol açmakta hem de hata payını artırmaktadır. Manuel olarak yazılan her bir RESTORE komutu, dosya yollarının karıştırılması veya sıranın bozulması riskini taşır.

Bu makalede, SQL Server’ın kendi meta verilerini barındıran msdb veritabanını kullanarak, ihtiyaç duyulan log restorasyon komutlarını saniyeler içinde otomatik olarak nasıl üretebileceğimizi inceleyeceğiz. Paylaşacağım T-SQL betiği sayesinde, belirli bir zaman dilimine ait tüm log yedeklerini doğru sırayla listeleyen dinamik komutlar oluşturabilir, operasyonel süreci çok daha güvenli ve hızlı bir hale getirebilirsiniz.

Aşağıdaki komut sadece Aktif olan veritabanları üzerinde sonuç döndürmektedir.

select *
from msdb.dbo.backupset t
inner join msdb.dbo.backupmediafamily f on (f.media_set_id = t.media_set_id)
where database_name = 'AdventureWorks2017' and backup_start_date >getdate()-1
and type = 'L'
order by backup_start_date

Yukarıdaki kod parçamızın sonucuna dikkat edildiğinde birden fazla log dosyamız olabilir. Bunun restore işlemi aşırı derecede zor bir işlemdir. Çünkü tüm restore adımlarının Notepad üzerinden veya SSMS üzerinden yapılması gerekmektedir.

Öncelikle elimde bir Restore kalıbının olması gerekmektedir. Restore yapacağım veritabanındaki ilk log dosyasını belirtip create scriptini alıyorum.

RESTORE LOG [AdventureWorks2017] FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL15.INST01\MSSQL\Backup\1.trn' WITH  FILE = 1, 
NORECOVERY,  NOUNLOAD,  STATS = 10
GO

Mevcut komutumuz yukarıdaki örnek restore job’ını referans alarak güncellememiz gerekmektedir.

SELECT 'RESTORE LOG [AdventureWorks2017] FROM DISK = N''' + f.physical_device_name + ''' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10'
FROM msdb.dbo.backupset t
INNER JOIN msdb.dbo.backupmediafamily f ON f.media_set_id = t.media_set_id
WHERE database_name = 'AdventureWorks2017' 
  AND backup_start_date > GETDATE() - 1
  AND type = 'L'
ORDER BY backup_start_date;

Gelen sonuç kopyalanır. Toplu bir şekilde çalıştırdıktan sonra Restore işlemimizin hızlı bir şekilde bittiği görülmektedir.

RESTORE LOG [AdventureWorks2017] FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL15.INST01\MSSQL\Backup\10.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
RESTORE LOG [AdventureWorks2017] FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL15.INST01\MSSQL\Backup\11.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
.
.
.
.

SQL Server’da veritabanı tutarlılığını sağlamak ve veri kaybını minimuma indirmek için log zincirinin bozulmadan takip edilmesi hayati önem taşır. Geleneksel yöntemlerle tek tek dosya seçerek ilerlemek yerine, sistem tablolarından güç alan dinamik scriptler kullanmak bir veritabanı yöneticisinin en büyük yetkinliklerinden biridir. Bu yöntemle sadece zamandan tasarruf etmekle kalmaz, aynı zamanda insan hatasından kaynaklanabilecek kesintilerin de önüne geçmiş olursunuz.

Burada kurguladığımız yapı, ihtiyaca göre “Point-in-Time Recovery” (belirli bir ana geri dönme) senaryolarına da kolayca entegre edilebilir. Unutulmamalıdır ki; en iyi DBA, işini manuel yapan değil, işini otomatize ederek sistemin sürekliliğini en hızlı şekilde sağlayan kişidir. Bu tür otomasyon araçlarını standart çalışma rutinlerinize dahil ederek, karmaşık restorasyon süreçlerini çok daha yönetilebilir bir seviyeye taşıyabilirsiniz.

Başka makalede görüşmek dileğiyle..

Bilesiniz ki Kalpler Ancak Allah’ı Anmakla Huzur Bulur. Rad-28

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir