经典故障模式:长事务、脏页、死锁与复制延迟
凌晨告警「数据库卡顿」,白天查 slow_query
却只有毫秒级 SELECT——常见真相是 purge
追不上长事务留下的 undo,或 脏页比例触顶
checkpoint IO 风暴。另一类是业务「正常更新」在 RR
下触发 gap lock
死锁链。本文把四类高频故障钉到 第 3–13 篇
机制,给出 可执行排查
SQL(需本地验证)。
一、故障模式全景
flowchart TD
SYM[业务症状] --> U[undo 膨胀 / HLL]
SYM --> F[脏页 flush 风暴]
SYM --> G[gap lock 死锁]
SYM --> R[主从延迟]
U --> P1[purge 滞后]
F --> P2[checkpoint IO]
G --> P3[RR 当前读]
R --> P4[SQL 线程 / 大事务]
二、长事务 + undo 膨胀
现象:空间涨、查询变慢、History list length
高。
机制:第 5 篇 purge 不能清理仍被 Read View 需要的 undo。
-- 需本地验证
SELECT trx_id, trx_started, trx_rows_locked, trx_mysql_thread_id
FROM information_schema.innodb_trx
ORDER BY trx_started;
SHOW ENGINE INNODB STATUS\G
-- TRANSACTIONS 段 HLL修复边界:杀会话可回滚大事务(瞬时 IO
峰值);无法加速已堆积 undo 的回收,只能等
purge。预防:事务超时、idle_in_transaction_session_timeout。
二、脏页堆积 + flush 跟不上
现象:Innodb_buffer_pool_pages_dirty
高、pending flushes、checkpoint age 大。
机制:第 3 篇 flush 列表与 redo 耦合。
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_%';
SHOW GLOBAL STATUS LIKE 'Innodb_data_pending%';修复:降写入峰值、调
innodb_io_capacity(需结合磁盘能力本地验证)、避免同时大扫描+高写入。不是无限调大
BP。
三、Gap lock 死锁链
现象:LATEST DETECTED DEADLOCK
出现 lock_mode X locks gap before rec。
机制:第 8–9 篇 RR + 当前读。
SELECT * FROM performance_schema.data_lock_waits\G修复:改 RC(若业务允许)、对齐访问顺序、索引减少间隙、拆分批量更新。
四、主从延迟
现象:从库数据陈旧、relay 积压。
机制:第 13 篇 单线程回放 / 大事务。
SHOW REPLICA STATUS\G修复:MTS、拆大事务、从库硬件对齐、避免从库跑重分析。
五、故障对照表
| 故障 | 首选信号 | 内核章 |
|---|---|---|
| undo 膨胀 | HLL | 5、7 |
| flush 风暴 | dirty pages | 3、4 |
| gap 死锁 | deadlock 段 | 8、9 |
| 复制延迟 | relay 空间 | 12、13 |
六、关键要点
- 长事务 是 undo/purge 问题之母。
- 脏页 与 redo checkpoint 联动,非单调 BP。
- gap lock 死锁要动隔离级别或 SQL 形态。
- 复制 延迟先看 relay 与 worker,不信 SBM。
十、PG 对照
| 故障 | InnoDB | PG |
|---|---|---|
| 版本膨胀 | undo HLL 涨 | xid wrap / 长事务阻 VACUUM |
| 写放大卡顿 | flush list + redo | checkpoint + bgwriter |
| 死锁 | gap lock 链 | 行锁 / predicate lock(SSI) |
| 复制落后 | SQL 线程 | replay lag |
对照 PG VACUUM 与 InnoDB purge:都是 垃圾回收跟不上生产速度。
深度阅读清单
深度.1
trx_undo_report_row_operations(storage/innobase/trx/trx0undo.cc)
MySQL 8.0.36 中该符号与 经典故障模式 相关:undo 报告。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.2
buf_flush_list(storage/innobase/buf/buf0flu.cc)
MySQL 8.0.36 中该符号与 经典故障模式 相关:flush 列表。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.3
lock_deadlock_detect(storage/innobase/lock/lock0lock.cc)
MySQL 8.0.36 中该符号与 经典故障模式 相关:死锁检测。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.4
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 | 对照本章流程图标注阶段 |
深度.5
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 | 对照本章流程图标注阶段 |
深度.6
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 | 对照本章流程图标注阶段 |
深度.7
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 | 对照本章流程图标注阶段 |
深度.8
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 | 对照本章流程图标注阶段 |
深度.9
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 | 对照本章流程图标注阶段 |
深度.10
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 | 对照本章流程图标注阶段 |
深度.11
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 | 对照本章流程图标注阶段 |
深度.12
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 | 对照本章流程图标注阶段 |
深度.13
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 | 对照本章流程图标注阶段 |
深度.14
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 | 对照本章流程图标注阶段 |
深度.15
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 | 对照本章流程图标注阶段 |
深度.16
ha_commit_trans(sql/handler.cc)
MySQL 8.0.36 中该符号与 经典故障模式 相关:Server 层事务提交。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.17
ordered_commit(sql/binlog.cc)
MySQL 8.0.36 中该符号与 经典故障模式 相关:binlog 组提交。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.18
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 | 对照本章流程图标注阶段 |
深度.19
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 | 对照本章流程图标注阶段 |
深度.20
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 | 对照本章流程图标注阶段 |
深度.21
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 | 对照本章流程图标注阶段 |
深度.22
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 | 对照本章流程图标注阶段 |
深度.23
trx_undo_report_row_operations(storage/innobase/trx/trx0undo.cc)
MySQL 8.0.36 中该符号与 经典故障模式 相关:undo 报告。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.24
buf_flush_list(storage/innobase/buf/buf0flu.cc)
MySQL 8.0.36 中该符号与 经典故障模式 相关:flush 列表。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.25
lock_deadlock_detect(storage/innobase/lock/lock0lock.cc)
MySQL 8.0.36 中该符号与 经典故障模式 相关:死锁检测。
| 步骤 | 动作 |
|---|---|
| 1 | 在 tag mysql-8.0.36 下打开源文件 |
| 2 | 自函数入口向下读 80–120 行 |
| 3 | 记录 mtr / mutex 边界与调用方 |
| 4 | 对照本章流程图标注阶段 |
深度.26
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 | 对照本章流程图标注阶段 |
深度.27
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 | 对照本章流程图标注阶段 |
深度.28
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 | 对照本章流程图标注阶段 |
深度.29
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 | 对照本章流程图标注阶段 |
深度.30
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 | 对照本章流程图标注阶段 |
深度.31
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 | 对照本章流程图标注阶段 |
深度.32
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 | 对照本章流程图标注阶段 |
| 参数 | 默认 | 说明 |
|---|---|---|
17_1 |
见文档 | 参数说明 1 |
17_2 |
见文档 | 参数说明 2 |
17_3 |
见文档 | 参数说明 3 |
17_4 |
见文档 | 参数说明 4 |
17_5 |
见文档 | 参数说明 5 |
17_6 |
见文档 | 参数说明 6 |
17_7 |
见文档 | 参数说明 7 |
17_8 |
见文档 | 参数说明 8 |
17_9 |
见文档 | 参数说明 9 |
17_10 |
见文档 | 参数说明 10 |
17_11 |
见文档 | 参数说明 11 |
17_12 |
见文档 | 参数说明 12 |
17_13 |
见文档 | 参数说明 13 |
17_14 |
见文档 | 参数说明 14 |
17_15 |
见文档 | 参数说明 15 |
17_16 |
见文档 | 参数说明 16 |
17_17 |
见文档 | 参数说明 17 |
17_18 |
见文档 | 参数说明 18 |
17_19 |
见文档 | 参数说明 19 |
17_20 |
见文档 | 参数说明 20 |
17_21 |
见文档 | 参数说明 21 |
17_22 |
见文档 | 参数说明 22 |
17_23 |
见文档 | 参数说明 23 |
17_24 |
见文档 | 参数说明 24 |
17_25 |
见文档 | 参数说明 25 |
17_26 |
见文档 | 参数说明 26 |
17_27 |
见文档 | 参数说明 27 |
17_28 |
见文档 | 参数说明 28 |
17_29 |
见文档 | 参数说明 29 |
17_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 内核】InnoDB 架构与线程模型
InnoDB handler 边界、Master/Purge/IO/Page Cleaner 线程、内存布局与 srv0srv.cc 启动路径。
【MySQL InnoDB 内核】Buffer Pool 与 LRU:frame、flush 列表与 young/old 分区
Buffer Pool 实例、LRU 年轻/年老分区、flush 列表、buf_page_get 路径与 read-ahead。
【MySQL InnoDB 内核】Undo Log 与事务回滚
Undo segment、insert/update undo、purge 线程与长事务 history list 堆积机制。
【MySQL InnoDB 内核】页结构与行格式
FIL 页头、Infimum/Supremum、聚簇/二级索引、ROW_FORMAT 与 rem0rec.h 行头字段。