Mssql Server “The log in this backup set begins at LSN XXXXXXXXXXXXXX, which is too recent to apply to the database. An earlier log backup that includes LSN XXXXXXYZTXXXLKX can be restored.”Solution of the Error

Bu makalede Restoring modda olan veritabanının hangi log dosyasının yüklenmesi gerektiğini uygulamalı bir şekilde görmüş olacağız.  Makale başlığındanda anladığımız bazen restoring modda olan veritabanı üzerinde hangi log dosyası olduğunu bilemeyiz. Bu yüzden tüm log dosyalarını deneyip uygun LSN değerini buluruz. Log dosyasını restore ederken alınmış olan hata mesajı:

Hangi log dosyasının yüklenmesi gerektiğini Restoring modda olan veritabanının içerisinde yüklü olan full, diff ve log dosyalarını görebiliriz. Aşağıdaki komutla restoring modda olan veritabanında yüklü full,diff ve log dosyalarını görebiliriz.

SELECT TOP (1000)
b.database_name,
CASE type WHEN 'D' THEN 'FULL'
WHEN 'I' THEN 'DIFF'
WHEN 'L' THEN 'TRAN'
END as Backuptype,
f.physical_device_name,
first_lsn,
last_lsn,
database_backup_lsn,
checkpoint_lsn,
backup_start_date,  
backup_finish_date
FROM [msdb].[dbo].[restorehistory] r
inner join msdb..backupset b on r.backup_set_id=b.backup_set_id
left join msdb..backupmediafamily f on b.media_set_id=f.media_set_id where destination_database_name = 'DB_NAME'

Log dosyasını restore yapacağımız zaman aşağıdaki hata mesajında restore etmemiz gereken LSN değeri restore edebiliriz. Aşağıdaki hata mesajında ilk sırada verilen lsn değeri(LSN 36000000254400001) restore etmeye çalıştığımız log dosyasının lsn değeridir.

Microsoft.Data.SqlClient.SqlError: The log in this backup set begins at LSN 36000000254400001, which is too recent to apply to the database. An earlier log backup that includes LSN 36000000198400001 can be restored.

Yukarıdaki ekranda da log dosyaların 7. Log dosyasını  Restore etmemiz gerektiğini pyhsical_device_name kısmından anlayabiliriz. Yukarıdaki ekran resmindeki last_lsn değerine bakarak aşağıdaki kod’a eklenir. İlgili lsn değerine sahip log backup görülmektedir.

An earlier log backup that includes LSN 36000000198400001 can be restored. Hata mesajınında belirtilen LSN en son restore edilen  log backup’ın last_lsn  bilgisini vermektedir. Restore edilecek log dosyasınında first lsn değerini vermektedir.

Aşağıdaki komutta hata mesajında dönen LSN değerini işleme aldığımızda hangi log dosyası olduğunu çıktı olarak bizlere vermiş oluyor.

DECLARE @LSNToFind NUMERIC(25,0) = 36000000198400001 -- Buraya bulmak istediğiniz LSN'yi yazın 

SELECT backup_start_date, backup_finish_date, first_lsn, last_lsn, database_name, physical_device_name FROM msdb.dbo.backupset b 

INNER JOIN msdb.dbo.backupmediafamily m ON b.media_set_id = m.media_set_id

WHERE @LSNToFind BETWEEN b.first_lsn AND b.last_lsn AND b.database_name = 'TRANSAC' -- Buraya veritabanı adınızı yazın 

AND b.type = 'L' -- Log Backup'ı temsil eder 

ORDER BY backup_start_date;

Yukarıdaki resimdede hangi log dosyasının en son restore edildiği görülmektedir. Sadece hata masajındaki LSN değerinin kod bloğunda girilmesi gerekmektedir.

Şimdi belirtilen log dosyamızı restore edelim. Restore işlemimiz başarılı bir şekilde gerçekleşmiş oldu.

Hata mesajında belirtilen LSN restore edilecek log dosyasının first_lsn değeridir.

Log dosyasının restore’sini yaptıktan sonra veritabanımız ayağa kalkmış oldu.

Not: Aşağıdaki komut ile herhangi bir log dosyasının bilgisine ulaşabiliriz.

RESTORE HEADERONLY 

FROM DISK = '\\s1\a\TRANSAC_LOG_8.trn'

Aşağıdaki komut Restoring modda olmayan MEVCUT ÇALIŞAN veritabanının üzerinde bulunan backup setlerini göstermektedir. Yukarıdaki komuttan bağımsız diyebiliriz. Çalışan veritabanları üzerinde aşağıda komut sonucu gelen kayıtlarında son log dosyaları aranıyorsa backuptan sonra tüm loglar alınıp alt alta çalıştırılır. Scriptler hata görüp devam etmektedir.

DECLARE @dbName sysname
SET @dbName = 'DBName'

SELECT
m.physical_device_name,
CAST(CAST(s.backup_size / 1000000 AS INT) AS VARCHAR(14)) + ' ' + 'MB' ASbkSize,
CAST(DATEDIFF(second, s.backup_start_date,
s.backup_finish_date) AS VARCHAR(4)) + ' ' + 'Seconds' TimeTaken,
s.backup_finish_date,
CAST(s.first_lsn AS VARCHAR(50)) AS first_lsn,
CAST(s.last_lsn AS VARCHAR(50)) AS last_lsn,
CASE s.[type] WHEN 'D' THEN 'Full'
WHEN 'I' THEN 'Differential'
WHEN 'L' THEN 'Transaction Log'
END AS BackupType,
s.server_name,
s.recovery_model
FROM msdb.dbo.backupset s
INNER JOIN msdb.dbo.backupmediafamily m ON s.media_set_id = m.media_set_id
WHERE s.database_name = @dbName -- Remove this line for all the database
ORDER BY backup_finish_date asc

Bu makalede restoring modda olan bir veritabanının LSN sorununu çözmüş olduk. Başka bir makalede görüşmek dileğiyle.

“(Ey Muhammed!) Yüz çevirirlerse de ki: Allah bana yeter. O’ndan başka ilâh yoktur. Ben sadece O’na güvenip dayanırım. O yüce Arş’ın sahibidir.” Tevbe-129

Author: Yunus YÜCEL

Bir yanıt yazın

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