土法炼钢兴趣小组的算法知识备份

【MySQL InnoDB 内核】主从复制:异步、半同步、GTID 与并行回放

文章导航

分类入口
databasekernel
标签入口
#mysql#innodb#replication#gtid#semi-sync#mts#binlog

目录

主从复制:异步、半同步、GTID 与并行回放

SHOW SLAVE STATUSSeconds_Behind_Master: 0 却明明落后几分钟——这不是显示 bug,而是 SBM 度量的是 SQL 线程回放相对主库 binlog 时间戳的差,主库空闲或大事务边界下会失真。主从延迟的真正来源在 单线程 SQL 回放大事务 binlog 单条事件从库 IO 能力第 12 篇 主库组提交/fsync 节奏。

本文基于 MySQL 8.0.36 复制架构,对照 PG 流复制


一、复制拓扑与线程模型

经典一主一从(异步):

flowchart LR
  M[Primary mysqld] -->|binlog dump| D[Dump connection]
  D --> I[Replica IO thread]
  I --> R[relay log]
  R --> S[SQL thread]
  S --> INN[InnoDB apply]
线程 职责
Binlog Dump(主) 读主库 binlog 推送给从库
IO thread(从) 接收事件写入 relay log
SQL thread(从) 读 relay log 调用引擎执行

源码线索:sql/rpl_binlog_sender.cc(发送)、sql/rpl_io_monitor.ccsql/rpl_rli.cc(relay log info)。


二、binlog 格式与行复制

格式 内容 备注
STATEMENT SQL 文本 非确定性函数风险
ROW 行前后镜像 8.0 默认推荐
MIXED 自动选择 遗留

binlog_row_imageFULL(默认)、MINIMALNOBLOB——影响带宽与闪回粒度。大宽表 UPDATE 产生大行事件,单事务一条 event 可拖垮 SQL 线程


三、GTID

Global Transaction Identifier:server_uuid:transaction_id。主库提交时写 Gtid_log_event;从库 gtid_executed 集合跟踪已应用事务。

-- 需本地验证
SHOW MASTER STATUS;
SHOW GLOBAL VARIABLES LIKE 'gtid_mode';
SELECT * FROM mysql.gtid_executed LIMIT 5;

GTID 自动定位CHANGE MASTER TO MASTER_AUTO_POSITION=1 免 file+pos。Failover 时禁止随意 RESET MASTER第 19 篇)。

源码:sql/rpl_gtid.ccsql/rpl_gtid_state.cc


四、并行复制(MTS)

8.0 常用 slave_parallel_workers > 0slave_parallel_type

类型 依赖假设
DATABASE 不同库可并行
LOGICAL_CLOCK 同组 commit 可并行
WRITESET(8.0.23+) 写集合无冲突可并行

transaction_write_set_extraction=XXHASH64 为主库提取写集合。外键跨表、触发器、DDL 可能迫使串行。


五、半同步复制

半同步插件(rpl_semi_sync_master)在 主库 binlog 已写入从库 relay log(或收到 ack,取决于 rpl_semi_sync_master_wait_point)后才返回客户端 commit 成功。

等待点 含义
AFTER_SYNC(默认) binlog sync 后等 ack,再 InnoDB commit
AFTER_COMMIT InnoDB commit 后等 ack

超时后降级为异步(rpl_semi_sync_master_timeout)——降级事件应告警:RPO 从「至少一台从库收到」退化为异步。


六、Seconds_Behind_Master 陷阱

SBM 计算(简化):SQL 线程当前回放事件时间戳 vs 主库当前时间。失真场景:

更可靠:performance_schema.replication_applier_status_by_workerLAST_APPLIED_TRANSACTION 与主库 COUNT_TRANSACTIONS_IN_QUEUE(8.0)对比;或 mysql.slave_relay_log_info 位点差。


七、延迟诊断清单

-- 需本地验证:从库
SHOW REPLICA STATUS\G
-- 关注 Relay_Log_Space, Retrieved_Gtid_Set, Executed_Gtid_Set

SELECT * FROM performance_schema.replication_connection_status\G
SELECT * FROM performance_schema.replication_applier_status_by_worker\G
现象 可能层级
Retrieved 落后 网络 / Dump / 主库 binlog 刷盘慢
Relay 大、Executed 慢 SQL 线程 / 锁等待 / 磁盘
主库 TPS 高、从库 CPU 低 单线程回放瓶颈 → 开 MTS

