附录:附录:MySQL 8.0 源码与内核实战速查手册
zjc 于 2026-02-01 发布
这是《MySQL 8.0 源码与内核实战》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。
目录定位
| 模块 |
目录 |
| SQL 解析与执行 |
sql/ |
| InnoDB |
storage/innobase/ |
| Binlog 事件 |
libbinlogevents/ |
| 组复制 |
plugin/group_replication/ |
| MTR 测试 |
mysql-test/ |
| 公共头文件 |
include/ |
关键调用链
dispatch_command
-> mysql_parse
-> mysql_execute_command
-> optimize
-> execute
-> handler::ha_index_read
-> ha_innobase::index_read
-> row_search_mvcc
写入:
Server write path
-> engine prepare
-> binlog write
-> engine commit
-> redo durable
常用断点
b dispatch_command
b mysql_parse
b mysql_execute_command
b JOIN::optimize
b row_search_mvcc
b row_insert_for_mysql
b row_update_for_mysql
b lock_rec_lock
b ReadView::changes_visible
b mtr_t::commit
结构体速查
| 结构 |
含义 |
THD |
会话上下文 |
TABLE_SHARE |
共享表定义 |
TABLE |
打开的表实例 |
handler |
Server 到引擎接口 |
row_prebuilt_t |
InnoDB 表操作上下文 |
buf_block_t |
缓冲页块 |
rec_t |
InnoDB 记录 |
btr_cur_t |
B+Tree 游标 |
trx_t |
InnoDB 事务 |
lock_t |
锁对象 |
mtr_t |
mini transaction |
SQL 层排查
EXPLAIN FORMAT=TREE SELECT ...;
EXPLAIN ANALYZE SELECT ...;
SET optimizer_trace='enabled=on';
SELECT trace FROM information_schema.optimizer_trace\G
InnoDB 排查
SHOW ENGINE INNODB STATUS;
SELECT * FROM information_schema.innodb_trx;
SELECT * FROM performance_schema.data_locks;
SELECT * FROM performance_schema.data_lock_waits;
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';
SHOW GLOBAL STATUS LIKE 'Innodb_redo_log%';
日志与事务
| 项目 |
要点 |
| redo |
物理页修改,崩溃恢复 |
| undo |
旧版本,回滚与 MVCC |
| MTR |
页级物理一致性 |
| LSN |
日志与页面版本 |
| checkpoint |
依赖脏页刷盘 |
| purge |
依赖最老活跃 read view |
DDL 判断
| 算法 |
含义 |
| INSTANT |
元数据变更 |
| INPLACE |
引擎内执行 |
| COPY |
重建复制 |
上线前检查算法支持、锁模式、磁盘空间、长事务和回滚方案。
常见现象定位
| 现象 |
优先方向 |
| 执行计划差 |
统计、索引、trace |
| commit 慢 |
redo、binlog、磁盘 |
| 锁等待 |
长事务、索引、隔离级别 |
| undo 膨胀 |
history list、purge |
| 磁盘不降 |
delete mark、页合并 |
| DDL 等待 |
MDL、表缓存 |
| 主从延迟 |
IO/SQL 线程、大事务 |
| 写入尖刺 |
checkpoint、purge、刷脏 |
实验清单
- 固定 MySQL 8.0.x 和 commit;
- Debug 构建并初始化独立 datadir;
- 写最小 SQL;
- 设置断点并保存 backtrace;
- 记录参数和状态;
- 对照 MTR;
- 输出版本化笔记。