数据库恢复技术核心考点:事务、日志、UNDO/REDO与故障恢复

发布时间:2026/9/9 13:08:00
数据库恢复技术核心考点:事务、日志、UNDO/REDO与故障恢复 数据库恢复技术这门课很多零基础同学一开始都会被“事务”“日志”“故障恢复”这些术语吓住。尤其是期末复习时间紧题库和试卷里又反复出现“UNDO”“REDO”“检查点”“转储”很容易让人越看越乱。这篇文章我把数据库恢复技术相关的核心考点全部拆开讲。不扯太深的理论推导只讲考试怎么考、答案怎么组织、遇到日志分析题怎么一秒判断“该撤销还是该重做”。配套给出答题模板和速记要点你可以把它当成考前冲刺笔记也可以用来做系统性的知识梳理。1. 先搞清楚为什么数据库需要“恢复技术”这是一个非常容易被忽略的开篇问题。很多教材一上来就讲事务、讲日志但没有说明“为什么需要恢复”导致后面学起来很机械。1.1 数据库为什么“会坏”数据库是一个运行在计算机系统上的软件系统它依赖 CPU、内存、磁盘、操作系统等底层环境。任何一层出了问题数据库里的数据都可能变得不一致。比如下面几种情况程序执行到一半突然断电内存中的数据还没写回磁盘数据库处于“部分修改”状态。磁盘损坏整个数据库文件读不出来。一个事务执行到一半发现运算溢出、违反约束系统强制终止该事务。数据库服务器操作系统崩溃缓冲区中的数据丢失。这些故障都不是数据库主动想发生的但现实就是无法完全避免。恢复技术要解决的核心问题就是当故障发生后如何把数据库从“不正确、不一致”的状态恢复到“正确、一致”的状态。1.2 事务与恢复的关系要理解恢复技术必须先理解事务。事务是数据库操作的基本执行单位它包含一组要么全部成功、要么全部失败的数据库操作。事务有四个特性简称 ACID特性含义与恢复技术的关系原子性Atomicity事务里的操作要么全部执行要么全不执行通过撤销未完成事务保证一致性Consistency事务执行前后数据库完整性约束不被破坏恢复的目标之一隔离性Isolation并发事务之间互不干扰由并发控制机制保证持久性Durability事务一旦提交结果永久保存通过重做已完成事务保证所以你可以记住一句话恢复技术是保证事务原子性和持久性的重要手段。1.3 恢复的总体思路数据库恢复技术的基本原理可以用一句话概括利用存储在系统别处的冗余数据重建数据库中已经被破坏或不一致的数据。这里的“冗余数据”通常指两种转储副本数据备份定期把数据库复制到另一个存储介质。日志文件记录每个事务对数据库的更新操作方便事后重做或撤销。理解了这两个概念后面所有考点都是围绕它们展开的。2. 考点一三类故障必须分清考试中经常让学生区分“事务故障”“系统故障”“介质故障”。这三类故障的恢复策略完全不同是简答题和选择填空题的高频考点。2.1 事务故障事务故障是指单个事务在运行过程中由于种种原因无法继续执行不得不中止。常见原因运算溢出比如除以零。违反了完整性约束。应用程序主动回滚ROLLBACK。死锁导致系统选择该事务作为牺牲品。特点故障只影响该事务本身不影响其他事务也不破坏数据库的物理文件。恢复策略撤销UNDO该事务已经执行的对数据库的修改让数据库回到该事务开始前的状态。2.2 系统故障系统故障也叫软故障是指数据库系统在运行过程中突然停止比如操作系统崩溃、数据库服务器因断电重启、CPU故障等。特点数据库缓冲区中的数据可能丢失但没有破坏磁盘上的数据库文件。所有未提交的事务对数据库的修改可能没有写入磁盘。所有已提交的事务对数据库的修改也可能还在缓冲区中没有写入磁盘。恢复策略系统重启后对未提交的事务执行撤销UNDO对已提交但没有完全写入磁盘的事务执行重做REDO。2.3 介质故障介质故障也叫硬故障是指磁盘损坏、磁头碰撞、强磁场干扰等导致数据库物理文件被破坏。特点这是最严重的故障磁盘上的数据可能大范围丢失或不可读。恢复策略需要装入最近一次的转储副本然后利用日志文件重做REDO所有已经提交的事务。2.4 对比记忆表故障类型发生位置是否破坏磁盘数据核心恢复操作事务故障事务内部不破坏UNDO系统故障数据库系统/操作系统不破坏UNDO REDO介质故障磁盘介质破坏转储副本 REDO3. 考点二数据转储的分类与选择题陷阱数据转储是恢复技术最基础的手段。它指的是数据库管理员DBA定期将整个数据库复制到其他存储介质上保存起来这些保存的数据称为后备副本或备份副本。3.1 转储的两种分类维度考试中经常出现这样的描述“静态转储”“动态转储”“海量转储”“增量转储”。它们属于两个不同维度的分类按是否允许事务并发执行分类静态转储转储期间不允许任何事务执行。简单说先把数据库“冻结”再备份。动态转储转储期间允许事务执行备份操作与事务并发进行。按转储的数据量分类海量转储每次转储全部数据库。增量转储只转储上次转储后更新过的数据。两个维度可以组合组合特点适用场景静态海量数据库停机、全量备份最简单但影响业务小规模数据库、允许停机的场景静态增量停机备份只备份增量数据节省空间数据量大、允许短时间停机动态海量在线全量备份需要配合日志文件生产环境、不允许停机动态增量在线增量备份更高效大型生产数据库3.2 考试常考判断判断题1静态转储因为需要等待所有事务结束所以得到的副本一定是一致的。这句话是对的。静态转储期间没有事务执行所以数据库是静态一致的。判断题2动态转储得到的副本可以直接用来恢复数据库不需要额外记录。这句话是错的。动态转储期间有其他事务执行所以副本可能是不一致的。因此动态转储必须同时记录转储期间各事务的修改活动也就是要建立日志文件恢复时再利用日志把副本恢复到一致状态。3.3 命令示例实际数据库中的备份命令可以作为扩展知识帮助理解转储概念-- Oracle 使用 RMAN 进行备份的方式示例思路 RMAN BACKUP DATABASE PLUS ARCHIVELOG; -- MySQL 使用 mysqldump 进行逻辑备份 mysqldump -u root -p --all-databases backup.sql生产环境中的备份策略远比教材复杂常见的组合是“定期全量备份 高频增量备份 日志归档”这样既能减少备份时间又能在故障时把数据恢复到任意一个时间点。4. 考点三日志文件的作用与登记规则日志文件是恢复技术中最重要的考点几乎没有哪套试卷会跳过它。4.1 什么是日志文件日志文件用来记录事务对数据库的所有更新操作它是一个追加append-only顺序写入的文件。下面是一条日志记录的基本格式T, 操作类型, 操作对象, 旧值, 新值例如T1, UPDATE, A, 200, 300含义是事务 T1 把数据项 A 的值从 200 改成了 300。不同操作在日志中的记录方式插入记录记录插入后的新值。删除记录记录删除前的旧值。修改记录同时记录旧值和新值。此外日志中还要记录事务的开始和结束标记T1, START事务 T1 开始。T1, COMMIT事务 T1 提交。T1, ABORT事务 T1 中止。4.2 日志登记的两条铁律这是考试简答题的高频题登记日志文件必须遵循哪两条原则答案一定要背熟登记的次序严格按并发事务执行的时间次序。必须先写日志文件后写数据库。第一条容易理解日志要反映真实操作顺序不能乱编。第二条需要重点解释。为什么要先写日志、后写数据库因为如果先写数据库、日志还没写这时系统发生故障数据库已经修改了但日志里没有记录恢复时无法判断该事务是否已经执行也就不知道该撤销还是重做。反过来如果先把日志写好、数据库还没写即使系统故障恢复时还能根据日志记录把数据改正确。所以“先写日志后写数据库”是保证恢复可操作性的关键。4.3 判断日志写入是否正确选择题里经常会给出这样的场景某系统执行事务 T 1. 将 A 的值从 100 改为 200 2. 写入日志 T, A, 100, 200 3. 系统在此时发生故障问这样的日志顺序是否正确答案是不正确。按照规则必须先写日志T, A, 100, 200再修改数据库 A 的值。如果先修改数据库再写日志系统故障后日志缺失关键记录无法正确恢复。5. 考点四事务故障的恢复——UNDO5.1 UNDO 的含义UNDO 翻译过来就是“撤销”也叫反向扫描恢复。它做的事是把事务对数据库的修改恢复成原来的旧值。对于已经执行过的更新操作日志中记录了旧值和新值。撤销时就反过来执行一次逆操作把新值改回旧值。5.2 事务故障恢复步骤当系统发现某个事务无法继续执行时恢复过程如下反向扫描日志文件找到该事务的所有更新操作记录。对每一条更新记录执行逆操作把数据项恢复为旧值。继续反向扫描直到找到该事务的开始标记T, START。撤销完成后在日志中写入一条T, ABORT标记表示事务已回滚。5.3 为什么是反向扫描这里考试可能会问为什么事务故障恢复要反向扫描日志而不是正向扫描答案要点一个事务可能多次更新同一个数据项正向扫描时如果依次对新值做逆操作可能恢复不到最初的值。反向扫描是从最近的更新开始撤销保证先撤销最后一步再一步步回退到最初状态这样才能准确恢复。举个例子事务 T1 对 A 执行了三次更新 T1, A, 100, 200 T1, A, 200, 300 T1, A, 300, 400反向扫描时依次执行把 A 从 400 改回 300把 A 从 300 改回 200把 A 从 200 改回 100最终恢复到事务开始前的值 100。如果是正向扫描第一次撤销就把 A 从 200 改回 100但后两次记录就会被错误地执行无法恢复。6. 考点五系统故障的恢复——UNDO REDO系统故障是最容易让零基础同学混淆的部分因为它同时涉及两类事务。6.1 系统故障后的处境系统发生故障时日志文件已经写到了磁盘上因为先写日志但数据库缓冲区的部分内容可能没来得及写入磁盘。这时候存在三种情况事务已经提交说明 COMMIT 记录已写入日志但该事务修改的数据可能还在缓冲区没落盘。事务尚未提交说明它只执行了一部分操作日志里有部分更新记录但没有 COMMIT 记录。事务可能刚写完日志还没来得及提交就发生故障。恢复时必须做出两个动作对已完成已提交但数据未落盘的事务重做REDO。对未完成未提交的事务撤销UNDO。6.2 系统故障恢复的具体步骤教材上通常给出的标准步骤如下正向扫描日志文件建立两个队列REDO 队列记录所有已提交但数据可能未写入数据库的事务。UNDO 队列记录所有未提交的事务。对 UNDO 队列中的事务反向扫描日志执行撤销操作清除这些事务的修改。对 REDO 队列中的事务正向扫描日志重新执行日志中记录的更新操作使数据真正更新到新值。6.3 一个简易示例假设日志内容如下T1, START T1, A, 100, 200 T1, COMMIT T2, START T2, B, 300, 400 系统故障恢复过程正向扫描T1 有 START、COMMIT属于 REDO 队列T2 只有 START 和更新记录没有 COMMIT属于 UNDO 队列。对 T2 执行 UNDO将 B 从 400 改回 300。对 T1 执行 REDO重新执行 A 从 100 改为 200。恢复后数据库状态一致。6.4 考试答题模板遇到“系统故障后如何恢复”的简答题直接使用以下模板系统故障后恢复分为三步 1正向扫描日志根据是否包含 COMMIT 记录将事务分为 REDO 队列和 UNDO 队列 2对 UNDO 队列中的事务反向扫描日志执行撤销操作 3对 REDO 队列中的事务正向扫描日志执行重做操作。7. 考点六介质故障的恢复——副本 REDO7.1 介质故障恢复的步骤介质故障破坏了磁盘上的数据恢复必须依赖两个东西转储副本和日志文件。恢复过程装入最近一次转储的后备副本把数据库恢复到转储时的状态。装入转储结束时刻之后的日志文件副本。正向扫描日志找到已完成已提交的事务执行 REDO 操作。对于未提交的事务不需要恢复因为它们本来就没成功执行。7.2 与系统故障恢复的区别介质故障和系统故障的区别在于系统故障不破坏磁盘数据所以不需要装入副本。介质故障破坏了磁盘数据必须先恢复副本再重做已提交事务。这里有一个考试常见陷阱介质故障恢复时是否需要撤销未提交事务答案不需要。因为未提交事务本身对数据库的修改没有被确认重做副本后直接忽略这些事务即可。恢复时只重做转储后已提交的事务。7.3 答题模板介质故障恢复步骤 1装入最近一次转储的后备副本使数据库恢复到转储时刻的状态 2加载转储后所有日志文件 3正向扫描日志对已提交事务执行 REDO 4恢复到故障发生前的一致状态。8. 考点七检查点技术检查点技术是系统故障恢复的重要优化手段几乎每年都会考到一个概念题。8.1 为什么要引入检查点如果日志文件非常庞大系统故障后从头扫描整个日志恢复时间会很长而且很多早期事务根本不需要处理。检查点的作用就是每隔一段时间设置一个检查点恢复时从这里开始扫描减少恢复开销。8.2 检查点的基本思想检查点记录的内容包括建立检查点时刻所有正在执行的事务清单。这些事务最近一条日志记录的地址。有了检查点以后系统故障恢复不需要从日志开头扫描只需要从最后一个检查点开始。检查点恢复策略的关键规则检查点之前已提交的事务不需要重做因为它们的修改已经在检查点前写入数据库。检查点之后才提交的事务需要重做。检查点时刻尚未提交的事务需要撤销。8.3 一个判断示例假设日志记录如下T1, START T1, A, 100, 200 T1, COMMIT CHECKPOINT T2, START T2, A, 200, 300 系统故障分析检查点之前T1 已提交不需要处理。检查点之后T2 未提交需要撤销把 A 从 300 改回 200。所以恢复结果A 的值是 200。9. 考点八数据库镜像和扩展知识点数据库镜像在高教版《数据库系统概论》中属于扩展内容但也经常作为选择题出现。数据库镜像是指数据库管理系统自动把整个数据库或关键数据复制到另一个磁盘上每当主数据库更新时DBMS 自动把更新后的数据复制到镜像磁盘。作用发生介质故障时可以立即切换到镜像磁盘继续运行不需要停机恢复。提高数据库的可用性。注意镜像不是日志不是恢复技术的核心手段而是一种“双机热备”的容灾技术。10. 典型例题与答题模板这部分是最实用的。考试中无论题目怎么变绝大多数都能套模板。10.1 简答题万能模板问题什么是数据库恢复简述数据库恢复的基本技术。答数据库恢复是指当数据库系统发生故障时利用存储在系统其他位置的冗余数据将数据库从错误状态恢复到某一已知的正确状态。 基本技术包括两种 1数据转储定期将数据库复制到其他存储介质 2登记日志文件记录事务对数据库的更新操作。 恢复时根据故障类型采取不同的策略 - 事务故障利用日志对未提交事务执行 UNDO - 系统故障对未提交事务执行 UNDO对已提交事务执行 REDO - 介质故障装入转储副本对已提交事务执行 REDO。10.2 日志分析题模板给定一段日志要求分析恢复后的数据库值步骤如下第一步划分事务。 找出每个事务的 START 和 COMMIT/ABORT 标记。 第二步判断事务状态。 有 COMMIT 记录 → 已提交需要 REDO。 无 COMMIT 记录 → 未提交需要 UNDO。 第三步确定恢复顺序。 先撤销未提交事务再重做已提交事务。 第四步根据日志记录逐个计算最终值。10.3 例题演练题目数据库启动时日志如下 T1, START T1, A, 100, 200 T2, START T2, B, 300, 400 T1, COMMIT T2, A, 200, 300 系统故障问故障恢复后 A、B 的值分别是多少解析T1 有 COMMIT是已提交事务需要 REDO。T2 没有 COMMIT是未提交事务需要 UNDO。执行 T2 的 UNDOT2 修改了 B300→400和 A200→300撤销后 B300A200。执行 T1 的 REDOT1 修改了 A100→200重做后 A200。最终结果A200B300。你可能会问T2 对 A 的修改已经被撤销了T1 的 REDO 还能正常执行吗可以因为日志是先写后执行的原则重做操作依据的是日志中的旧值和新值不会受到撤销操作的影响。10.4 判断题速查说法对错原因先写日志后写数据库对保证恢复有据可依事务故障恢复需要 REDO错事务未完成应该 UNDO系统故障后所有事务都需要 REDO错只有已提交事务需要 REDO介质故障恢复需要装入转储副本对磁盘数据被破坏检查点可以缩短恢复时间对减少日志扫描范围动态转储得到的副本一定是正确的错转储期间有事务执行副本可能不一致11. 常见失分点和避坑经验在批改试卷时以下错误最常出现11.1 混淆 UNDO 和 REDOUNDO 是针对“未提交事务”的撤销操作把数据改回旧值。REDO 是针对“已提交事务”的重做操作把数据改到新值。简单记法没提交就撤销提交了就重做。11.2 忘记介质故障需要先装入副本介质故障恢复的第一个动作一定是“装入最近一次转储的后备副本”不是直接扫描日志。因为磁盘数据已经被破坏了日志只能在副本的基础上使用。11.3 系统故障恢复时分不清 REDO 队列判断一个事务是否要 REDO唯一依据是日志中是否存在 COMMIT 记录。如果只有 START 和几条更新记录哪怕它的修改已经写入了磁盘也要撤销。因为事务没有提交它的修改是不合法的。11.4 检查点之前的未提交事务被忽略有些同学看到检查点就以为之前的都不用处理。不对。检查点之前未提交的事务同样需要撤销检查点只是缩短扫描范围不是“之前全部不用管”。12. 考前速记清单最后整理一份速记清单考前 30 分钟过一遍恢复技术核心冗余数据 日志。三类故障事务故障UNDO、系统故障UNDOREDO、介质故障副本REDO。日志两条原则按时间登记、先写日志后写数据。UNDO反向扫描旧值覆盖新值。REDO正向扫描新值重新写入。检查点从最后一个检查点开始恢复加快速度。判断是否 REDO看有没有 COMMIT。数据库恢复技术这一块说到底就是“故障分清类型日志找准状态操作选对策略”。把这套逻辑背熟再配合几道日志分析题练手考试时遇到相关题目就不会慌。