Sql-Server

非副本僅完整備份會影響事務日誌備份鏈嗎?

  • April 11, 2022

我們配置了完整備份和日誌備份。

在還原期間,我們應用完整備份和後續日誌備份。

我知道如果我進行手動完整備份(非僅複製模式),那麼它將破壞差異鏈。但在此範例中,沒有差異備份。但是有事務日誌鏈。由於非僅複製完整備份,此鍊是否會受到負面影響?

如果我們只是拿你的問題來分析一下msdb數據庫中儲存的資訊,那麼答案是:是的,BACKUP DATABASE ...沒有COPY_ONLY設置參數,會對備份鏈(歷史……)產生影響。

這是因為database_backup_lsn一旦執行 FULLBACKUP DATABASE...語句,與備份資訊一起儲存的(LSN = Log Sequence Number)就會改變。

後續事務日誌 (TLOG) 備份引用完整備份。這顯示在下圖中:

[

在2021-09-11 22:19:17.000創建的日誌備份引用database_backup_lsn了 LSN 1221000000228000037,這是first_lsn大約一周前發生的最後一次完整備份的 LSN。

在2021-09-11 23:15:13.000創建的日誌備份database_backup_lsn使用 LSN引用1221000000714400037,這是在2021-09-11 22:34:32.000first_lsn發生的 FULL 數據庫備份的。

這對您的恢復有何影響?

好吧,如果自給定的 FULL 備份以來,您有一條完整的 TLOG 備份鏈可用,那麼就沒有任何影響。您可以使用 FULL 數據庫備份和隨後的 TLOG 備份文件恢復您的數據庫,直到任何時間點。

但是,如果您的 TLOG 備份鏈中斷,那麼您將只能使用 FULL 備份和任何可用的 TLOG 備份來恢復數據庫,直到失去 TLOG 文件為止。

如何判斷備份日誌鍊是否損壞?(DBA Stackexhange 回答)

資訊

完整備份包含數據庫的一致狀態。(警告:您必須恢復此文件以證明這一點。或者備份僅在恢復後才有效。)

TLOG 備份包含自上次備份(FULL 或 TLOG)以來所有已送出的事務。備份包含 afirst_lsn和 a last_lsn。由於這些通常是按順序排列的,因為last_lsn上一個 TLOG 備份的備份是first_lsn下一個 TLOG 備份的備份,所以您應該有一個連續的 TLOG 備份序列,這將允許您將數據庫恢復到任何時間點,前提是您有完整的 TLOG 備份鏈。

COPY_ONLY 參數

COPY_ONLY參數只是告訴 SQL Server 執行完整備份,但不要重置database_backup_lsn儲存在 msdb 備份歷史記錄中的內容。所有後續的 TLOG 備份仍將基於上次創建的不帶COPY_ONLY參數的完整備份。

SSMS 圖形使用者界面

執行不帶COPY_ONLY標誌的完整備份將改變資訊在 GUI 中的顯示方式。GUI 通常會根據指定的時間顯示使數據庫恢復到一致狀態所需的最後一次 FULL、DIFF 和 TLOG 備份。這是因為 GUI 會讀取 msdb 備份歷史資訊。

查詢 msdb 備份歷史的腳本

為了您的方便,我添加了我使用的腳本。

/* ==================================================================
Author......:  hot2use 
Date........:  25.04.2018
Version.....:  0.1
Server......:  localhost (first created for)
Database....:  msdb
Owner.......:  -
Table.......:  various
Type........:  Script
Name........:  ADMIN_Retrieve_Backup_History_Information.sql
Description.:  Retrieve backup history information from msdb database
............   
............   
............       
History.....:   0.1    h2u First created
............       
............       
================================================================== */
SELECT /* Columns for retrieving information */
      -- CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS SRVNAME, 
      msdb.dbo.backupset.database_name,
      msdb.dbo.backupset.backup_start_date,
      msdb.dbo.backupset.backup_finish_date,
      -- msdb.dbo.backupset.expiration_date, 

      CASE msdb.dbo.backupset.type
           WHEN 'D' THEN 'Full'
           WHEN 'I' THEN 'Diff'
           WHEN 'L' THEN 'Log'
      END  AS backup_type,
      -- msdb.dbo.backupset.backup_size / 1024 / 1024 as [backup_size MB],  
      msdb.dbo.backupmediafamily.logical_device_name,
      msdb.dbo.backupmediafamily.physical_device_name,
      -- msdb.dbo.backupset.name AS backupset_name,
      -- msdb.dbo.backupset.description,
      msdb.dbo.backupset.is_copy_only,
      msdb.dbo.backupset.is_snapshot,
      msdb.dbo.backupset.checkpoint_lsn,
      msdb.dbo.backupset.database_backup_lsn,
      msdb.dbo.backupset.differential_base_lsn,
      msdb.dbo.backupset.first_lsn,
      msdb.dbo.backupset.fork_point_lsn,
      msdb.dbo.backupset.last_lsn
FROM   msdb.dbo.backupmediafamily
      INNER JOIN msdb.dbo.backupset
           ON  msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id 

       /* ----------------------------------------------------------------------------
       Generic WHERE statement to simplify selection of more WHEREs    
       -------------------------------------------------------------------------------*/
WHERE  1 = 1

      /* ----------------------------------------------------------------------------
      WHERE statement to find Device Backups with '{' and date n days back
      ------------------------------------------------------------------------------- */
      -- AND     physical_device_name LIKE '{%'

      /* -------------------------------------------------------------------------------
      WHERE statement to find Backups saved in standard directories, msdb.dbo.backupfile AS b 
      ---------------------------------------------------------------------------------- */
      -- AND     physical_device_name  LIKE '[fF]:%'                          -- STANDARD F: Backup Directory
      -- AND     physical_device_name  NOT LIKE '[nN]:%'                      -- STANDARD N: Backup Directory

      -- AND     physical_device_name  NOT LIKE '{%'                          -- Outstanding Analysis
      -- AND     physical_device_name  NOT LIKE '%$\Sharepoint$\%' ESCAPE '$' -- Sharepoint Backs up to Share
      -- AND     backupset_name NOT LIKE '%Galaxy%'                           -- CommVault Sympana Backup


      /* -------------------------------------------------------------------------------
      WHERE Statement to find backup information for a certain period of time, msdb.dbo.backupset AS b 
      ---------------------------------------------------------------------------------- 
      AND    (CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) >= GETDATE() - 7)  -- 7 days old or younger
      AND    (CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) <= GETDATE())  -- n days old or older

      */

      /* -------------------------------------------------------------------------------
      WHERE Statement to find backup information for (a) given database(s) 
      ---------------------------------------------------------------------------------- */
      -- AND database_name IN ('AdventureWorks2012') -- database names
      -- AND     database_name IN ('rtc')  -- database names

       /* -------------------------------------------------------------------------------
       ORDER Clause for other statements
       ---------------------------------------------------------------------------------- */
       --ORDER BY        msdb.dbo.backupset.database_name, msdb.dbo.backupset.backup_finish_date -- order clause

       ---WHERE msdb..backupset.type = 'I' OR  msdb..backupset.type = 'D'
ORDER BY
      --2,

      2       DESC,
      3       DESC 

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