Sql-Server

如何找到處於恢復狀態的數據庫的目前日誌序列號 (LSN)?

  • April 17, 2020

我從 AlwaysOn 組中的輔助副本上的可用性組中刪除了我的一個數據庫以進行實驗。我想將其添加回來,但我不能這樣做,因為需要前滾數據庫以匹配主數據庫上的內容(在主數據庫上進行了事務日誌備份,我想這會清除主數據庫上的日誌並且使得無法在不從事務日誌恢復的情況下將數據庫加入到輔助節點上的可用性組)。

數據庫現在處於“正在恢復”狀態。我在主副本上有事務備份文件,我可以複製在輔助副本上執行事務備份恢復所需的文件以將其前滾。我嘗試了幾個文件,但出現以下錯誤

事務備份舊錯誤

我了解這意味著我的日誌備份比數據庫的目前狀態更舊。數據庫的目前狀態似乎有最後一個 LSN 是錯誤消息中的第二個數字。問題:如何查詢數據庫以找出第二個數字LSN 956952100000057?這條錯誤消息是我唯一可以看到的地方嗎?

如果您使用“HeaderOnly”恢復日誌備份,您將在此備份中包含第一個和最後一個 LSN。

您希望找到包含錯誤消息中提到的 LSN 的日誌備份(數據庫所在的位置)。

現在,如果你想找到這個 LSN,你必須查詢 sys.master_files DMV 並查看 redo_start_lsn 列。

Select redo_start_lsn from sys.master_files where database_id=DB_ID('yourDB') and type_desc = 'LOG'

使用此查詢,您可以一次對數據庫的所有備份執行RESTORE 語句 - HEADERONLY :

DECLARE @location nvarchar(520);
DECLARE backup_location CURSOR  
   FOR SELECT DISTINCT
           bmf.physical_device_name
       FROM sys.master_files mf
           INNER JOIN msdb.dbo.backupfile bf
           ON mf.file_guid = BF.file_guid
           INNER JOIN msdb.dbo.backupmediafamily bmf
           ON bmf.media_set_id = bf.backup_set_id
       WHERE database_id = DB_ID('YourDatabaseName');

OPEN backup_location;  
FETCH NEXT FROM backup_location INTO @location;

WHILE @@FETCH_STATUS = 0  
   BEGIN  
       SELECT @location;
       RESTORE HEADERONLY FROM disk = @location;
       FETCH NEXT FROM backup_location INTO @location; 
   END  

CLOSE backup_location;  
DEALLOCATE backup_location;

引用自:https://dba.stackexchange.com/questions/265257