You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读DDIA时的疑问:基于语句的复制与WAL传输核心差异是什么?

基于语句的复制与预写日志(WAL)传输的核心差异

1. 日志记录的核心内容不同

  • 基于语句的复制:记录的是触发写入的SQL语句本身,比如INSERT INTO orders (user_id, amount) VALUES (42, 99.9),属于业务层面的操作描述。
  • WAL传输:记录的是数据存储层的底层变更细节,比如“将表空间X中第Y页的第Z偏移位置的字节从0x01改为0x02”,是存储引擎对数据页的物理/半物理修改记录。

2. 对执行上下文的依赖程度不同

  • 基于语句的复制:要求备库的执行环境和主库完全对齐,比如自增ID的当前值、RAND()这类随机函数的输出、触发器的执行顺序、甚至时区设置,稍有差异就会导致数据不一致。比如主库执行INSERT INTO events (created_at) VALUES (NOW()),备库执行时的时间会和主库不同,最终数据就会有偏差。
  • WAL传输:完全不依赖备库的执行上下文,因为它直接重演数据页的变更,不管备库当前的状态如何,只要按顺序应用WAL日志,就能保证和主库的数据完全一致。

3. 兼容性与适用场景差异

  • 基于语句的复制:日志体积小、可读性强,但对非确定性语句(含随机函数、依赖系统状态的操作)兼容性差,复杂事务场景下很容易出现数据不一致问题。只适合简单、确定性的写入场景。
  • WAL传输:兼容性拉满,能支持所有类型的写入操作——包括复杂事务、非确定性操作、甚至存储引擎层面的底层修改,不过日志体积通常更大,完全不具备可读性。现在PostgreSQL、MySQL InnoDB等主流数据库的默认复制方式都是基于WAL的。

4. 备库重演操作的逻辑复杂度不同

  • 基于语句的复制:备库需要重新走一遍SQL的解析、优化、执行全流程,相当于把主库的业务操作再执行一遍,容易因为备库的执行计划差异、索引状态不同等问题,导致最终结果和主库不一致。
  • WAL传输:备库只需要按顺序将WAL里的变更直接应用到对应的数据页上,逻辑简单直接,重演过程更稳定,出错概率极低。

内容的提问来源于stack exchange,提问作者kawa wara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:10:28