Skip to content

MySQL 监控命令

连接与会话监控

SHOW PROCESSLIST

功能:显示当前MySQL服务器上所有活跃连接和会话的详细信息

语法

sql
SHOW PROCESSLIST;
-- 或使用完整语法查看更多信息
SHOW FULL PROCESSLIST;

输出说明

  • Id:连接ID,可用于终止连接
  • User:连接的用户名
  • Host:客户端主机地址
  • db:当前使用的数据库
  • Command:当前执行的命令类型(Sleep, Query, Connect等)
  • Time:命令执行时间(秒)
  • State:连接当前状态
  • Info:执行的SQL语句或命令

使用场景

  • 监控当前活跃连接数
  • 识别长时间运行的查询
  • 查找阻塞或死锁的会话
  • 分析连接来源分布

SHOW STATUS

功能:显示MySQL服务器的各种状态变量

语法

sql
-- 查看所有状态变量
SHOW GLOBAL STATUS;
-- 查看会话级状态变量
SHOW SESSION STATUS;
-- 查看特定状态变量
SHOW GLOBAL STATUS LIKE 'Threads%';
SHOW GLOBAL STATUS LIKE 'Connections';
SHOW GLOBAL STATUS LIKE 'Queries';

常用状态变量

  • Connections:累计连接数
  • Threads_connected:当前连接数
  • Threads_running:当前运行线程数
  • Queries:累计查询数
  • Slow_queries:慢查询数量
  • Innodb_buffer_pool_reads:物理读取次数
  • Innodb_buffer_pool_read_requests:逻辑读取次数
  • Innodb_data_reads:InnoDB数据读取次数
  • Innodb_data_writes:InnoDB数据写入次数

使用场景

  • 监控数据库整体运行状态
  • 分析性能瓶颈
  • 跟踪连接和查询统计
  • 评估缓存命中率

性能监控

SHOW GLOBAL VARIABLES

功能:显示MySQL服务器的全局配置变量

语法

sql
-- 查看所有全局变量
SHOW GLOBAL VARIABLES;
-- 查看特定变量
SHOW GLOBAL VARIABLES LIKE 'max_connections';
SHOW GLOBAL VARIABLES LIKE 'innodb%buffer%';

常用配置变量

  • max_connections:最大连接数
  • innodb_buffer_pool_size:InnoDB缓冲池大小
  • innodb_log_file_size:InnoDB日志文件大小
  • query_cache_size:查询缓存大小(MySQL 5.7及以下)
  • slow_query_log:慢查询日志开关
  • long_query_time:慢查询阈值

使用场景

  • 查看当前配置参数
  • 验证配置变更是否生效
  • 分析配置对性能的影响

SHOW ENGINE INNODB STATUS

功能:显示InnoDB存储引擎的详细状态信息

语法

sql
SHOW ENGINE INNODB STATUS;

输出主要部分

  • BACKGROUND THREAD:后台线程状态
  • SEMAPHORES:信号量等待情况
  • LATEST DETECTED DEADLOCK:最近检测到的死锁信息
  • TRANSACTIONS:当前事务信息
  • FILE I/O:文件I/O统计
  • INSERT BUFFER AND ADAPTIVE HASH INDEX:插入缓冲和自适应哈希索引状态
  • BUFFER POOL AND MEMORY:缓冲池和内存使用情况
  • ROW OPERATIONS:行操作统计

使用场景

  • 分析InnoDB性能问题
  • 诊断死锁情况
  • 监控缓冲池使用效率
  • 查看事务状态和锁等待

SHOW ENGINE INNODB STATUS FORMAT=TRADITIONAL

功能:以传统格式显示InnoDB状态信息(MySQL 5.7及以上)

语法

sql
SHOW ENGINE INNODB STATUS FORMAT=TRADITIONAL;

使用场景

  • 与旧版本兼容的格式输出
  • 更适合手动分析的格式

锁与事务监控

SHOW OPEN TABLES

功能:显示当前被打开的表和锁信息

语法

sql
SHOW OPEN TABLES;
-- 查看被锁定的表
SHOW OPEN TABLES WHERE In_use > 0;

输出说明

  • Database:数据库名
  • Table:表名
  • In_use:被使用的次数
  • Name_locked:表名是否被锁定

使用场景

  • 监控表的使用情况
  • 查找被锁定的表
  • 分析表的访问频率

SHOW STATUS LIKE 'Innodb_row_lock%'

