util.checkforserverupgrade()仅做升级兼容性检查,不涉及性能分析;性能诊断需用util.profiling()、util.inspectinstance()或手动查询performance_schema等server端指标。

MySQL Shell 的 util.checkForServerUpgrade() 不能替代性能分析
很多人装上 mysqlsh 后第一反应是跑 util.checkForServerUpgrade(),以为它能查慢查询或锁等待——其实它只做兼容性检查,和性能无关。真要分析性能,得用 dba 和 util 下的其他模块,核心是 dba.getCluster()(集群场景)或直接连实例后调用 session.runSql() 执行诊断语句。
-
util.checkForServerUpgrade()输出的是“能否升级到 8.4”这类建议,不是slow_log分析结果 - 真正有用的入口是
util.profiling()(需 MySQL 8.0.29+)和util.inspectInstance(),后者会汇总连接数、缓冲池命中率、复制延迟等关键指标 - 如果用的是 MySQL 5.7,
util.inspectInstance()不可用,得手动执行SHOW GLOBAL STATUS和INFORMATION_SCHEMA查询
用 util.profiling() 抓取某条 SQL 的完整执行路径
util.profiling() 是 MySQL Shell 8.0.29 引入的轻量级火焰图式分析工具,不依赖 performance_schema 开启,也不改 server 配置,适合临时排查单条语句卡在哪。
- 必须先用
session.runSql()执行目标语句,再立刻调用util.profiling(),否则抓不到上下文 - 它默认只记录最近一次查询,想看多条就得反复执行 + 调用,不能批量回放
- 输出里
"file"字段指向源码文件(如sql_parse.cc),不是你的 SQL 文件路径,别误以为能定位到应用层代码 - 示例:
session.runSql("SELECT * FROM orders WHERE created_at > '2024-01-01' LIMIT 100");<br>util.profiling();
dba.getCluster().status() 显示的“memberState”: “ONLINE” 不代表查询不慢
集群状态正常,只说明节点没掉线、复制没断,但完全掩盖不了单个节点的 CPU 瓶颈、磁盘 I/O 堵塞或大事务阻塞问题。这时候 dba.getCluster().status() 的输出看着很健康,实际 SELECT 响应已超 5 秒。
- 它不展示
Threads_running、Innodb_row_lock_waits这类实时负载指标 - 如果集群里某个节点
Seconds_Behind_Master持续增长,status()只标为"RECOVERING",但不会告诉你是因为innodb_buffer_pool_size太小导致 replay 缓慢 - 真实瓶颈常藏在
session.runSql("SELECT * FROM performance_schema.events_statements_summary_by_digest ORDER BY SUM_TIMER_WAIT DESC LIMIT 5")里
连接时加 --log-level=DEBUG3 会拖慢 mysqlsh 本身,且日志不含 SQL 执行耗时
有人想靠开启 debug 日志看“哪条命令最慢”,结果发现 mysqlsh 启动变卡、日志爆炸,最后也没找到慢查询根源。这是因为 DEBUG3 记录的是 Shell 自身的网络握手、JSON 序列化过程,不是 MySQL Server 的执行耗时。
- 日志里出现
"Sending query to server"和"Received response"之间的时间差,是网络 RTT + Server 执行时间之和,无法拆分 - 真正该开的是 MySQL 服务端的
slow_query_log,配合long_query_time = 0抓全量 - Shell 本地 debug 日志路径默认在
~/.mysqlsh/mysqlsh.log,但除非调试 Shell 崩溃,否则对性能分析基本无用
事情说清了就结束。性能分析的核心永远在 Server 端指标,mysqlsh 只是帮你更方便地取数和组织诊断流程,别把它当黑盒 profiler 用。











