数据库系统概论笔记(10)
第10章 数据库恢复技术
10.1事务的基本概念
事务:
- 概念:是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
- 程序和事务:一个程序包含多个事务
- 显式定义:事务的开始和结束可以由用户显式控制(若无显式定义,则系统按默认规定自动划分事务)
- 相关语句:
BEGIN TRANSACTION:事务开始
COMMIT:表示提交(提交事务的所有操作),事务正常结束
ROLLBACK:表示回滚(撤销所有已完成的操作,直到事务开始时的状态),事务异常结束
事务的ACID特性:
- 原子性(Atom):事务是数据库的逻辑工作单位,其中的操作要么全做,要么全不做
- 一致性(Consist):数据库只包含成功事务提交的结果时,就说数据库处于一致性状态
(事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态) - 隔离性(Isolation):一个事务的执行不能被其它事务干扰
- 持久性(Duration):即永久性,事务一旦提交,对数据库中数据的改变是永久性的
事务是恢复和并发控制的基本单位
破坏事务ACID特性的可能因素:
- 多事务并行运行,不同事务的操作交叉执行
- 事务在运行过程中被强行停止
日志:用在事务撤销中,事务运行时先写日志再做事务的操作
10.2数据库恢复概述
计算机的故障影响:
- 不可避免
- *轻则造成事务非正常中断,重则破坏数据库造成数据丢失
- 措施:数据库应该有恢复功能(从错误状态恢复到某一已知的正确状态)
10.3故障的种类
四类:事务内部的故障、系统故障、介质故障、计算机病毒
事务内部的故障:由某个事务自身运行错误引起的故障
- 两类:
自身可发现的故障:程序本身包含处理
非预期故障:不能由事务程序处理 - 故障处理:强行回滚事务(事务撤销)
系统故障:是指造成系统停止运转的任何事件,使得系统要重新启动(软故障)
- 回滚:让所有非正常终止的事物回滚,强行撤销所有未完成的任务
- 重做:重做所有已提交的事物,以将数据库真正恢复到一致状态(除了回滚,还要重做)
介质故障:外存故障(硬故障)
- 特点:发生概率小,但破坏性最大
- 措施:从做好的副本(备份)中恢复
计算机病毒:是一种认为的故障或破坏,是一些恶作剧者研制的一种计算机程序
- 威胁:是数据库系统的主要威胁
各类故障对数据库影响的两种可能性:数据库本身被破坏、数据可能不正确
恢复的基本原理:利用冗余(根据存储在系统别处的冗余数据来重建)
检查点和故障点:
- 每个一段时间保存一次检查点
- 当发生故障时,选最近的检查点开始恢复
- 检查点之前的不用恢复,检查点之后故障点之前结束的事务重做,未结束的事务撤销
10.4恢复的实现技术
建立冗余数据最常用的技术:数据转储和登记日志文件(通常一起使用)
数据转储
数据转储:数据库管理员定期或不定期地将整个数据库复制到其他存储介质上保存起来的过程(这些备用的数据称为后备副本)
数据转储用途:当数据库遭到破坏后将后可将后备副本重新装入(只能将数据库恢复到转储时的状态,要想恢复到故障时的状态,还要重新运行自转储以后的所有更新事务)
转储状态:
- 静态转储:在系统中无运行事务时进行的转储操作(针对非连续型事务)
特点:简单,但会降低数据库的可用性 - 动态转储:转储期间允许对数据库进行存取或修改(针对连续型事务)
日志文件:辅助动态转储(静态转储也可用)恢复数据库至某一正确状态
转储方式:
- 海量转储:每次转储全部数据库
特点:恢复方便,但如果数据库很大,则事务处理十分繁杂 - 增量转储:每次只转储上一次转储后更新过的数据
四种数据转储方法:
登记日志文件
日志文件:记录事务对数据库的更新操作的文件
日志文件的格式和内容:
- 两种格式:以记录为单位的日志文件、以数据库为单位的日志文件
- 内容:
以记录为单位的日志文件:
需要登记的内容(记录):各事务的的开始标记、各事务的结束标记、各事务的更新操作
*记录内容:事务标识、操作对象、操作类型、数据新旧值
以数据库为单位的日志文件:
需要登记的内容:事务标识、被更新的数据块
日志文件的作用:
- 协助事务故障恢复和系统故障恢复
- 动态转储方式必须建立日志文件(确保数据库的恢复)
- 静态转储方式可建立日志文件
登记日志文件:
- 两条原则:
1)登记的次序严格按并发事务执行的时间次序
2)必须先写日志文件,后写数据库
10.5恢复策略
事务故障的恢复
特点:由系统自动完成,对用户透明
恢复步骤:
- 反向扫描日志文件,查找该事务的更新操作
- 对该事务更新操作执行逆操作(将日志记录中“更新前的值”写入数据库)
- 继续反向扫描日志文件,查找该事务的其它更新操作
- 继续处理,直至读到此事务的开始标记
系统故障的恢复
大概操作:撤销未完成的事务(未完成事务对数据库的更新可能已写入数据库),重做已完成事务(已提交事务对数据库的更新可能还留在缓冲区还没来得及写入数据库)
特点:由系统在重启时自动完成,无需用户干预
恢复步骤:
- 正向扫描文件;找出故障前已提交事务,将事务标识计入重做队列;找出故障时未完成的事务,将事务标识计入撤销队列
- 对撤销队列中各个事务进行撤销处理(反向扫描日志文件,对每个撤销事务的更新操作执行逆操作)
- 对重做队列中各个事务进行重做处理(正向扫描日志文件,对每个重做事务写入日志记录中“更新后的值”)
介质故障的恢复
大概操作:重装数据库,重做已完成的事务
特点:需要管理员介入
恢复步骤:
- 装入最新的数据库后备副本(使数据库恢复到最近一次转储时的一致性状态)
对于动态转储的数据库副本,还要装入转储时的日志文件副本,利用恢复系统故障的方法进行恢复 - 装入相应的日志文件副本,重做已完成的事务
10.6具有检查点的恢复技术
检查点记录:增加一个重新开始的文件,并让恢复子系统在登录日志文件期间动态地维护日志
- 内容:建立检查点时刻正在执行的事务的清单、这些事务最近一个日志记录的地址
- 关系:重新开始文件用来记录各个检查点记录在日志文件中的地址
动态维护日志:周期性地执行建立检查点、保存数据库状态的操作
- 日志缓冲区的记录写入磁盘的日志文件上
- 在日志文件中写入一个检查点记录
- 数据缓冲区的数据写入磁盘的数据库中
- 检查点地址写入重新开始文件
检查点建立时机:
- 定期建立检查点:按照预定的时间间隔建立
- 不定期建立检查点:按照某种规则建立检查点(比如日志文件写满一半时建立)
恢复系统采取的策略:
- 不管:检查点之前完成的事务
- 撤销:系统故障时未完成的事务
- 重做:系统故障前已完成的事务
使用检查点恢复的步骤:
- 从开始文件中找到最后一个检查点记录的地址,得到日志文件中最后一个检查点记录
- 由检查点记录得到检查点记录时所有正在执行的事务清单,把这些事务暂时放入UNDO队列
- 从检查点开始正向扫描日志文件
若有新开始的事务,放进UNDO队列
若有提交的事务,从UNDO队列移到REDO队列 - 对UNDO队列执行撤销操作,对REDO队列执行重做操作
10.7数据库镜像
概念:根据数据库管理员的要求,自动把整个数据库或其中关键数据复制到另一个磁盘上,每当主数据库更新时,数据库管理系统自动把更新后的数据复制过去,由数据库管理系统保证镜像数据与主数据库的一致性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律