功能:查看InnoDB行锁相关统计信息

语法

sql
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%';

常用行锁状态变量

  • Innodb_row_lock_current_waits:当前等待行锁的数量
  • Innodb_row_lock_time:累计行锁等待时间(毫秒)
  • Innodb_row_lock_time_avg:平均行锁等待时间(毫秒)
  • Innodb_row_lock_time_max:最大行锁等待时间(毫秒)
  • Innodb_row_lock_waits:累计行锁等待次数

使用场景

  • 监控行锁等待情况
  • 分析锁竞争程度
  • 识别锁热点

INFORMATION_SCHEMA.INNODB_LOCKS

功能:显示当前InnoDB事务持有的锁信息(MySQL 5.7及以下)

语法

sql
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

输出说明

  • lock_id:锁ID
  • lock_trx_id:持有锁的事务ID
  • lock_mode:锁模式(S, X, IS, IX等)
  • lock_type:锁类型(TABLE, RECORD)
  • lock_table:被锁的表
  • lock_index:被锁的索引
  • lock_space:表空间ID
  • lock_page:页ID
  • lock_rec:记录ID
  • lock_data:锁定的记录数据

使用场景

  • 分析当前持有锁的事务
  • 识别锁冲突的具体对象

INFORMATION_SCHEMA.INNODB_LOCK_WAITS

功能:显示当前等待锁的事务信息(MySQL 5.7及以下)

语法

sql
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

输出说明

  • requesting_trx_id:请求锁的事务ID
  • requested_lock_id:请求的锁ID
  • blocking_trx_id:阻塞的事务ID
  • blocking_lock_id:阻塞的锁ID

使用场景

  • 查找导致锁等待的阻塞事务
  • 分析锁等待链

PERFORMANCE_SCHEMA.DATA_LOCKS

功能:显示当前所有数据锁信息(MySQL 8.0及以上)

语法

sql
SELECT * FROM PERFORMANCE_SCHEMA.DATA_LOCKS;

使用场景

  • 监控所有类型的数据锁
  • 替代旧版本的INNODB_LOCKS表

PERFORMANCE_SCHEMA.DATA_LOCK_WAITS

功能:显示当前数据锁等待信息(MySQL 8.0及以上)

语法

sql
SELECT * FROM PERFORMANCE_SCHEMA.DATA_LOCK_WAITS;

使用场景

  • 监控数据锁等待情况
  • 替代旧版本的INNODB_LOCK_WAITS表

存储引擎监控

SHOW TABLE STATUS

功能:显示表的状态信息,包括存储引擎、行数、大小等

语法

sql
-- 查看当前数据库所有表状态
SHOW TABLE STATUS;
-- 查看指定数据库表状态
SHOW TABLE STATUS FROM database_name;
-- 查看指定表状态
SHOW TABLE STATUS LIKE 'table_name';

输出主要字段

  • Name:表名
  • Engine:存储引擎
  • Version:表版本
  • Row_format:行格式
  • Rows:估计行数
  • Avg_row_length:平均行长度
  • Data_length:数据大小
  • Max_data_length:最大数据大小
  • Index_length:索引大小
  • Data_free:碎片空间大小
  • Auto_increment:下一个自增值
  • Create_time:创建时间
  • Update_time:更新时间
  • Check_time:检查时间
  • Collation:字符集和排序规则
  • Checksum:校验和
  • Create_options:创建选项
  • Comment:表注释

使用场景

  • 监控表的大小变化
  • 分析表的碎片情况
  • 查看表的存储引擎和行格式
  • 估计表的行数

SHOW INDEX

功能:显示表的索引信息

语法

sql
SHOW INDEX FROM table_name;
-- 或指定数据库
SHOW INDEX FROM database_name.table_name;

输出主要字段

  • Table:表名
  • Non_unique:是否非唯一索引
  • Key_name:索引名
  • Seq_in_index:索引中的列序号
  • Column_name:列名
  • Collation:排序方式(A, D, NULL)
  • Cardinality:索引基数估计值
  • Sub_part:部分索引的长度
  • Packed:是否压缩
  • Null:是否允许NULL
  • Index_type:索引类型(BTREE, HASH等)
  • Comment:索引注释

使用场景

  • 查看表的索引结构
  • 分析索引的选择性(Cardinality)
  • 检查是否存在冗余索引
  • 验证索引创建是否正确

日志监控

SHOW VARIABLES LIKE 'log%'

功能:查看MySQL日志配置

