Backup

沒有完整備份的數據庫差異備份

  • October 13, 2020

晚上 10 點,我安排了一個 SQL 代理作業,以按照時間表進行每日備份:

  • 每日滿:22:00
  • 差速器:每 4 小時
  • 日誌:每 30 分鐘

現在,當我檢查我的備份集時(比如說在 22:30),我看到發生了差異備份而沒有任何完整備份!!。

我沒想到會在明天 16:00 之前啟動並執行備份作業,那時將進行第一次完整備份,但是,我有一個沒有完整備份的差異備份?這怎麼可能?

如果以前沒有執行過備份,則無法執行數據庫的差異備份。DIFF(差異)備份依賴於之前的 FULL 備份。

差異備份基於最近的、以前的完整數據備份。差異備份僅擷取自完整備份以來已更改的數據。差異備份所基於的完整備份稱為差異基礎。完整備份(僅複製備份除外)可以作為一系列差異備份的基礎,包括數據庫備份、部分備份和文件備份。文件差異備份的基本備份可以包含在完整備份、文件備份或部分備份中。

參考: 差異備份 (SQL Server) (Microsoft Docs)

證明論文

您可以通過以下步驟進行檢查:

創建新數據庫

USE [master]
GO
CREATE DATABASE [Q209724_Database]
CONTAINMENT = NONE
ON  PRIMARY 
( NAME = N'Q209724_Database', FILENAME = N'C:\SQL\SQL_DATA\Q209724_Database.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON 
( NAME = N'Q209724_Database_log', FILENAME = N'C:\SQL\SQL_LOGS\Q209724_Database_log.ldf' , SIZE = 3072KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [Q209724_Database] SET COMPATIBILITY_LEVEL = 130
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [Q209724_Database].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

數據庫已創建,但尚未備份。

對新數據庫執行 DIFF 備份

BACKUP DATABASE [Q209724_Database] 
TO  DISK = 'C:\SQL\BACKUP\Q209724_Database.bak' 
WITH DIFFERENTIAL, 
    NOFORMAT, 
    NOINIT, 
    NAME = N'Q209724_Database-Full Database Backup', 
    SKIP, 
    NOREWIND, 
    NOUNLOAD, 
    STATS = 10
GO

輸出

Msg 3035, Level 16, State 1, Line 91
Cannot perform a differential backup for database "Q209724_Database", because a current database backup does not exist. Perform a full database backup by reissuing BACKUP DATABASE, omitting the WITH DIFFERENTIAL option.
Msg 3013, Level 16, State 1, Line 91
BACKUP DATABASE is terminating abnormally.

因此,如果您之前沒有執行過 FULL 備份,您將無法執行 DIFF 備份。

結論

創建數據庫後,有人或備份解決方案已對您的數據庫執行了備份。

檢查備份歷史

您可以將以下腳本中的數據庫名稱更改為您的數據庫名稱,並檢查備份歷史記錄以獲取數據庫備份:

SELECT  
  -- 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..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.first_lsn,
  msdb.dbo.backupset.last_lsn,
  msdb.dbo.backupset.database_backup_lsn,
  msdb.dbo.backupset.checkpoint_lsn,
  msdb.dbo.backupset.differential_base_lsn,
  msdb.dbo.backupset.fork_point_lsn,
  'EOR'

FROM   msdb.dbo.backupmediafamily  
  INNER JOIN msdb.dbo.backupset 
  ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id  

WHERE 1 = 1

AND     database_name IN ('Q209724_Database')  -- database names
ORDER BY
          2 desc,3 desc

您應該會看到一個條目,其中包含結果集中列的Full備註。backup_type

然後,您可以分析何時以及可能由誰/什麼執行了完整的數據庫備份。

您是否從完整備份中恢復了數據庫?我有類似的經驗,從完整備份還原的數據庫不需要在從中進行差異備份之前進行無意義的備份。通常,用於還原數據庫的完整備份可以用作差異備份的基礎備份。

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