SQLSERVER数据库备份与还原

2026年01月20日/ 浏览 9

为什么需要备份?

备份的目的是为了在数据丢失、损坏、误操作、硬件故障或灾难发生时,能够将数据库恢复到某个可用的状态。没有备份,一切高可用技术都失去了最后一道防线。

第一部分:SQL Server 备份详解

1. 备份类型

SQL Server 提供了三种核心备份类型,它们通常组合使用。

备份类型

英文

说明

优点

缺点

完整备份

Full Backup

备份整个数据库,包括所有数据文件和部分事务日志。

恢复简单,是任何备份策略的基石。

备份文件大,耗时较长。

差异备份

Differential Backup

备份自上一次完整备份以来所有发生变化的数据页。

比完整备份小且快,恢复时需要先恢复完整备份,再恢复最新的差异备份。

依赖于上一次完整备份。

事务日志备份

Transaction Log Backup

备份自上一次事务日志备份以来的所有事务记录。

文件非常小,备份频繁,可实现“点-in-时间”恢复,将数据丢失降到最低。

恢复步骤最复杂,需要按顺序恢复所有日志备份。

补充说明:

仅复制备份: 一种特殊的完整或日志备份,不会影响常规的备份链(例如,做一次特别的全量备份,而不影响后续的差异备份基线)。尾日志备份: 在发生故障时,对当前活动的日志进行备份,这是恢复过程中至关重要的一步,可以最大限度地减少数据丢失。

2. 恢复模式

恢复模式决定了数据库如何管理事务日志,它直接决定了你可以采用哪种备份类型。

恢复模式

日志管理

支持的备份类型

适用场景

简单

事务日志在检查点后自动截断,不保留日志记录。

完整备份、差异备份。

不支持事务日志备份,无法实现“点-in-时间”恢复。适用于开发、测试或可容忍少量数据丢失的只读库。

完整

保留所有事务日志记录,直到对其进行备份。

完整备份、差异备份、事务日志备份。

生产环境首选。可以恢复到任意时间点,实现零数据丢失(配合尾日志备份)。

大容量日志

类似于完整模式,但对大容量操作(如BULK INSERT)进行最小日志记录。

完整备份、差异备份、事务日志备份。

作为完整模式的补充,用于大规模数据导入的临时操作,以减小日志体积。操作完成后应切回完整模式。

核心建议:生产数据库必须设置为“完整”恢复模式。

第二部分:SQL Server 恢复详解

恢复是将备份文件还原到数据库的过程,并使数据库进入一致、可用的状态。

1. 恢复过程的核心步骤

恢复过程遵循一个严格的顺序,可以想象成“重建大楼”:

NO RECOVERY: 在恢复除最后一个备份外的所有备份时使用。数据库处于“正在还原”状态,无法访问,但可以继续应用后续的备份。这就像在说:“数据已经放回去了,但先别急着用,我还有后续的日志要应用。”RECOVERY: 在恢复最后一个备份时使用。SQL Server 会前滚所有已提交的事务,回滚所有未提交的事务,使数据库达到一致状态,然后使其在线可用。这是一个不可逆的点。

2. 常见恢复场景示例

假设我们有以下备份链:

周日凌晨 1:00: 完整备份 FULL_BKUP.bak周一凌晨 1:00: 差异备份 DIFF_MON.bak每 4 小时一次日志备份: LOG_10AM.bak, LOG_2PM.bak, LOG_6PM.bak周三上午 10:15: 发生数据损坏。

场景一:恢复到故障点(最完整的恢复)

目标: 恢复所有数据,包括今天 10:15 之前已提交的事务。

备份尾日志: 首先尝试备份当前活动的日志(尾日志)。这是关键一步!BACKUP LOG [YourDatabase] TO DISK = D:\Backup\TAIL_LOG.bak‘ WITH NORECOVERY;(使用 NORECOVERY 会使数据库处于还原状态,以便后续操作。)恢复最新的完整备份:RESTORE DATABASE [YourDatabase] FROM DISK = D:\Backup\FULL_BKUP.bak’ WITH NORECOVERY, REPLACE;(REPLACE 选项覆盖现有数据库。)恢复最新的差异备份(可选,如果有的话):RESTORE DATABASE [YourDatabase] FROM DISK = D:\Backup\DIFF_MON.bak’ WITH NORECOVERY;按顺序恢复所有后续的事务日志备份

-- 恢复周二的日志

RESTORE LOG [YourDatabase] FROM DISK = D:\Backup\LOG_10AM_TUE.bak’ WITH NORECOVERY;RESTORE LOG [YourDatabase] FROM DISK = D:\Backup\LOG_2PM_TUE.bak’ WITH NORECOVERY;-- ... 恢复所有周三 10AM 之前的日志RESTORE LOG [YourDatabase] FROM DISK = D:\Backup\LOG_10AM_WED.bak’ WITH NORECOVERY;恢复尾日志并完成恢复:RESTORE LOG [YourDatabase] FROM DISK = D:\Backup\TAIL_LOG.bak’ WITH RECOVERY;使用 WITH RECOVERY 使数据库在线。

场景二:恢复到某个时间点

假设有人在周三上午 9:50 误删了一张表。我们需要将数据库恢复到 9:50 之前的状态。

步骤与场景一类似,但在恢复 10:00 的日志备份时,需要指定时间点:

RESTORE LOG [YourDatabase] FROM DISK = D:\Backup\LOG_10AM_WED.bak’

WITH RECOVERY, STOPAT = ‘2023-10-25 09:50:00’;

注意:这里直接使用了 RECOVERY,因为这是恢复链的终点。

第三部分:实战备份策略示例

策略一:经典生产环境策略(完整恢复模式)

每日: 凌晨 1:00 执行一次完整备份。每 4 小时: 执行一次差异备份(例如:05:00, 09:00, 13:00, 17:00)。每 15-30 分钟: 执行一次事务日志备份。系统数据库: 定期对 master, msdb 进行完整备份。

优点: 恢复时间目标短,数据丢失风险极低。

策略二:中小型/非关键数据库策略(简单恢复模式)

每日: 凌晨 1:00 执行一次完整备份。每 6 小时: 执行一次差异备份。

优点: 管理简单,恢复步骤少。

缺点: 最多可能丢失一天的数据。

第四部分:最佳实践与注意事项

测试!测试!测试!: 定期进行恢复演练。备份的有效性只有通过成功的恢复来验证。异地存储: 备份文件必须与数据库服务器物理分离,最好能传输到异地,以防站点级灾难。监控与告警: 设置作业监控备份是否成功,失败时立即发送告警。备份文件管理

命名规范:

DBName_FULL_20231025_0100.bak

定期清理旧的备份文件,避免磁盘写满。

系统数据库: 确保 master 和 msdb 在系统配置发生变化后得到备份。文档化: 详细记录你的备份恢复策略和步骤,确保在紧急情况下其他人员也能操作。

核心操作如

操作

核心命令

完整备份

BACKUP DATABASE [DBName] TO DISK = ‘path’

差异备份

BACKUP DATABASE [DBName] TO DISK = ‘path’ WITH DIFFERENTIAL

日志备份

BACKUP LOG [DBName] TO DISK = ‘path’

恢复数据库

RESTORE DATABASE [DBName] FROM DISK = ‘path’ WITH NORECOVERY/RECOVERY, REPLACE

恢复日志

RESTORE LOG [DBName] FROM DISK = ‘path’ WITH NORECOVERY/RECOVERY, STOPAT = ‘time’

picture loss