如何查找SQL Server备份是否已用TDE加密而不恢复备份


13

有没有一种方法可以从SQL Server备份文件或MSDB表中查找是否使用TDE对备份进行了加密而不尝试恢复备份文件?

谢谢

Answers:


10

想象一下,您拥有一个1 TB的数据库。备份需要一段时间,而加密则需要一段时间。想象一下:

  • 9:00 AM-您开始进行完整备份
  • 上午9:01-在另一个窗口中,您开始在数据库上启用TDE
  • 上午9:05-备份完成
  • 上午9:10-TDE完成

鉴于一旦完成完整备份的还原,它将继续应用TDE,对数据库的其余部分进行加密,查询将返回什么?

相反,假设您从一个已经加密的数据库开始,然后:

  • 9:00 AM-删除TDE(这需要一些时间)
  • 上午9:01-您开始完整备份
  • 上午9:05-数据页不再加密
  • 上午9:06-您的完整备份完成

您希望查询返回什么?这些是为什么TDE加密不是msdb.dbo.backupset包含的字段之一的示例场景。


谢谢大家的快速回复,@ScottHodgin是的,我想知道备份是否来自TDE数据库,并且Brent的回答很明确。
yegnasew

@Brent Ozar:在两种情况下,我都希望查询返回“部分加密”。是的,这意味着具有三态属性而不是布尔值。显然,除非Microsoft实现,否则这种属性实际上是不可行的。
布莱恩

@布莱恩宾果 考虑到当前状态,这是不可行的。
布伦特·奥扎

30

我赞成布伦特的答案,因为他的情况肯定会弄糟备份是否包含TDE数据。

但是,如果您已经启用TDE一段时间,似乎RESTORE FILELISTONLY(Transact-SQL) 可能会提供您所需要的信息。结果集上有一列称为TDEThumbprint“显示数据库加密密钥的指纹。加密器指纹是使用密钥加密的证书的SHA-1哈希”。

我查看了一些同时经过TDE加密和未TDE加密的备份。

我的TDE数据库的备份在该列中具有证书指纹,而没有TDE数据库的备份为空。


2

扩展Scott的答案,这是SQL查询,它将告诉您备份是否已加密。

Declare @backupFile varchar(max) = 'J:\backups\psa20191029.bak'

 DECLARE @fileListTable TABLE (
    [LogicalName]           NVARCHAR(128),
    [PhysicalName]          NVARCHAR(260),
    [Type]                  CHAR(1),
    [FileGroupName]         NVARCHAR(128),
    [Size]                  NUMERIC(20,0),
    [MaxSize]               NUMERIC(20,0),
    [FileID]                BIGINT,
    [CreateLSN]             NUMERIC(25,0),
    [DropLSN]               NUMERIC(25,0),
    [UniqueID]              UNIQUEIDENTIFIER,
    [ReadOnlyLSN]           NUMERIC(25,0),
    [ReadWriteLSN]          NUMERIC(25,0),
    [BackupSizeInBytes]     BIGINT,
    [SourceBlockSize]       INT,
    [FileGroupID]           INT,
    [LogGroupGUID]          UNIQUEIDENTIFIER,
    [DifferentialBaseLSN]   NUMERIC(25,0),
    [DifferentialBaseGUID]  UNIQUEIDENTIFIER,
    [IsReadOnly]            BIT,
    [IsPresent]             BIT,
    [TDEThumbprint]         VARBINARY(32) -- remove this column if using SQL 2005
)
INSERT INTO @fileListTable EXEC('RESTORE FILELISTONLY FROM DISK = '''+@backupFile+'''')


select distinct LogicalName + case when TDEThumbprint is null then ' is not encrypted'
                                    else ' is encrypted'
                                    end as AmIEncrypted
from @fileListTable
where type='D'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.