没有完整备份的数据库差异备份

Nic*_* M. 1 backup sql-server-2016

晚上 10 点,我安排了一个 SQL 代理作业,按照时间表进行每日备份:

  • 每日全场:22:00
  • 差价:每4小时
  • 日志:每 30 分钟

现在,当我检查我的备份集时(假设在 22:30),我看到差异备份已经发生,而没有任何完整备份!!。

我没想到会在明天 16:00 之前第一次完全备份发生时看到备份作业启动并运行,但是,我有一个没有完整备份的差异备份?这怎么可能?

Joh*_* N. 5

如果之前未执行过备份,则无法执行数据库的差异备份。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
Run Code Online (Sandbox Code Playgroud)

数据库已创建但尚未备份。

执行新数据库的 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
Run Code Online (Sandbox Code Playgroud)

输出

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.
Run Code Online (Sandbox Code Playgroud)

因此,如果您之前未执行完整备份,则将无法执行 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
Run Code Online (Sandbox Code Playgroud)

您应该会看到一个条目,其中包含对结果集中列的Full注释backup_type

然后,您可以分析何时以及可能是谁/什么执行了完整数据库备份。