4. 完整备份实战

完整备份是 SQL Server 备份体系的基石。它把数据库在某个时间点上的全部已用数据页、事务日志中足以保证恢复一致性的部分,以及数据库的元数据(文件布局、文件组、恢复模式等)一并写入备份设备。理解它的机制,才能判断“备份成功”是否等于“可恢复”。

一、完整备份的机制

执行 BACKUP DATABASE 时,SQL Server 并不是简单地把 .mdf 文件复制一份。它启动一个备份线程,按区(Extent,8 个连续 8KB 页)为单位扫描数据文件,只读取已分配且包含数据的页,跳过未分配空间,因此备份文件通常小于数据文件本身。同时,备份过程会记录备份开始时的日志序列号(LSN)和检查点信息,并在备份期间持续捕获日志,使备份内部保持事务一致性——即使备份过程中有事务提交,备份里也不会出现“半个事务”。

完整备份的恢复基准是“备份完成时刻”的数据库状态。它不依赖之前的任何备份,但恢复后只能还原到该备份完成点;若要恢复到更晚的时间点,必须叠加后续的差异备份和事务日志备份。因此完整备份的频率决定了恢复点目标(RPO)的下限。

完整备份不会截断事务日志(在完整恢复模式下),日志截断由日志备份完成。这一点常被误解,导致日志文件无限增长。

二、备份文件结构

一个备份文件(.bak)内部由若干“备份集(Backup Set)”组成,每个备份集对应一次备份操作。每个备份集包含:备份头(记录数据库名、备份类型、LSN 范围、备份时间、SQL Server 版本、压缩与加密标志)、文件列表(数据文件与日志文件的逻辑名、物理路径、大小)、以及实际的数据页流。使用 RESTORE HEADERONLY 可查看备份集头部,RESTORE FILELISTONLY 可查看文件清单,RESTORE VERIFYONLY 可校验备份集完整性而不实际恢复。

RESTORE HEADERONLY FROM DISK = 'D:\Backup\SalesDB_Full.bak';
RESTORE FILELISTONLY FROM DISK = 'D:\Backup\SalesDB_Full.bak';
RESTORE VERIFYONLY FROM DISK = 'D:\Backup\SalesDB_Full.bak';

备份设备可以是磁盘文件、多个镜像文件(MIRROR TO)、磁带或 URL(Azure Blob)。多个备份集可以追加到同一文件,但追加会让文件持续增大,恢复时需用 FILE = n 指定备份集序号,管理上不如“一次备份一个文件”清晰。

三、压缩与加密选项

SQL Server 2008 起支持备份压缩(WITH COMPRESSION),2014 起支持备份加密(WITH ENCRYPTION)。压缩通过减少 I/O 和存储显著提升备份效率,但会增加 CPU 开销;加密则保护备份文件在落盘和传输中的机密性,需要数据库主密钥(DMK)和证书保护。

选项作用代价典型场景
COMPRESSION减小备份体积,降低 I/OCPU 占用上升大库、网络备份、存储紧张
ENCRYPTION备份文件加密,防泄露需 DMK+证书,CPU 略增合规、异地传输、云存储
CHECKSUM校验页完整性,发现损坏轻微 CPU所有生产备份建议开启
STATS = 10每 10% 输出进度无长时备份可观测

压缩与加密可同时使用。加密备份必须保留对应的证书与私钥,否则无法恢复——这是灾备中最容易被忽略的单点。

四、使用 T-SQL 执行完整备份

下面示例对 SalesDB 执行一次带压缩、校验和进度输出的完整备份,并写入固定文件:

BACKUP DATABASE SalesDB
TO DISK = 'D:\Backup\SalesDB_Full_20250601.bak'
WITH
    INIT,                -- 覆盖同名备份集,不追加
    COMPRESSION,         -- 启用备份压缩
    CHECKSUM,            -- 写入校验和
    STATS = 10,          -- 每 10% 报告进度
    NAME = 'SalesDB Full Backup',
    DESCRIPTION = 'Weekly full backup for SalesDB';
GO

执行后应关注三件事:消息窗口是否出现 “BACKUP DATABASE successfully processed ... pages”,备份文件大小是否合理,以及用 RESTORE VERIFYONLY 验证是否通过。若开启加密,还需确认证书可用。

五、使用 SSMS 执行完整备份

在 SSMS 中右键数据库 → 任务 → 备份,打开备份对话框。关键设置:备份类型选“完整”;目标选择“磁盘”并指定路径;在“选项”页勾选“压缩备份”“备份校验和”,可设置“备份集过期时间”和“覆盖/追加”。点击“脚本”按钮可把图形操作反转为 T-SQL,便于纳入作业。SSMS 适合一次性操作和教学演示,生产环境更推荐用 T-SQL 脚本配合 SQL Server 代理作业定时执行。

完整备份:从数据页到可恢复备份集 SalesDB 数据文件 .mdf / .ndf 已分配数据页 事务日志 .ldf BACKUP DATABASE 按区扫描 · 一致性 LSN 压缩 / 加密 / 校验和 STATS 进度输出 SalesDB_Full_20250601.bak 备份头:LSN / 时间 / 版本 / 标志 文件列表:逻辑名 / 路径 / 大小 数据页流(压缩后) 备份后验证链(不实际恢复) RESTORE HEADERONLY RESTORE FILELISTONLY RESTORE VERIFYONLY 证书可用性检查 恢复基准与后续叠加 完整备份完成点 + 差异备份 + 事务日志备份

六、关键参数与判断依据

执行完整备份时,几个参数直接影响可恢复性与运维成本:INIT 与 NOINIT 决定覆盖还是追加;COMPRESSION 影响体积与 CPU;CHECKSUM 让备份可检测页损坏;COPY_ONLY 用于不影响差异备份基准的临时备份;MIRROR TO 可同时写多份副本。判断一次完整备份是否合格,至少看三点:备份消息无错误、RESTORE VERIFYONLY 通过、备份文件大小与数据库已用空间量级相符。若启用了加密,还必须确认证书与私钥已备份,否则备份文件在灾难场景下等同于不可用。

完整备份不是“一劳永逸”。它只提供恢复到备份完成点的能力;要满足更小的 RPO,必须配合差异备份与事务日志备份,并定期做真实恢复演练。