主从切换与数据恢复:PITR 与 xtrabackup 边界
误删表后的第一反应不应该是
RESET MASTER。PITR 需要
全量备份点 + 连续
binlog;物理备份(Percona XtraBackup)捕获
InnoDB 页快照 + redo 位点,恢复后仍需
apply binlog 到目标时刻。GTID 环境下
failover 要遵守 executed gtid
集合单调性,否则从库拒绝启动。
版本 8.0.36;工具版本需与 Server 匹配(以官方文档为准)。
一、备份类型
| 方式 | 机制 | 优点 | 缺点 |
|---|---|---|---|
| mysqldump | 逻辑 SQL | 简单、跨版本 | 大库慢、锁/一致性依赖选项 |
| xtrabackup | 物理页拷贝 + redo | 热备、恢复快 | 工具链、版本耦合 |
XtraBackup 在备份结束记录 binlog
位点/GTID,恢复后 xtrabackup --prepare
应用 redo 到一致点。
二、PITR 流程
flowchart LR
FULL[全量备份 T0] --> RESTORE[恢复到实例]
BIN[binlog T0→T1] --> APPLY[mysqlbinlog / MTS]
APPLY --> TARGET[目标时刻 T1]
# 示意命令,需本地验证环境与路径
# xtrabackup --backup --target-dir=/backup/full
# xtrabackup --prepare --target-dir=/backup/full
# mysqlbinlog --stop-datetime="2026-06-18 12:00:00" binlog.000010 | mysql边界:未包含在 binlog 中的 DDL、非 InnoDB 引擎、主库已 PURGE 的 binlog 无法回到更早时刻。
三、GTID failover
提升从库为主后:
- 避免回退 更小 GTID 集合 的实例为主
RESET MASTER会清空 binlog 与 executed 历史——仅在明确重建拓扑时使用
Orchestrator、MHA 等工具处理选举;内核机制仍是 第 13 篇。
四、误操作 DROP 边界
- 有 binlog + 备份:可生成反向事件或恢复到临时实例导出
- 无 binlog:数据不可恢复
- 闪回工具依赖 row binlog + 完整行镜像
五、关键要点
- 物理备份 + binlog 是 PITR 标准组合。
- GTID 约束拓扑拼接。
- RESET MASTER 有毁灭性,非日常操作。
- 恢复演练应按 RTO/RPO 定期做。
十、PG 对照
| 维度 | MySQL | PG |
|---|---|---|
| 物理备份 | XtraBackup(热拷页+redo) | pg_basebackup |
| PITR | binlog 逻辑事件 | WAL archive + recovery_target |
| 位点 | GTID / file+pos | LSN / timeline |
| 提升从库 | CHANGE MASTER / 自动 | pg_ctl promote |
PG 第 18 篇 timeline 与 MySQL GTID 集合类似,都用于 防止脑裂后错误拼接。
深度阅读清单
深度.1
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 | 对照本章流程图标注阶段 |
深度.2
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 | 对照本章流程图标注阶段 |
深度.3
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 | 对照本章流程图标注阶段 |
深度.4
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 | 对照本章流程图标注阶段 |
深度.5
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 | 对照本章流程图标注阶段 |
深度.6
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 | 对照本章流程图标注阶段 |
深度.7
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 | 对照本章流程图标注阶段 |
深度.8
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 | 对照本章流程图标注阶段 |
深度.9
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 | 对照本章流程图标注阶段 |
深度.10
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 | 对照本章流程图标注阶段 |
深度.11
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 | 对照本章流程图标注阶段 |
深度.12
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 | 对照本章流程图标注阶段 |
深度.13
ha_commit_trans(sql/handler.cc)
MySQL 8.0.36 中该符号与 主从切换与数据恢复 相关:Server 层事务提交。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.14
ordered_commit(sql/binlog.cc)
MySQL 8.0.36 中该符号与 主从切换与数据恢复 相关:binlog 组提交。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.15
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 | 对照本章流程图标注阶段 |
深度.16
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 | 对照本章流程图标注阶段 |
深度.17
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 | 对照本章流程图标注阶段 |
深度.18
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 | 对照本章流程图标注阶段 |
深度.19
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 | 对照本章流程图标注阶段 |
深度.20
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 | 对照本章流程图标注阶段 |
深度.21
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 | 对照本章流程图标注阶段 |
深度.22
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 | 对照本章流程图标注阶段 |
深度.23
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 | 对照本章流程图标注阶段 |
深度.24
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 | 对照本章流程图标注阶段 |
深度.25
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 | 对照本章流程图标注阶段 |
深度.26
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 | 对照本章流程图标注阶段 |
深度.27
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 | 对照本章流程图标注阶段 |
深度.28
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 | 对照本章流程图标注阶段 |
深度.29
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 | 对照本章流程图标注阶段 |
深度.30
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 | 对照本章流程图标注阶段 |
深度.31
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 | 对照本章流程图标注阶段 |
深度.32
ha_commit_trans(sql/handler.cc)
MySQL 8.0.36 中该符号与 主从切换与数据恢复 相关:Server 层事务提交。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
| 参数 | 默认 | 说明 |
|---|---|---|
19_1 |
见文档 | 参数说明 1 |
19_2 |
见文档 | 参数说明 2 |
19_3 |
见文档 | 参数说明 3 |
19_4 |
见文档 | 参数说明 4 |
19_5 |
见文档 | 参数说明 5 |
19_6 |
见文档 | 参数说明 6 |
19_7 |
见文档 | 参数说明 7 |
19_8 |
见文档 | 参数说明 8 |
19_9 |
见文档 | 参数说明 9 |
19_10 |
见文档 | 参数说明 10 |
19_11 |
见文档 | 参数说明 11 |
19_12 |
见文档 | 参数说明 12 |
19_13 |
见文档 | 参数说明 13 |
19_14 |
见文档 | 参数说明 14 |
19_15 |
见文档 | 参数说明 15 |
19_16 |
见文档 | 参数说明 16 |
19_17 |
见文档 | 参数说明 17 |
19_18 |
见文档 | 参数说明 18 |
19_19 |
见文档 | 参数说明 19 |
19_20 |
见文档 | 参数说明 20 |
19_21 |
见文档 | 参数说明 21 |
19_22 |
见文档 | 参数说明 22 |
19_23 |
见文档 | 参数说明 23 |
19_24 |
见文档 | 参数说明 24 |
19_25 |
见文档 | 参数说明 25 |
19_26 |
见文档 | 参数说明 26 |
19_27 |
见文档 | 参数说明 27 |
19_28 |
见文档 | 参数说明 28 |
19_29 |
见文档 | 参数说明 29 |
19_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 为准。
上一篇:性能调查方法论
下一篇:配置陷阱
参考资料
源码(MySQL 8.0.36)
storage/innobase/— 引擎实现sql/binlog.cc,sql/handler.cc— Server 层交界
官方文档
- MySQL 8.0 Reference Manual, InnoDB / Replication / Backup
相关文章
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【MySQL InnoDB 内核】主从复制:异步、半同步、GTID 与并行回放
拆解 Dump/IO/SQL 线程、GTID、WRITESET 并行复制、半同步等待点与 Seconds_Behind_Master 陷阱。
【MySQL InnoDB 内核】InnoDB 架构与线程模型
InnoDB handler 边界、Master/Purge/IO/Page Cleaner 线程、内存布局与 srv0srv.cc 启动路径。
【MySQL InnoDB 内核】页结构与行格式
FIL 页头、Infimum/Supremum、聚簇/二级索引、ROW_FORMAT 与 rem0rec.h 行头字段。
【MySQL InnoDB 内核】Buffer Pool 与 LRU:frame、flush 列表与 young/old 分区
Buffer Pool 实例、LRU 年轻/年老分区、flush 列表、buf_page_get 路径与 read-ahead。