八、与 InnoDB 的交界

SQL 线程回放 ROW 事件时仍走 完整 DML 路径:undo、redo、二级索引、gap lock(若语句级需要)。从库 额外 承担 主库已做过的 IO——只读从库并非「无写入」:relay 写入、数据页修改、二级索引维护均消耗 IO。

长事务在从库回放时持有锁的时间与主库不等价(无客户端等待),但会阻塞后续并行 worker。


九、实验(需本地验证)

9.1 构造回放延迟

-- 主库大事务
BEGIN;
-- 批量 UPDATE 百万行(测试表)
COMMIT;
-- 从库观察 Relay_Log_Space 与 applier worker 状态

9.2 半同步降级

-- 主库开启 semi-sync,从库 stop replica;
-- 主库持续写入直至 rpl_semi_sync_master_status 显示 OFF
-- 记录等待超时与错误日志(测试环境)

十、工程坑点

用 SBM=0 当 SLA。应监控 位点差应用读从库的实际陈旧

MTS 开太高超过 CPU。worker 争用 InnoDB latch 可能不如适度并行。

从库 read_only 不挡 SUPER 写入。运维误写破坏一致性。

双主(环形)无冲突检测。GTID 不能替代应用层去重。


十一、关键要点(正文)

  1. 复制链路:Dump → IO → relay → SQL → InnoDB
  2. GTID 简化 failover,但 RESET MASTER 有边界
  3. 半同步 缩短 RPO 窗口,超时会 静默降级
  4. SBM 不可靠;用 PFS 与 GTID 集合对比。
  5. 并行复制 依赖写集合与 schema 约束,DDL 常串行。

十一、PG 对照

维度 MySQL 异步复制 PG 流复制
日志类型 binlog 逻辑事件 WAL 物理页
回放 SQL 线程解析执行 Startup REDO
并行 MTS(库/逻辑时钟/WRITESET) 只读热备通常单线程 recovery
半同步 插件等待 binlog 接收 synchronous_commit + sync rep
位点 file+pos / GTID LSN / replication slot

PG 第 18 篇 的 Slot 溢出与 MySQL relay log 堆积 同属「下游消费慢 → 上游存储压力」类故障,排查都先看 接收端进度


深度阅读清单

深度.1 com_binlog_dumpsql/binlog.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:Dump 线程协议。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.2 mysql_binlog_sendsql/binlog.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:发送 binlog 事件。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.3 Relay_log_info::sql_threadsql/rpl_relay_log.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:SQL 线程回放。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.4 Gtid_log_eventsql/binlog.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:GTID 事件。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.5 trx_commit_for_mysqlstorage/innobase/trx/trx0trx.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:InnoDB 事务提交入口。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.6 trx_prepare_for_mysqlstorage/innobase/trx/trx0trx.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:InnoDB XA prepare。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.7 log_buffer_writestorage/innobase/log/log0log.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:redo 写入 log buffer。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.8 log_write_up_tostorage/innobase/log/log0log.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:redo 刷盘至指定 LSN。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.9 buf_page_get_genstorage/innobase/buf/buf0buf.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:Buffer Pool 取页。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.10 lock_rec_lockstorage/innobase/lock/lock0lock.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:记录锁 / gap lock。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.11 ibuf_insertstorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:Change Buffer 插入。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.12 ibuf_mergestorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:Change Buffer 合并。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.13 btr_search_build_page_hash_indexstorage/innobase/btr/btr0sea.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:AHI 构建。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.14 srv_mon_print_innodb_monitorstorage/innobase/srv/srv0mon.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:INNODB STATUS 输出。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.15 trx_purgestorage/innobase/trx/trx0purge.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:purge 回收 undo。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.16 recv_recovery_from_checkpoint_startstorage/innobase/log/log0recv.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:崩溃恢复 redo apply。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.17 ha_commit_transsql/handler.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:Server 层事务提交。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.18 ordered_commitsql/binlog.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:binlog 组提交。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.19 MYSQL_BIN_LOG::commitsql/binlog.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:binlog 事务落盘。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.20 ha_innobase::index_readstorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:索引读 handler 入口。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.21 ha_innobase::index_nextstorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:索引扫描下一行。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.22 row_search_mvccstorage/innobase/row/row0sel.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:一致性读搜索。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.23 btr_cur_search_to_nth_levelstorage/innobase/btr/btr0cur.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:B+Tree 搜索。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.24 com_binlog_dumpsql/binlog.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:Dump 线程协议。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.25 mysql_binlog_sendsql/binlog.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:发送 binlog 事件。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.26 Relay_log_info::sql_threadsql/rpl_relay_log.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:SQL 线程回放。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.27 Gtid_log_eventsql/binlog.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:GTID 事件。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.28 trx_commit_for_mysqlstorage/innobase/trx/trx0trx.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:InnoDB 事务提交入口。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.29 trx_prepare_for_mysqlstorage/innobase/trx/trx0trx.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:InnoDB XA prepare。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.30 log_buffer_writestorage/innobase/log/log0log.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:redo 写入 log buffer。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.31 log_write_up_tostorage/innobase/log/log0log.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:redo 刷盘至指定 LSN。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.32 buf_page_get_genstorage/innobase/buf/buf0buf.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:Buffer Pool 取页。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.33 lock_rec_lockstorage/innobase/lock/lock0lock.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:记录锁 / gap lock。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.34 ibuf_insertstorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:Change Buffer 插入。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.35 ibuf_mergestorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:Change Buffer 合并。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.36 btr_search_build_page_hash_indexstorage/innobase/btr/btr0sea.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:AHI 构建。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.37 srv_mon_print_innodb_monitorstorage/innobase/srv/srv0mon.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:INNODB STATUS 输出。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.38 trx_purgestorage/innobase/trx/trx0purge.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:purge 回收 undo。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.39 recv_recovery_from_checkpoint_startstorage/innobase/log/log0recv.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:崩溃恢复 redo apply。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.40 ha_commit_transsql/handler.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:Server 层事务提交。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.41 ordered_commitsql/binlog.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:binlog 组提交。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.42 MYSQL_BIN_LOG::commitsql/binlog.cc

