MSSQL Server’da Marked Transaction Yöntemi ile Restore

SQL Server’da veri kurtarma senaryoları genellikle belirli bir zaman dilimine (Point-in-Time Recovery) odaklanır. Ancak “saat 14:30’a dön” demek her zaman işe yaramayabilir; çünkü o dakikada veritabanında kritik bir işlemin (örneğin devasa bir maaş ödeme script’i) tam ortasında olunabilir. İşte bu noktada Marked Transaction (İşaretlenmiş İşlem) yöntemi devreye girer.

Veritabanı yöneticileri (DBA) için en büyük kabus, hatalı bir işlemin ardından veritabanını tutarlı bir duruma döndürmektir. Standart geri yükleme işlemlerinde genellikle STOPAT parametresiyle belirli bir zaman damgası kullanılır. Ancak çok sayıda eşzamanlı işlemin gerçekleştiği yoğun sistemlerde, tam olarak hangi saniyede hatanın başladığını kestirmek zordur.

Marked Transaction, Transaction Log içerisine “burası güvenli bir liman” anlamına gelen mantıksal bir etiket bırakmamızı sağlar. Bu sayede geri yükleme yaparken “saat 10:00’a dön” demek yerine, “Hatalı Güncelleme Öncesi etiketine dön” diyerek veriyi tam olarak işlemsel bütünlüğün korunduğu ana çekebiliriz. Bu seçenekler, özellikle transaction log yedeklemelerinin geri yüklenmesinde ve bir veritabanının belirli bir anına geri dönülmesinde önemlidir.

Bir işlemi log dosyasında işaretlemek için BEGIN TRANSACTION komutuyla birlikte WITH MARK ifadesi kullanılır. Bu işlem, işaret adını msdb veritabanındaki logmarkhistory tablosuna kaydeder.

Değişiklik yapacağımız veritabanı üzerinde ilgili Transaction çalıştırılır.

BEGIN TRANSACTION MaasGuncelleme WITH MARK 'Yillik_Zamm_Oncesi';
GO
UPDATE Sales.SalesOrderDetail SET UnitPrice = UnitPrice * 1.20; -- Kritik işlem
GO
COMMIT TRANSACTION MaasGuncelleme;

Aşağıdaki komut ile kontrol işlemi yapılmaktadır.

UnitPrice değerini güncellemeden önce:

UnitPrice değerini güncelledikten sonra:

Marked Transaction yapımızı oluşturduk. Elimizde bulunan full ve log backuplar kullanarak Restore işlemi yapalım. Marked Transaction yapımızın restore edilmesi için oluşturulan veritabanının bulunması gerekmektedir.

SQL Server, bu işareti sadece bir isim olarak değil, bir LSN (Log Sequence Number) ile eşleştirerek saklar. Eğer sistemde bir çökme veya hatalı veri girişi olursa, DBA msdb..logmarkhistory tablosuna bakarak bu etiketin tam zamanını ve geçerliliğini kontrol edebilir.

İlgili transation log restore edilirken Marked transaction kısmından oluşturulan Marked transaction yapımız seçilmektedir.

İlgili ana dönülmek için seçilen işlemlerin scripti alınır. Aşağıdaki resimde dikkat edilirse Restore bölümünün pasif olduğu görülmektedir. Sebebi Marked Transaction olayından dolayıdır.

RESTORE LOG [AdventureWorks2017_2] FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Backup\log2.trn'
WITH  NOUNLOAD, STATS = 10,  STOPATMARK = N'MaasGuncelleme' AFTER N'2026-02-15T23:58:49'
GO

Geri yükleme anında, veritabanı önce en son Full backup ve ardından ilgili Log yedekleri ile beslenir. Ancak son adımda STOPATMARK parametresi kullanılarak tam o etikette durulur.

  • STOPATMARK: Belirlenen işareti de kapsayacak şekilde geri yükler.
  • STOPBEFOREMARK: Belirlenen işaretin tam öncesinde durur (genellikle hata içeren işlemin hemen öncesi için tercih edilir).

Marked Transaction yöntemi, özellikle birden fazla veritabanının (Cross-Database Transactions) birbiriyle ilişkili olduğu senaryolarda hayat kurtarıcıdır. Eğer bir işlem iki farklı veritabanında aynı anda işaretlenirse, her iki veritabanını da tam olarak aynı mantıksal noktaya senkronize bir şekilde geri döndürebilirsiniz.

Ancak unutulmamalıdır ki; bu yöntem her işlem için değil, sadece riskli ve kritik toplu işlemler (batch operations) öncesinde manuel olarak kurgulanmalıdır. Gereksiz her işlemde WITH MARK kullanmak, log dosyasının ve msdb tablosunun şişmesine neden olabilir. Özetle; Marked Transaction, zaman odaklı geri yüklemenin belirsizliğini ortadan kaldıran, DBA’ya cerrahi bir hassasiyet sunan gelişmiş bir kurtarma aracıdır.

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

Ey iman edenler, sabırla ve namazla yardım dileyin. Gerçekten Allah, sabredenlerle beraberdir. Bakara Suresi, 153. Ayet

Author: Yunus YÜCEL

Bir yanıt yazın

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