事务的基本概念

  • 事务

    • 是用户定义的一个数据库操作序列, 要么全做, 要么全不做, 是一个不可分割的工作单位

    • 是恢复和并发的基本单位

    • 事务与程序

    • 事务的定义

      • 显式定义方式

        • 事务正常终止

          1
          2
          3
          BEGIN TRANSACTION;
          SQL 语句;
          COMMIT; # 提交
        • 事务异常终止

          1
          2
          3
          BEGIN TRANSACTION;
          SQL 语句;
          ROLLBACK; # 回滚
    • 事务的特性(ACID特性)

      • 原子性
      • 一致性
      • 隔离性
      • 持续性
    • 破坏ACID特性的因素

      • 多个事务并行运行, 不同事物的操作交叉执行
      • 事物在运行过程中被强行停止

数据库恢复概述

  • 故障是不可避免的

  • 故障对数据库的影响的主要表现

  • 数据库恢复的作用

  • 恢复操作的基本原理是冗余

故障的种类

  • 事务内部的故障

    • 非预期
  • 系统故障

    • 软故障
  • 介质故障

    • 硬故障
  • 计算机病毒

恢复的实现技术

  • 数据转储

    • DBA定期地将整个数据库复制到磁带, 磁盘或其他存储介质上保存起来的过程, 这些备用的数据文本称为后备副本或后援副本
    • 静态转储
      • 在系统中无运行事务时进行的转储操作, 即转储期间不允许对数据库进行任何存取, 修改活动
      • 优点 : 实现简单
      • 缺点 : 降低了数据库的可用性
    • 动态转储
      • 转储操作与用户事务并发进行, 转储期间允许对数据库进行存取或修改
      • 优点 : 不用等待正在运行的用户事务结束, 不会影响新事物的运行
      • 缺点 : 不能保证副本中的数据正确有效
    • 海量转储
      • 每次转储全部数据库
    • 增量转储
      • 只转储上次转储后更新过的数据
  • 登记日志文件

    • 日志文件的格式

      • 以记录为单位
        • 事务标识
        • 操作类型
        • 操作对象
        • 更新前数据的旧值
        • 更新后数据的新值
      • 以数据块为单位
        • 事务标识
        • 被更新的数据块
    • 作用

      • 用于事务故障恢复和系统故障恢复, 并协助后备副本进行介质故障恢复

        image-20250119203159141

    • 登记日志文件

      • 登记的次序严格按并发事务执行的时间次序
      • 必须先写日志文件, 后写数据库

恢复策略

事务故障的恢复

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

  • 恢复步骤

    1. 反向扫描日志, 查找事务的更新操作
    2. 对该事务的更新操作执行逆操作
    3. 继续反向扫描
    4. 直到读到此事务的开始标记

系统故障的恢复

  • 未完成事务对数据库的更新可能已写入数据库

  • 已提交事务对数据库的更新可能还留在缓冲区没来得及写入

  • 恢复方法

    1. UNDO故障发生时未完成的事务

    2. REDO已完成的事务

  • 系统故障的恢复由系统在重启时自动恢复

  • 恢复步骤

    1. 正向扫描日志文件
    2. 对撤销队列事务进行撤销处理
    3. 对重做队列事务进行重做处理

介质故障的恢复

  • 物理数据和日志文件被破坏

  • 重装数据库, 然后重做已完成的事务

  • 恢复步骤

    • 装入最新的后备数据库副本
    • 装入有关的日志文件副本, 重做已完成的事务

具有检查点的恢复技术

  • 问题

    • 搜索整个日志耗费大量的时间
    • 重做处理重新执行耗费了大量时间
  • 检查点技术

    • 检查点记录内容

      • 建立检查点时刻所有正在执行的事务清单
      • 这些事务最近一个日志记录的地址
      • 重新开始文件的内容
      • 记录各个检查点记录在日志文件中的地址

      image-20250119203205457

    • 动态维护日志文件的方法

      • 将当前日志缓冲区中的所有日志记录写入磁盘的日志文件
      • 在日志文件中写入一个检查点记录
      • 将当前数据库缓冲区的所有数据记录写入磁盘的数据库中
      • 把检查点记录在日志文件中的地址写入一个重新开始文件
  • 利用检查点的恢复策略

    • 使用检查点方法可以改善恢复效率

      image-20250119203213680

  • 利用检查点的恢复步骤

数据库镜像

  • 提高数据库可用性

image-20250119203217525