语法

sql
SHOW GLOBAL VARIABLES LIKE 'log%';

常用日志变量

  • log_error:错误日志路径
  • slow_query_log:慢查询日志开关
  • slow_query_log_file:慢查询日志路径
  • long_query_time:慢查询阈值
  • general_log:通用查询日志开关
  • general_log_file:通用查询日志路径
  • log_bin:二进制日志开关
  • log_bin_basename:二进制日志基础名称

使用场景

  • 检查日志配置是否正确
  • 验证日志是否开启
  • 查看日志文件路径

SHOW BINARY LOGS

功能:显示MySQL服务器上所有二进制日志文件列表

语法

sql
SHOW BINARY LOGS;

输出说明

  • Log_name:二进制日志文件名
  • File_size:日志文件大小(字节)

使用场景

  • 查看二进制日志文件列表
  • 监控二进制日志增长情况
  • 确定需要备份或清理的日志文件

SHOW MASTER STATUS

功能:显示当前主服务器的二进制日志状态(用于复制监控)

语法

sql
SHOW MASTER STATUS;

输出说明

  • File:当前使用的二进制日志文件名
  • Position:当前二进制日志位置
  • Binlog_Do_DB:指定要记录的数据库
  • Binlog_Ignore_DB:指定要忽略的数据库
  • Executed_Gtid_Set:已执行的GTID集合

使用场景

  • 监控主服务器二进制日志状态
  • 配置复制时获取主服务器信息
  • 验证GTID模式是否正常

SHOW SLAVE STATUS

功能:显示从服务器的复制状态

语法

sql
SHOW SLAVE STATUS\G;

输出主要字段

  • Slave_IO_State:IO线程状态
  • Master_Host:主服务器主机
  • Master_User:复制用户名
  • Master_Port:主服务器端口
  • Connect_Retry:连接重试间隔
  • Master_Log_File:当前读取的主二进制日志文件
  • Read_Master_Log_Pos:当前读取的主二进制日志位置
  • Relay_Log_File:当前写入的中继日志文件
  • Relay_Log_Pos:当前写入的中继日志位置
  • Relay_Master_Log_File:当前执行的主二进制日志文件
  • Slave_IO_Running:IO线程是否运行
  • Slave_SQL_Running:SQL线程是否运行
  • Replicate_Do_DB:指定要复制的数据库
  • Replicate_Ignore_DB:指定要忽略的数据库
  • Seconds_Behind_Master:复制延迟(秒)
  • Last_IO_Errno:IO线程最后错误号
  • Last_IO_Error:IO线程最后错误信息
  • Last_SQL_Errno:SQL线程最后错误号
  • Last_SQL_Error:SQL线程最后错误信息

使用场景

  • 监控从服务器复制状态
  • 检查复制是否正常运行
  • 分析复制延迟原因
  • 诊断复制错误

内存与缓冲池监控

SHOW VARIABLES LIKE 'innodb_buffer_pool%'

功能:查看InnoDB缓冲池配置

语法

sql
SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool%';

常用缓冲池变量

  • innodb_buffer_pool_size:缓冲池总大小
  • innodb_buffer_pool_instances:缓冲池实例数量
  • innodb_buffer_pool_chunk_size:缓冲池块大小
  • innodb_old_blocks_pct:旧区域比例
  • innodb_old_blocks_time:旧区域停留时间

使用场景

  • 检查缓冲池配置是否合理
  • 验证缓冲池参数是否生效

SHOW ENGINE INNODB STATUS (缓冲池部分)

功能:查看InnoDB缓冲池使用状态

语法

sql
SHOW ENGINE INNODB STATUS\G;

缓冲池状态主要指标

  • Total large memory allocated:分配的总内存
  • Dictionary memory allocated:字典内存分配
  • Buffer pool size:缓冲池页数量
  • Free buffers:空闲缓冲页数
  • Database pages:数据库页数量
  • Old database pages:旧区域数据库页数量
  • Modified db pages:脏页数量
  • Pending reads:待读取页数
  • Pending writes:待写入页数
  • Pages made young:年轻页数
  • Pages made not young:未年轻页数
  • Young-making rate:年轻页生成率
  • Buffer pool hit rate:缓冲池命中率

使用场景

  • 监控缓冲池使用率
  • 分析缓冲池命中率
  • 查看脏页数量和刷新情况
  • 评估缓冲池配置是否合理

性能模式监控

SHOW VARIABLES LIKE 'performance_schema%'

