数据库备份是数据保护策略中的重要组成部分,但仅仅创建备份是不够的。验证备份的完整性和可靠性对于确保在需要时能够成功恢复数据至关重要。本文将介绍如何在SQL Server环境下进行数据库备份的验证,包括备份验证的重要性、所需工具、主要脚本以及执行结果的分析。
备份验证是一个检查备份文件是否完整、所有备份文件是否可读以及在需要时能否成功恢复的过程。重要的是要理解,备份验证并不验证备份中数据的结构。然而,如果备份是在创建时使用了WITH CHECKSUMS选项,那么使用WITH CHECKSUMS选项进行备份验证可以很好地指示备份数据的可靠性。
如果想要检查数据库备份的状态,可以使用以下脚本。可以根据特定需求轻松修改它,例如检查最近48小时的备份。
该脚本在SQL Server2008中进行了测试。
以下是SQL Server中用于备份验证的主要脚本。
DECLARE @Count INT
DECLARE @query nvarchar(2000)
DECLARE @current INT
DECLARE @name VARCHAR(2000)
DECLARE @tempBackupCheck TABLE (
intID INT IDENTITY(1,1) PRIMARY KEY,
name NVARCHAR(2000),
backup_start_date datetime,
backup_finish_date datetime,
backup_size_mb varchar(20),
backup_type varchar(50),
error_msg VARCHAR(2000),
[status] bit
)
1. 选择备份
INSERT INTO @tempBackupCheck (name, backup_start_date, backup_finish_date, backup_size_mb, backup_type)
SELECT physical_device_name, backup_start_date,
backup_finish_date,
CONVERT(varchar, CAST(backup_size/1024/1024 AS money), 10),
CASE [Type]
WHEN 'D' THEN 'Full Backups'
WHEN 'F' THEN 'File'
WHEN 'G' THEN 'Filegroup'
WHEN 'I' THEN 'Differential'
WHEN 'L' THEN 'Transaction Log'
WHEN 'V' THEN 'Verifyonly'
END AS rhType
FROM msdb.dbo.backupset b
JOIN msdb.dbo.backupmediafamily m ON b.media_set_id = m.media_set_id
WHERE database_name NOT IN ('master', 'model', 'msdb', 'tempdb')
AND (backup_finish_date > DATEADD(hh, -48, GETDATE()))
ORDER BY backup_finish_date DESC
2. 验证
SELECT @Count = COUNT(intID) FROM @tempBackupCheck
IF ((@Count IS NOT NULL) AND (@Count > 0))
BEGIN
set @current=1
WHILE (@current <= @Count)
BEGIN
SELECT @name = name FROM @tempBackupCheck WHERE intID = @current
set @query='RESTORE VERIFYONLY FROM DISK= '''
+ @name +
'''
WITH CHECKSUM'
BEGIN TRY
print @query;
exec sp_executesql @query
-- Update Status
update @tempBackupCheck set [status]=1 WHERE intID = @current
END TRY
BEGIN CATCH
-- Update Error Message and Status
update @tempBackupCheck set error_msg=ERROR_MESSAGE(),
[status]=0 WHERE intID = @current
END CATCH
set @current=@current+1
END
END
3. 显示输出
SELECT * FROM @tempBackupCheck
执行脚本后,分析脚本:
该脚本将检索用于验证的物理备份文件名,并将其插入表格以进行进一步处理。如果想检查仅最近48小时的备份,请包含:
AND (backup_finish_date > DATEADD(hh, -48, GETDATE()))
从表格中,通过循环检查每个文件。执行查询并更新其状态。如果没有发现错误,状态为1;否则为0。
通过稍微多做一些努力,可以在发现任何错误时添加邮件生成。
在SQL Server 2005及更高版本中,RESTORE VERIFYONLY执行的检查包括:
恢复数据库并不保证能够恢复它。此外,从经过验证的备份中恢复的数据库可能存在数据问题。这是因为验证备份并不验证备份集中包含的数据结构是否正确。例如,尽管备份集可能已正确写入,但数据库文件中可能存在数据库完整性问题,这些文件将构成备份集。然而,如果备份是使用备份校验和创建的,那么成功验证的备份很可能是可靠的。