MySQL 8.0Notes

附录:附录: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、刷脏

实验清单

  1. 固定 MySQL 8.0.x 和 commit;
  2. Debug 构建并初始化独立 datadir;
  3. 写最小 SQL;
  4. 设置断点并保存 backtrace;
  5. 记录参数和状态;
  6. 对照 MTR;
  7. 输出版本化笔记。