主从复制:异步、半同步、GTID 与并行回放
SHOW SLAVE STATUS 里
Seconds_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.cc、sql/rpl_rli.cc(relay
log info)。
二、binlog 格式与行复制
| 格式 | 内容 | 备注 |
|---|---|---|
| STATEMENT | SQL 文本 | 非确定性函数风险 |
| ROW | 行前后镜像 | 8.0 默认推荐 |
| MIXED | 自动选择 | 遗留 |
binlog_row_image:FULL(默认)、MINIMAL、NOBLOB——影响带宽与闪回粒度。大宽表
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.cc、sql/rpl_gtid_state.cc。
四、并行复制(MTS)
8.0 常用
slave_parallel_workers > 0,slave_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 主库当前时间。失真场景:
- 主库无新写入:SBM 趋近 0 即使 relay 仍积压
- 大事务:单 event 回放久,SBM 跳变
- MTS:显示的是 coordinator 视角
更可靠:performance_schema.replication_applier_status_by_worker
的 LAST_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 不能替代应用层去重。
十一、关键要点(正文)
- 复制链路:Dump → IO → relay → SQL → InnoDB。
- GTID 简化 failover,但
RESET MASTER有边界。 - 半同步 缩短 RPO 窗口,超时会 静默降级。
- SBM 不可靠;用 PFS 与 GTID 集合对比。
- 并行复制 依赖写集合与 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_dump(sql/binlog.cc)
MySQL 8.0.36 中该符号与 主从复制机制 相关:Dump 线程协议。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.2
mysql_binlog_send(sql/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_thread(sql/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_event(sql/binlog.cc)
MySQL 8.0.36 中该符号与 主从复制机制 相关:GTID 事件。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.5
trx_commit_for_mysql(storage/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_mysql(storage/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_write(storage/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_to(storage/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_gen(storage/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_lock(storage/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_insert(storage/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_merge(storage/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_index(storage/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_monitor(storage/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_purge(storage/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_start(storage/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_trans(sql/handler.cc)
MySQL 8.0.36 中该符号与 主从复制机制 相关:Server 层事务提交。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.18
ordered_commit(sql/binlog.cc)
MySQL 8.0.36 中该符号与 主从复制机制 相关:binlog 组提交。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.19
MYSQL_BIN_LOG::commit(sql/binlog.cc)
MySQL 8.0.36 中该符号与 主从复制机制 相关:binlog 事务落盘。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.20
ha_innobase::index_read(storage/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_next(storage/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_mvcc(storage/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_level(storage/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_dump(sql/binlog.cc)
MySQL 8.0.36 中该符号与 主从复制机制 相关:Dump 线程协议。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.25
mysql_binlog_send(sql/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_thread(sql/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_event(sql/binlog.cc)
MySQL 8.0.36 中该符号与 主从复制机制 相关:GTID 事件。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.28
trx_commit_for_mysql(storage/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_mysql(storage/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_write(storage/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_to(storage/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_gen(storage/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_lock(storage/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_insert(storage/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_merge(storage/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_index(storage/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_monitor(storage/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_purge(storage/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_start(storage/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_trans(sql/handler.cc)
MySQL 8.0.36 中该符号与 主从复制机制 相关:Server 层事务提交。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.41
ordered_commit(sql/binlog.cc)
MySQL 8.0.36 中该符号与 主从复制机制 相关:binlog 组提交。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.42
MYSQL_BIN_LOG::commit(sql/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
进入引擎;页级修改包在
mtr(mtr0mtr.cc)内。SQL
事务边界由 Server ha_commit_trans 协调 binlog
与 InnoDB(本章主线)。
专题深化 1.1 同步原语层次
短临界区用
mutex_enter(sync0sync.cc);页内容用
rw_lock(sync0rw.cc)。performance_schema
中 wait/synch/mutex/innodb/% 需在本地 workload
下采集,不可套用他方 benchmark。
专题深化 1.2 8.0.36 源码阅读顺序
建议:本章核心目录 → mtr/mtr0mtr.cc →
log/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
进入引擎;页级修改包在
mtr(mtr0mtr.cc)内。SQL
事务边界由 Server ha_commit_trans 协调 binlog
与 InnoDB(本章主线)。
专题深化 2.1 同步原语层次
短临界区用
mutex_enter(sync0sync.cc);页内容用
rw_lock(sync0rw.cc)。performance_schema
中 wait/synch/mutex/innodb/% 需在本地 workload
下采集,不可套用他方 benchmark。
专题深化 2.2 8.0.36 源码阅读顺序
建议:本章核心目录 → mtr/mtr0mtr.cc →
log/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
进入引擎;页级修改包在
mtr(mtr0mtr.cc)内。SQL
事务边界由 Server ha_commit_trans 协调 binlog
与 InnoDB(本章主线)。
专题深化 3.1 同步原语层次
短临界区用
mutex_enter(sync0sync.cc);页内容用
rw_lock(sync0rw.cc)。performance_schema
中 wait/synch/mutex/innodb/% 需在本地 workload
下采集,不可套用他方 benchmark。
专题深化 3.2 8.0.36 源码阅读顺序
建议:本章核心目录 → mtr/mtr0mtr.cc →
log/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
进入引擎;页级修改包在
mtr(mtr0mtr.cc)内。SQL
事务边界由 Server ha_commit_trans 协调 binlog
与 InnoDB(本章主线)。
专题深化 4.1 同步原语层次
短临界区用
mutex_enter(sync0sync.cc);页内容用
rw_lock(sync0rw.cc)。performance_schema
中 wait/synch/mutex/innodb/% 需在本地 workload
下采集,不可套用他方 benchmark。
专题深化 4.2 8.0.36 源码阅读顺序
建议:本章核心目录 → mtr/mtr0mtr.cc →
log/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
进入引擎;页级修改包在
mtr(mtr0mtr.cc)内。SQL
事务边界由 Server ha_commit_trans 协调 binlog
与 InnoDB(本章主线)。
专题深化 5.1 同步原语层次
短临界区用
mutex_enter(sync0sync.cc);页内容用
rw_lock(sync0rw.cc)。performance_schema
中 wait/synch/mutex/innodb/% 需在本地 workload
下采集,不可套用他方 benchmark。
专题深化 5.2 8.0.36 源码阅读顺序
建议:本章核心目录 → mtr/mtr0mtr.cc →
log/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
进入引擎;页级修改包在
mtr(mtr0mtr.cc)内。SQL
事务边界由 Server ha_commit_trans 协调 binlog
与 InnoDB(本章主线)。
专题深化 6.1 同步原语层次
短临界区用
mutex_enter(sync0sync.cc);页内容用
rw_lock(sync0rw.cc)。performance_schema
中 wait/synch/mutex/innodb/% 需在本地 workload
下采集,不可套用他方 benchmark。
专题深化 6.2 8.0.36 源码阅读顺序
建议:本章核心目录 → mtr/mtr0mtr.cc →
log/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 与两阶段提交
参考资料
源码(MySQL 8.0.36)
storage/innobase/— 引擎实现sql/binlog.cc,sql/handler.cc— Server 层交界
官方文档
- MySQL 8.0 Reference Manual, InnoDB / Replication / Backup
相关文章
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【MySQL InnoDB 内核】InnoDB 存储引擎机制深度拆解
从线程模型到页格式、从 undo log MVCC 到 binlog 两阶段提交——对 MySQL InnoDB 做源码级拆解,并与 PostgreSQL 内核系列逐章对照。20 篇覆盖内核机制与生产运维实战,面向 MySQL DBA、从 PG 转 MySQL 的后端与数据库内核开发者。
【MySQL InnoDB 内核】Binlog 与两阶段提交:XA、组提交与持久性语义
从 sql/binlog.cc 与 trx0trx.cc 拆解 binlog 与 InnoDB redo 的 XA 两阶段提交、ordered_commit 组提交、sync_binlog 与 innodb_flush_log_at_trx_commit 组合语义。
【MySQL InnoDB 内核】主从切换与数据恢复:PITR 与 xtrabackup 边界
mysqldump 与 xtrabackup 机制差异、binlog PITR、GTID failover 与误删恢复边界。
【MySQL InnoDB 内核】InnoDB 架构与线程模型
InnoDB handler 边界、Master/Purge/IO/Page Cleaner 线程、内存布局与 srv0srv.cc 启动路径。