MySQL 8.0.36 中该符号与 主从复制机制 相关:binlog 事务落盘。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段
参数 默认 说明
13_1 见文档 参数说明 1
13_2 见文档 参数说明 2
13_3 见文档 参数说明 3
13_4 见文档 参数说明 4
13_5 见文档 参数说明 5
13_6 见文档 参数说明 6
13_7 见文档 参数说明 7
13_8 见文档 参数说明 8
13_9 见文档 参数说明 9
13_10 见文档 参数说明 10
13_11 见文档 参数说明 11
13_12 见文档 参数说明 12
13_13 见文档 参数说明 13
13_14 见文档 参数说明 14
13_15 见文档 参数说明 15
13_16 见文档 参数说明 16
13_17 见文档 参数说明 17
13_18 见文档 参数说明 18
13_19 见文档 参数说明 19
13_20 见文档 参数说明 20
13_21 见文档 参数说明 21
13_22 见文档 参数说明 22
13_23 见文档 参数说明 23
13_24 见文档 参数说明 24
13_25 见文档 参数说明 25
13_26 见文档 参数说明 26
13_27 见文档 参数说明 27
13_28 见文档 参数说明 28
13_29 见文档 参数说明 29
13_30 见文档 参数说明 30

专题深化 1:主从复制机制

InnoDB 的 主从复制机制 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 1.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 1.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 1.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 1.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 1.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

专题深化 2:主从复制机制

InnoDB 的 主从复制机制 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 2.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 2.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 2.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 2.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 2.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

专题深化 3:主从复制机制

InnoDB 的 主从复制机制 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 3.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 3.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 3.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 3.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 3.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

专题深化 4:主从复制机制

InnoDB 的 主从复制机制 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 4.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 4.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 4.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 4.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 4.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

专题深化 5:主从复制机制

InnoDB 的 主从复制机制 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 5.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 5.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 5.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 5.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 5.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

专题深化 6:主从复制机制

InnoDB 的 主从复制机制 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 6.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 6.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 6.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 6.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 6.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

上一篇Binlog 与两阶段提交

下一篇Optimizer 与 Handler

参考资料

源码(MySQL 8.0.36)

官方文档

相关文章

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-06-18 · database / kernel

【MySQL InnoDB 内核】InnoDB 存储引擎机制深度拆解

从线程模型到页格式、从 undo log MVCC 到 binlog 两阶段提交——对 MySQL InnoDB 做源码级拆解,并与 PostgreSQL 内核系列逐章对照。20 篇覆盖内核机制与生产运维实战,面向 MySQL DBA、从 PG 转 MySQL 的后端与数据库内核开发者。


By .