2、数据库可靠性基础:ACID原则、数据持久化机制、事务日志与WAL、主从复制与故障转移

2.1 ACID原则:事务可靠性的四大基石

ACID是数据库事务正确执行的四个基本特性,是衡量数据库可靠性的核心标准。任何违反ACID原则的操作都可能导致数据不一致或丢失。

特性 全称 核心含义 违反后果
A 原子性 (Atomicity) 事务要么全部执行成功,要么全部回滚,不存在中间状态 部分更新导致数据残缺
C 一致性 (Consistency) 事务执行前后,数据库必须满足所有预定义的约束规则 数据违反业务逻辑约束
I 隔离性 (Isolation) 并发执行的事务之间互不干扰,结果与串行执行一致 脏读、不可重复读、幻读
D 持久性 (Durability) 已提交的事务结果必须永久保存,即使系统崩溃也不丢失 提交后数据因故障丢失
变更窗口关键提示: 在变更窗口期间,建议将事务隔离级别临时提升至 可重复读 (Repeatable Read) 或 可串行化 (Serializable),以规避DDL操作与DML操作之间的隔离性冲突。

2.2 数据持久化机制:从内存到磁盘的可靠落盘

数据持久化机制决定了数据库在系统崩溃后能否恢复已提交的事务。核心路径包括:

  1. Buffer Pool (缓冲池):数据库在内存中缓存数据页,减少磁盘I/O。
  2. Dirty Page (脏页):被修改但尚未写回磁盘的数据页。
  3. Checkpoint (检查点):将脏页强制刷盘,并记录日志序列号,缩短崩溃恢复时间。
  4. Doublewrite Buffer (双写缓冲):InnoDB特有机制,防止页写入一半时发生崩溃导致页损坏。
最佳实践: 在变更窗口前,手动执行 CHECKPOINT 或 FLUSH TABLES 命令,强制刷脏页,可显著降低窗口期间的I/O抖动风险。

2.3 事务日志与WAL (Write-Ahead Logging)

WAL是保证原子性和持久性的核心机制,其核心原则是:日志先于数据写入磁盘。

WAL工作流程

  1. 事务修改数据页时,先将修改记录写入 Redo Log (重做日志)。
  2. Redo Log 写入磁盘后,事务才能提交。
  3. 数据页的修改可以延迟写入磁盘(通过Buffer Pool异步刷脏)。
  4. 系统崩溃后,通过 Redo Log 重放未刷盘的事务,保证持久性。
  5. 通过 Undo Log (回滚日志) 回滚未提交的事务,保证原子性。
变更窗口风险: 如果 Redo Log 文件配置过小或日志组数量不足,在高并发变更期间可能导致日志切换频繁,引发 “Checkpoint too frequent” 告警,严重时阻塞写入。
WAL (Write-Ahead Logging) 核心流程 事务开始 修改Buffer Pool 写入Redo Log (磁盘) 事务提交 异步刷脏页 崩溃恢复 (Redo重放) 核心原则:日志先于数据落盘 (Write-Ahead),保证崩溃后可通过Redo Log恢复已提交事务

2.4 主从复制与故障转移

主从复制是数据库高可用架构的基础,通过将主库的数据变更实时同步到从库,实现读写分离和故障转移。

复制模式对比

复制模式 同步方式 数据一致性 性能影响 适用场景
异步复制 主库提交后立即返回,不等待从库确认 最终一致,可能丢失数据 低 高并发、可容忍少量数据丢失
半同步复制 至少一个从库确认收到日志后,主库才提交 强一致(至少一个从库) 中 金融、交易系统
全同步复制 所有从库确认后,主库才提交 强一致(所有节点) 高 对一致性要求极高的场景

故障转移流程

  1. 故障检测:通过心跳或超时机制检测主库是否存活。
  2. 日志补齐:候选从库应用完所有未完成的relay log,确保数据最新。
  3. 角色切换:将从库提升为新主库,并修改VIP或DNS指向。
  4. 从库重连:其余从库重新指向新主库,开始新的复制链路。
变更窗口建议: 在执行DDL变更前,建议先检查主从复制延迟。若延迟超过阈值,应暂停变更,等待延迟恢复后再执行,避免因复制积压导致从库数据不一致。
主从复制与故障转移架构 主库 (Master) Binlog写入 从库1 (Slave1) Relay Log应用 从库2 (Slave2) Relay Log应用 故障转移 半同步复制:主库等待至少一个从库确认后提交,兼顾性能与一致性 故障转移时,优先选择日志最完整的从库提升为新主库

2.5 可靠性配置清单(变更窗口检查项)

检查项 配置要求 验证命令
Redo Log大小 建议 ≥ 4GB,日志组 ≥ 2 SHOW VARIABLES LIKE 'innodb_log_file_size';
双写缓冲 必须开启 SHOW VARIABLES LIKE 'innodb_doublewrite';
复制模式 生产环境建议半同步 SHOW STATUS LIKE 'Rpl_semi_sync%';
检查点间隔 脏页比例 ≤ 75% SHOW STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
自动恢复 开启崩溃恢复自动重放 SHOW VARIABLES LIKE 'innodb_force_recovery'; (应为0)
变更窗口操作建议: 在变更开始前,执行 SHOW SLAVE STATUS\G 确认 Seconds_Behind_Master 为0;变更结束后,再次确认复制延迟恢复为0,方可视为变更成功。