本节摘要:备份是唯一能对抗逻辑错误(误删、投毒、恶意清库)的手段——高可用副本会忠实复制每一次误操作,只有备份能回到过去。本节讲清三种备份如何构成时间链、还原的状态机如何运转、尾日志如何抢救最后一刻,并用一次完整的"误删表三分钟前"时点恢复演练把理论落成肌肉记忆。
完整备份是底片:把当时点的全部数据与足够恢复到一致点的日志打成一个包。差异备份是增量底片:只记录自上次完整备份以来变化的区,越接近下次全备越大。日志备份是流水:把自上次日志备份以来的事务日志切段存档——它是完整恢复模式下时点还原能力的来源,也是触发日志截断的唯一正规手段(第 3 章"日志疯长"案的解药)。三种备份不是三选一,而是组合拳:典型生产策略是每周日全备、每天差异、每十五分钟日志备份——最坏情况丢一刻钟数据,还原速度靠差异打底。
-- 策略落地的三个作业核心语句 BACKUP DATABASE [订单库] TO DISK = N'Z:\bak\orders_full.bak' WITH CHECKSUM, COMPRESSION, INIT; -- 周日全备:校验和必开,压缩省带宽 BACKUP DATABASE [订单库] TO DISK = N'Z:\bak\orders_diff.bak' WITH DIFFERENTIAL, CHECKSUM, COMPRESSION; -- 每日差异 BACKUP LOG [订单库] TO DISK = N'Z:\bak\orders_log.trn' WITH CHECKSUM; -- 每15分钟日志备份:时点还原的原料
三个纪律值得刻进手册。其一,校验和(CHECKSUM)永远打开:它备份时验证页完整性,还原时再验一遍,坏页在备份环节就现形而不是在灾难当天。其二,备份要异地留档:备份文件与数据库放同一存储,等于保险柜钥匙插在柜门上——勒索软件的第一个动作就是清备份。其三,验证过的备份才叫备份:定期用 RESTORE VERIFYONLY 加抽样真还原检验,没做过还原演练的备份策略等于没写。
还原不是一键动作,是状态机的受控行走。数据库在还原旅程中有几种状态:恢复中(RESTORING,正在接收备份或日志)、待恢复(RECOVERY PENDING)、联机(ONLINE)。控制它的开关是 RECOVERY 子句:NORECOVERY 表示"我还要继续喂下一个备份,别开门";RECOVERY 表示"链喂完了,执行三段恢复(第 3 章的分析、重做、撤销)开门营业";STANDBY 居中——开门只读但保持可继续喂日志,是"还原期间搭临时报表站"的利器。标准还原序列按时间倒推拼接:最新全备(NORECOVERY)→ 全备之后最新差异(NORECOVERY)→ 差异之后逐个日志备份(最后一个 RECOVERY 或 STOPAT 指定时刻)。

背景:周三上午十点半,开发误在订单库执行了无 WHERE 的 DELETE,一张百万行配置表被清空,应用立即报错。操作:第一步,把该库置为紧急单用户并备份尾日志——把误删之后残留在活动日志里的改动抢救成一个备份文件,这是回溯到误删前一秒的凭证;第二步,在另一台服务器上按“周日全备、周二差异、逐个日志备份喂到十点半、尾日志 STOPAT 到误删前一秒”的顺序还原出一份影子库,最后一站加 STOPAT 子句把数据停在误删前的一秒;第三步,从影子库把配置表导出导入生产库,全程四分钟,生产恢复。结果:业务零数据丢失(误删前一秒的全部数据都在),生产库本身没有被整个替换——生产继续跑,影子库只当数据源。解读:这套"旁路恢复"优于"原地重放"的原因是不中断其他业务,且影子库可以慢慢核对。变式:如果误删发生在一周前才发现——日志链还在的话照样能 STOPAT 到那天,代价是要还原整周日志;如果日志链断了(比如中途切过简单恢复模式),那就只剩"最近全备加当时的逻辑导出"可救,损失以天计。这也解释了为什么恢复模式与备份策略必须在变更管理里锁死。
-- 影子库时点还原的收尾语句(示例节选) RESTORE DATABASE [订单库_影子] FROM DISK = N'Z:\bak\orders_full.bak' WITH MOVE N'订单库' TO N'W:\data\orders_shadow.mdf', MOVE N'订单库_log' TO N'W:\log\orders_shadow.ldf', NORECOVERY, REPLACE; RESTORE DATABASE [订单库_影子] FROM DISK = N'Z:\bak\orders_diff.bak' WITH NORECOVERY; RESTORE LOG [订单库_影子] FROM DISK = N'Z:\bak\orders_log_1030.trn' WITH NORECOVERY; RESTORE LOG [订单库_影子] FROM DISK = N'Z:\bak\orders_tail.trn' WITH STOPAT = '2026-08-26T10:32:40', RECOVERY; -- 停在误删前一秒
备份把"回到过去"练成了手艺。下一节补全历史脉络:被时代翻篇的镜像与日志传送如何理解,存量系统怎么升上云,License 账怎么算。