💻
QMMMS的笔记
博客
  • QMMMS的笔记
  • agent
    • MCP的背景、原理和开发
    • Agent 历史与背景
    • Agentic Workflows
    • 环境检查与基础工具
    • Tool Call
    • 工具与运行时的值
    • temp
    • 处理 Tool Call error
    • trick
  • algorithm
    • 线性结构
    • 二叉树
    • 图
    • 查找
    • 排序
    • 动态规划
    • 优化方法
    • 数学
    • 迁移至Java
  • computer_composition
    • 系统总线
    • 存储器
    • 输入输出系统
    • 计算机的运算方法
    • 指令系统
    • 补充
  • computer_network
    • 引入
    • 应用层
    • 传输层
    • 网络层(数据平面)
    • 网络层(控制平面)
    • 链路层
    • 常见问答
    • 实验
  • database
    • SQL实战
    • 关系代数
    • 数据库设计
    • 规范化
    • 数据库基本概念
    • 查询原理
    • 数据库恢复技术
    • 并发控制
  • dev_tools
    • Git
    • Nginx
    • Spring
    • LangChain
    • PyTorch Cheat Sheet
    • MyBatis
    • MySQL Cheat Sheet
    • MySQL 补充
    • Redis
    • Docker
    • RocketMQ
    • Chrome
  • linux
    • Linux基础命令与使用
    • 文件与权限
    • 文件与目录操作
    • 权限属性高级
    • 命令与文件的查找
    • 文件压缩和打包
    • vim编辑器
    • shell变量
    • 命令补充
    • 数据流重定向
    • 管道命令
    • shell脚本
    • 用户管理
    • 用户间交流
    • 计划任务
    • 进程管理
    • 软件管理
    • 认识系统服务
    • 运维常用命令
    • 常用命令
  • llm
    • 大规模语言模型概述
    • 分布式训练概述
    • 有监督微调概述
    • 强化学习与LLM
    • LLM评估概述
    • 大模型应用
    • 理解大模型
    • 量化
    • 预训练
    • 上下文学习
  • machine_learning
    • 引入
    • 大致正确学习
    • 一致收敛
    • 偏差还是过拟合?
    • 可学习的充要条件
    • 非均匀可学习性
    • 计算复杂性
  • mathematics
    • 概率与统计基础
    • 线性代数基础
  • operating_system
    • 操作系统基本概念
    • 进程和线程
    • 同步,互斥与死锁
    • 内存管理
    • 文件系统
    • I/O系统
    • 保护与安全
    • 《现代操作系统》
  • statistical_learning
    • 统计学习引入
    • 线性回归
    • 分类
    • 重抽样方法
    • 线性模型选择与正则化
    • 非线性模型
    • 基于树的方法
    • 支持向量机
    • 无指导学习
    • 马尔科夫链和蒙托卡罗方法简明理解
    • R语言速查
  • deep_learning
    • basic_concepts
      • 逻辑回归与损失函数
      • 神经网络
      • 正则化、预处理、权重初始化
      • 优化算法
      • 机器学习策略
      • 复习:从计算机视觉的角度
      • 卷积神经网络
      • 深度卷积网络示例
      • 计算机视觉任务
      • 循环神经网络
      • 自然语言处理任务
      • 注意力
      • Transformers 家族
      • 显卡扫盲
      • 强化学习概述
    • semi-supervise
      • 半监督学习简介
      • Consistency Regularization
      • Proxy-label Methods
      • Holistic Methods
      • Generative Models
      • Graph-Based SSL
      • Self-Supervision for SSL
      • Other SSL methods
  • programming
    • cpp
      • STL
      • C++基础
      • 内存管理
      • 面向对象
    • java
      • 环境和介绍
      • 注释
      • String
      • 面向对象思想
      • Object
      • 包
      • 访问权限修饰符
      • 初始化块
      • 接口
      • 内部类
      • 注解
      • 枚举
      • 集合框架
      • List
      • Map
      • 泛型
      • 迭代
      • IO与流
      • 序列化
      • 异常
      • Lambda
      • Stream流
      • Socket
      • 缓冲
      • 命名规范
      • 拆箱装箱
      • 值传递
      • 深拷贝
      • 反射
      • JVM
      • 并发编程基础
    • python
      • 并发编程
      • 环境管理
  • software_engineering
    • basic_concepts
      • 系统分析与设计概述
      • 规划
      • 需求分析与原型设计
      • 项目管理
      • 建模
      • 数据库设计
      • 架构
      • 配置管理
      • 测试管理
      • 安全
      • 编码原则
      • 微服务
      • 补充内容
    • software_testing
      • CMMI基础
      • PPQA与SQA
      • 软件测试基础
      • 黑盒测试
      • 白盒测试
      • 集成测试
      • 系统测试
      • 测开面试补充
由 GitBook 提供支持
在本页
  • 事务
  • 故障
  • 恢复
  • 转储
  • 日志文件
  • 检查点
  • 数据库镜像
在GitHub上编辑
  1. database

数据库恢复技术

[TOC]

事务

事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是 一个不可分割的工作单位。事务是恢复和并发控制的基本单位。一个事务可以是一条SQL语句, 一组SQL语句或整个程序。

事务结束语句:

  • COMMIT:事务正常结束。

  • ROLLBACK:事务运行的过程中发生了故障,不能继续执行,回滚事务的所有更新操作,回到开始时的状态。