功能:查看性能模式配置

语法

sql
SHOW GLOBAL VARIABLES LIKE 'performance_schema%';

常用性能模式变量

  • performance_schema:性能模式开关
  • performance_schema_max_thread_instances:最大线程实例数
  • performance_schema_max_events_statements_history:语句历史最大事件数

使用场景

  • 检查性能模式是否开启
  • 调整性能模式配置

PERFORMANCE_SCHEMA.THREADS

功能:显示服务器线程信息

语法

sql
SELECT * FROM PERFORMANCE_SCHEMA.THREADS WHERE PROCESSLIST_ID IS NOT NULL;

使用场景

  • 监控服务器线程状态
  • 分析线程资源使用情况

PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_CURRENT

功能:显示当前正在执行的语句事件

语法

sql
SELECT * FROM PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_CURRENT;

使用场景

  • 实时监控正在执行的语句
  • 分析语句执行性能

系统命令行工具

mysqladmin

功能:MySQL服务器管理工具,提供多种监控和管理命令

常用命令

bash
# 查看服务器状态
mysqladmin -u root -p status

# 查看扩展状态
mysqladmin -u root -p extended-status

# 查看进程列表
mysqladmin -u root -p processlist

# 查看变量配置
mysqladmin -u root -p variables

# 检查服务器是否存活
mysqladmin -u root -p ping

# 查看服务器版本
mysqladmin -u root -p version

使用场景

  • 快速查看服务器基本状态
  • 远程监控服务器
  • 脚本化监控

mysqlshow

功能:显示MySQL数据库、表和列信息

常用命令

bash
# 查看所有数据库
mysqlshow -u root -p

# 查看指定数据库的表
mysqlshow -u root -p database_name

# 查看表结构
mysqlshow -u root -p database_name table_name

# 查看表的索引
mysqlshow -u root -p -k database_name table_name

使用场景

  • 快速查看数据库结构
  • 脚本化监控数据库对象

常见问题(FAQ)

Q1: SHOW PROCESSLIST和SHOW FULL PROCESSLIST有什么区别?

A1: SHOW PROCESSLIST只显示SQL语句的前100个字符,而SHOW FULL PROCESSLIST显示完整的SQL语句。当需要查看完整的长查询时,应使用SHOW FULL PROCESSLIST。

Q2: 如何快速查找长时间运行的查询?

A2: 可以使用以下SQL语句:

sql
SHOW FULL PROCESSLIST WHERE Time > 60;

这将显示执行时间超过60秒的所有查询。

Q3: 如何计算InnoDB缓冲池命中率?

A3: 缓冲池命中率可以通过以下公式计算:

Buffer pool hit rate = (1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100%

通常,命中率应保持在95%以上。

Q4: 如何查看当前MySQL服务器的连接数限制?

A4: 可以使用以下命令查看:

sql
SHOW GLOBAL VARIABLES LIKE 'max_connections';

Q5: 如何监控MySQL复制延迟?

A5: 在从服务器上执行SHOW SLAVE STATUS,查看Seconds_Behind_Master字段的值,该值表示从服务器落后主服务器的秒数。

Q6: 如何查看MySQL服务器的慢查询数量?

A6: 可以使用以下命令查看:

sql
SHOW GLOBAL STATUS LIKE 'Slow_queries';

Q7: 如何查看表的碎片情况?

A7: 使用SHOW TABLE STATUS命令,查看Data_free字段的值,该值表示表的碎片空间大小。如果Data_free值较大,说明表存在较多碎片,需要进行优化。

Q8: 如何查看当前正在执行的事务?

A8: 可以使用以下命令:

sql
-- MySQL 5.7及以下
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

-- MySQL 8.0及以上
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
-- 或使用性能模式
SELECT * FROM PERFORMANCE_SCHEMA.EVENTS_TRANSACTIONS_CURRENT;

Q9: 如何查看MySQL服务器的版本?

A9: 可以使用以下命令之一:

sql
SELECT VERSION();
SHOW VARIABLES LIKE 'version';

-- 命令行工具
mysqladmin -u root -p version
mysql -V

Q10: 如何终止一个长时间运行的查询?

A10: 首先使用SHOW PROCESSLIST找到该查询的Id,然后使用KILL命令终止:

sql
KILL 123; -- 123为查询的Id

对于使用事务的查询,可以使用KILL QUERY只终止查询而不终止连接:

sql
KILL QUERY 123;