事务的ACID特性:

  • 原子性(Atomicity):事务中包括的操作要么都做,要么都不做。由数据恢复子系统负责。

  • 一致性(Consistency):数据库中包含失败事务的结果为不一致状态。

  • 隔离性(Isolation):并发执行的各个事务之间不能互相干扰。

  • 持续性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

破坏事务ACID特性的因素:

  • 多个事务并行运行时,不同事务的操作交叉执行(没有隔离)

  • 事务在运行过程中被强行停止(不原子,不一致)

故障

  • 事务故障:某个事务在运行过程中由于种种原因未运行至正常终止点就夭折了。可以撤消事务(UNDO)或者强行回滚(ROLLBACK)该事务。

  • 系统故障:整个系统的正常运行突然被破坏。系统重新启动时,恢复程序要强行撤消(UNDO) 所有未完成事务,重做(REDO)所有已提交的事务。

  • 介质故障:外存中的数据部分丢失或全部丢失。装入数据库发生介质故障前某个时刻的数据副本,重做自此时始的所有成功事务,将这些事务已提交的结果重新记入数据库。

恢复

转储

转储是指DBA(数据库管理员,Database Administrator)将整个数据库复制到磁带或另一 个磁盘上保存起来的过程。这些备用的数据文 本称为后备副本或后援副本。

  • 静态转储:在系统中无运行事务时进行转储,转储开始时数据库处于一致性状态,转储期间 不允许对数据库的任何存取、修改活动。

  • 动态转储:转储操作与用户事务并发进行,转储期间允许对数据库进行存取或修改。

  • 海量转储: 每次转储全部数据库。

  • 增量转储: 只转储上次转储后更新过的数据。

对于动态转储的数据库副本,要恢复时还须同时装入转储时刻的日志文件副本,利用与恢复系统故障相同的方法(即 REDO+UNDO,下面讲),才能将数据库恢复到一致性状态。

日志文件

日志文件(log)是用来记录事务对数据库的更新操作的文件

每条日志记录的内容:

  • 事务标识

  • 操作类型(插入、删除或修改)

  • 操作对象(记录ID、Block NO.)

  • 更新前数据的旧值(对插入操作而言,此项为空值)

  • 更新后数据的新值(对删除操作而言, 此项为空值)

登记日志文件的原则:

  • 登记的次序严格按并行事务执行的时间次序。

  • 必须先写日志文件,后写数据库。

如果先写日志,但没有修改数据库时故障发生,按日志文件恢复时只不过是多执行一次不必要的UNDO操作,并不会影响数据库的正确性。

事务故障的恢复:

利用日志文件撤消(UNDO) 此事务已对数据库进行的修改

  1. 从最后向前扫描日志文件,查找该事务的更新操作。

  2. 对该事务的更新操作执行逆操作。

  3. 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。

  4. 直至读到此事务的开始标记,完成。

系统故障的恢复:

  • 一些未完成事务对数据库的更新已写入数据库,Undo 故障发生时未完成的事务

  • 一些已提交事务对数据库的更新还留在缓冲区没来 得及写入数据库,Redo 已完成的事务

  1. 从头扫描日志文件,记录Redo队列(在故障发生前已经提交的事务 T1, T3, T6…..)和Undo队列(故障发生时尚未完成的事务 T2, T4, T5…...)

  2. 对每个UNDO事务的更新操作执行逆操作(T2, T4, T5……)

  3. 对每个REDO事务重新执行登记的操作( T1, T3, T6…..)

介质故障的恢复:

  1. 装入最新的后备数据库副本,使数据库恢复到最近一次转储时的一致性状态。

  2. 装入有关的日志文件副本,重做已完成的事务。

检查点

之前技术的两个问题:

  • 搜索整个日志将耗费大量的时间

  • REDO处理:重新执行,浪费了大量时间

检查点记录的内容:

  • 建立检查点时刻所有正在执行的事务清单

  • 这些事务最近一个日志记录的地址

重新开始文件的内容:

  • 记录各个检查点记录在日志文件中的地址

创建检查点方法:

  1. 将当前日志缓冲区中的所有日志记录写入磁盘的日志文件上。

  2. 在日志文件中写入一个检查点记录。

  3. 将当前数据缓冲区的所有数据记录写入磁盘的数据库中。

  4. 把检查点记录在日志文件中的地址写入一个 重新开始文件。

如果在第四步前系统崩溃,那么这个检查点失效,但仍可以从上一个检测点恢复。

利用检查点的恢复步骤:

  1. 从重新开始文件中找到最后一个检查点记录在日志文件中的地址

  2. 由该地址在日志文件中找到最后一个检查点记录

  3. 由该检查点记录得到检查点建立时所有正在执行的事务清单 ACTIVE-LIST,再建立两个事务队列UNDO-LIST和REDO-LIST,把ACTIVE-LIST暂时放入UNDO-LIST队列,REDO队列暂为空。

  4. 从检查点开始正向扫描日志文件,直到日志文件结束。如有新开始的事务Ti,把Ti暂时放入UNDO-LIST队列。如有提交的事务Tj,把Tj从UNDO-LIST队列移到REDO-LIST队列。

  5. 对UNDO-LIST中的每个事务执行UNDO操作, 对REDO-LIST中的每个事务执行REDO操作。

例子1:

这个例子中,最后UNDO-LIST是T2,T3。REDO-LIST为T1,T4。

例子2:

数据库镜像

上一页查询原理下一页并发控制

最后更新于9个月前