Skip to content

MariaDB 状态检查

状态检查是 MariaDB 运维中的重要环节,通过检查数据库的状态可以了解数据库的运行情况、性能瓶颈、资源使用情况和潜在问题。MariaDB 提供了丰富的状态检查命令和指标,如 SHOW STATUS、SHOW VARIABLES、SHOW PROCESSLIST 等。本文将详细介绍 MariaDB 状态检查的方法、常用命令、状态指标和最佳实践,帮助 DBA 快速了解数据库状态,及时发现和解决问题。

状态检查概述

状态检查的重要性

  • 了解运行状态:实时掌握数据库的运行情况
  • 性能优化:识别性能瓶颈和资源使用问题
  • 故障诊断:快速定位和解决数据库故障
  • 容量规划:了解数据库的增长趋势和资源需求
  • 安全审计:检查用户权限和连接情况
  • 合规要求:满足行业合规要求,如 GDPR、PCI DSS 等

状态检查的类型

  1. 全局状态检查:检查数据库的整体运行状态
  2. 会话状态检查:检查当前会话的状态
  3. 存储引擎状态检查:检查 InnoDB、MyISAM 等存储引擎的状态
  4. 复制状态检查:检查主从复制或 Galera Cluster 的状态
  5. 连接状态检查:检查数据库连接情况
  6. 查询状态检查:检查当前执行的查询

版本差异

不同 MariaDB 版本在状态检查功能方面存在一些差异:

  • MariaDB 5.5+:支持基本的状态检查命令
  • MariaDB 10.0+:增强了状态检查的功能,增加了更多的状态指标
  • MariaDB 10.1+:引入了 Performance Schema,提供更详细的状态信息
  • MariaDB 10.2+:增加了更多的 InnoDB 状态指标
  • MariaDB 10.3+:增强了 Galera Cluster 的状态检查功能
  • MariaDB 10.4+:优化了状态检查的性能
  • MariaDB 10.5+:提供了更详细的状态信息和分析工具

常用状态检查命令

SHOW STATUS

概述

SHOW STATUS 命令用于查看数据库的状态指标,包括全局状态和会话状态。

语法

sql
-- 查看全局状态
SHOW GLOBAL STATUS;

-- 查看会话状态
SHOW SESSION STATUS;

-- 过滤状态指标
SHOW GLOBAL STATUS LIKE 'Connections';
SHOW GLOBAL STATUS WHERE Variable_name LIKE '%innodb%';

常用全局状态指标

状态指标描述
Connections连接到数据库的总次数
Uptime数据库运行时间(秒)
Slow_queries慢查询数量
Queries总查询数量
Questions客户端发送的查询数量
Threads_connected当前连接的线程数
Threads_running当前运行的线程数
Innodb_buffer_pool_pages_dataInnoDB 缓冲池中包含数据的页数
Innodb_buffer_pool_pages_freeInnoDB 缓冲池中空闲的页数
Innodb_buffer_pool_hit_rateInnoDB 缓冲池命中率
Bytes_sent发送给客户端的字节数
Bytes_received从客户端接收的字节数
Com_selectSELECT 语句数量
Com_insertINSERT 语句数量
Com_updateUPDATE 语句数量
Com_deleteDELETE 语句数量

SHOW VARIABLES

概述

SHOW VARIABLES 命令用于查看数据库的配置参数,包括全局变量和会话变量。

语法

sql
-- 查看全局变量
SHOW GLOBAL VARIABLES;

-- 查看会话变量
SHOW SESSION VARIABLES;

-- 过滤配置参数
SHOW GLOBAL VARIABLES LIKE 'max_connections';
SHOW GLOBAL VARIABLES WHERE Variable_name LIKE 'innodb%';

常用配置参数

配置参数描述
max_connections最大连接数
innodb_buffer_pool_sizeInnoDB 缓冲池大小
innodb_log_file_sizeInnoDB 日志文件大小
innodb_flush_log_at_trx_commitInnoDB 日志刷新策略
long_query_time慢查询阈值(秒)
slow_query_log是否启用慢查询日志
log_bin是否启用二进制日志
binlog_format二进制日志格式
character_set_server服务器字符集
collation_server服务器排序规则
default_storage_engine默认存储引擎
query_cache_type查询缓存类型
query_cache_size查询缓存大小

SHOW PROCESSLIST

概述

SHOW PROCESSLIST 命令用于查看当前正在执行的查询和连接情况。

语法

sql
-- 查看所有连接
SHOW FULL PROCESSLIST;

-- 只查看当前用户的连接
SHOW PROCESSLIST;

输出字段说明

字段描述
Id连接 ID
User用户名
Host客户端主机
db数据库名
Command命令类型(Sleep, Query, Connect 等)
Time命令执行时间(秒)
State连接状态
Info查询语句或命令

常见状态分析

  • Sleep:连接处于空闲状态
  • Query:正在执行查询
  • Connect:正在连接到数据库
  • Locked:等待表锁
  • Analyzing and statistics:正在分析查询和收集统计信息
  • Sending data:正在向客户端发送数据
  • Waiting for table metadata lock:等待表元数据锁
  • Waiting for global read lock:等待全局读锁
  • Waiting for tables:等待表变为可用

SHOW ENGINE INNODB STATUS

概述

SHOW ENGINE INNODB STATUS 命令用于查看 InnoDB 存储引擎的详细状态信息。

语法

sql
SHOW ENGINE INNODB STATUS\G

输出内容详解

  1. BACKGROUND THREAD:后台线程状态
  2. SEMAPHORES:信号量状态,包括等待和获取的信号量数量
  3. TRANSACTIONS:当前事务状态,包括活跃事务和锁等待情况
  4. FILE I/O:文件 I/O 状态,包括读写次数和等待时间
  5. INSERT BUFFER AND ADAPTIVE HASH INDEX:插入缓冲和自适应哈希索引状态
  6. LOG:InnoDB 日志状态,包括日志写入和刷新情况
  7. BUFFER POOL AND MEMORY:缓冲池和内存使用情况
  8. INDIVIDUAL BUFFER POOL INFO:每个缓冲池实例的详细信息
  9. ROW OPERATIONS:行操作统计信息
  10. LATEST DETECTED DEADLOCK:最近检测到的死锁信息

SHOW OPEN TABLES

概述

SHOW OPEN TABLES 命令用于查看当前打开的表。

语法

sql
-- 查看所有打开的表
SHOW OPEN TABLES;

-- 查看特定数据库的打开表
SHOW OPEN TABLES FROM database_name;

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

SHOW INDEX

概述

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=升序,NULL=无)
Cardinality索引的基数(估计值)
Sub_part前缀索引的长度(如果有)
Packed列是否被压缩
Null列是否允许 NULL 值
Index_type索引类型(BTREE, HASH 等)
Comment索引注释

SHOW TABLE STATUS

概述

SHOW TABLE STATUS 命令用于查看表的状态信息,包括表的大小、行数、引擎类型等。

语法

sql
-- 查看所有表的状态
SHOW TABLE STATUS;

-- 查看特定数据库的表状态
SHOW TABLE STATUS FROM database_name;

-- 查看特定表的状态
SHOW TABLE STATUS LIKE 'table_name';

输出字段说明

字段描述
Name表名
Engine存储引擎
Version表的版本
Row_format行格式(Dynamic, Compact 等)
Rows表中的行数(估计值)
Avg_row_length平均行长度
Data_length数据大小(字节)
Max_data_length最大数据大小(字节)
Index_length索引大小(字节)
Data_free空闲数据大小(字节)
Auto_increment下一个自增 ID 值
Create_time表的创建时间
Update_time表的最后更新时间
Check_time表的最后检查时间
Collation表的排序规则
Checksum表的校验和
Create_options创建表时的选项
Comment表注释

SHOW GRANTS

概述

SHOW GRANTS 命令用于查看用户的权限。

语法

sql
-- 查看当前用户的权限
SHOW GRANTS;

-- 查看指定用户的权限
SHOW GRANTS FOR 'username'@'localhost';

SHOW BINARY LOGS

概述

SHOW BINARY LOGS 命令用于查看二进制日志列表。

语法

sql
SHOW BINARY LOGS;

SHOW MASTER STATUS

概述

SHOW MASTER STATUS 命令用于查看主库的二进制日志状态,包括当前二进制日志文件和位置。

语法

sql
SHOW MASTER STATUS;

SHOW SLAVE STATUS

概述

SHOW SLAVE STATUS 命令用于查看从库的复制状态。

语法

sql
SHOW SLAVE STATUS\G

关键状态字段

字段描述
Slave_IO_RunningIO 线程状态
Slave_SQL_RunningSQL 线程状态
Seconds_Behind_Master主从延迟秒数
Master_Log_File主库当前的二进制日志文件
Relay_Master_Log_File从库当前应用的二进制日志文件
Read_Master_Log_PosIO 线程读取的主库二进制日志位置
Exec_Master_Log_PosSQL 线程执行的主库二进制日志位置
Last_IO_ErrorIO 线程错误
Last_SQL_ErrorSQL 线程错误

状态指标详解

连接状态指标

  • Connections:连接到数据库的总次数,包括成功和失败的连接
  • Max_used_connections:历史最大连接数
  • Threads_connected:当前连接的线程数
  • Threads_running:当前运行的线程数
  • Aborted_connects:失败的连接次数
  • Aborted_clients:被中止的客户端连接次数

查询性能指标

  • Queries:总查询数量,包括所有类型的查询
  • Questions:客户端发送的查询数量
  • Slow_queries:慢查询数量
  • Qcache_hits:查询缓存命中次数
  • Qcache_inserts:查询缓存插入次数
  • Qcache_lowmem_prunes:查询缓存因内存不足而删除的查询次数
  • Select_full_join:没有使用索引的 JOIN 查询次数
  • Select_full_range_join:使用范围扫描的 JOIN 查询次数
  • Select_scan:全表扫描的 SELECT 查询次数

缓存指标

  • Innodb_buffer_pool_pages_data:InnoDB 缓冲池中包含数据的页数
  • Innodb_buffer_pool_pages_free:InnoDB 缓冲池中空闲的页数
  • Innodb_buffer_pool_hit_rate:InnoDB 缓冲池命中率
  • Key_reads:从磁盘读取索引的次数
  • Key_read_requests:从缓存读取索引的次数
  • Key_write_requests:写入索引的次数
  • Key_writes:将索引写入磁盘的次数
  • Query_cache_size:查询缓存大小
  • Query_cache_free_memory:查询缓存空闲内存
  • Query_cache_used_memory:查询缓存使用的内存

InnoDB 状态指标

  • Innodb_buffer_pool_bytes_data:InnoDB 缓冲池中数据的字节数
  • Innodb_buffer_pool_bytes_total:InnoDB 缓冲池总字节数
  • Innodb_buffer_pool_read_requests:InnoDB 缓冲池读取请求次数
  • Innodb_buffer_pool_reads:从磁盘读取 InnoDB 页的次数
  • Innodb_data_read:从 InnoDB 数据文件读取的总字节数
  • Innodb_data_written:写入 InnoDB 数据文件的总字节数
  • Innodb_log_waits:等待 InnoDB 日志的次数
  • Innodb_log_write_requests:InnoDB 日志写入请求次数
  • Innodb_log_writes:InnoDB 日志写入次数
  • Innodb_row_lock_current_waits:当前等待行锁的数量
  • Innodb_row_lock_time:行锁等待总时间(毫秒)
  • Innodb_row_lock_waits:行锁等待次数

复制状态指标

  • Slave_running:从库是否正在运行
  • Seconds_Behind_Master:主从延迟秒数
  • Slave_retried_transactions:从库重试的事务次数
  • Slave_last_heartbeat:从库最后一次心跳时间

Galera Cluster 状态指标

  • wsrep_cluster_size:集群大小
  • wsrep_cluster_status:集群状态
  • wsrep_connected:节点是否连接到集群
  • wsrep_ready:节点是否就绪
  • wsrep_local_state_comment:本地节点状态
  • wsrep_incoming_addresses:集群中所有节点的地址
  • wsrep_flow_control_paused:Flow Control 暂停时间比例
  • wsrep_local_recv_queue:本地接收队列长度
  • wsrep_local_send_queue:本地发送队列长度

状态检查工具

内置工具

  1. mysqladmin

    • 查看数据库状态
    • 刷新日志和权限
    • 关闭数据库
    • 查看进程列表
    bash
    mysqladmin -u root -p status
    mysqladmin -u root -p processlist
    mysqladmin -u root -p variables
  2. mysqldump

    • 备份数据库
    • 查看数据库结构
  3. mysqlshow

    • 查看数据库、表和列信息
    • 查看索引信息
    bash
    mysqlshow -u root -p
    mysqlshow -u root -p database_name
    mysqlshow -u root -p database_name table_name

第三方工具

  1. Percona Toolkit

    • pt-summary:收集系统和数据库状态信息
    • pt-mysql-summary:收集 MySQL/MariaDB 详细状态信息
    • pt-processlist:增强版的 SHOW PROCESSLIST
    • pt-ioprofile:分析 I/O 性能
  2. MySQL Enterprise Monitor:提供数据库监控和状态检查功能

  3. Prometheus + Grafana

    • 收集状态指标
    • 可视化状态信息
    • 设置状态告警
  4. Nagios/Icinga

    • 监控数据库状态
    • 设置状态告警
    • 生成状态报告
  5. Zabbix

    • 监控数据库状态
    • 提供丰富的模板
    • 支持自动发现

状态检查最佳实践

定期检查

  1. 每日检查

    • 连接状态
    • 查询性能
    • 慢查询日志
    • 错误日志
    • 复制状态(如果有)
  2. 每周检查

    • 表状态和索引
    • 缓存使用情况
    • 磁盘空间
    • 用户权限
  3. 每月检查

    • 数据库配置
    • 备份状态
    • 安全审计
    • 性能基线

重点关注的指标

  1. 连接相关

    • Threads_connected vs max_connections
    • Aborted_connects
    • Aborted_clients
  2. 性能相关

    • Slow_queries
    • Select_scan
    • Select_full_join
    • Innodb_buffer_pool_hit_rate
    • Key_reads / Key_read_requests(索引命中率)
  3. 资源相关

    • Innodb_buffer_pool_pages_free
    • Data_free
    • Disk usage
  4. 复制相关

    • Slave_IO_Running
    • Slave_SQL_Running
    • Seconds_Behind_Master
  5. Galera Cluster 相关

    • wsrep_cluster_size
    • wsrep_cluster_status
    • wsrep_flow_control_paused
    • wsrep_local_recv_queue

状态监控和告警

  1. 建立监控体系

    • 选择合适的监控工具
    • 配置监控指标
    • 设置合理的告警阈值
  2. 告警设置

    • 连接数超过 80% 时告警
    • 慢查询数量超过阈值时告警
    • 主从延迟超过 30 秒时告警
    • 缓存命中率低于 90% 时告警
    • 磁盘空间低于 20% 时告警
  3. 告警处理流程

    • 收到告警后,立即查看详细状态
    • 分析告警原因
    • 采取相应的处理措施
    • 记录告警处理过程

性能基线建立

  1. 收集基准数据

    • 在系统正常运行时,收集状态指标
    • 记录不同时间段的状态数据
    • 建立性能基线
  2. 定期对比分析

    • 将当前状态与性能基线对比
    • 识别异常变化
    • 及时调整配置和优化性能

状态检查案例分析

案例一:连接数过高

问题描述: 某公司的 MariaDB 数据库连接数持续增加,接近 max_connections 限制。

诊断过程

  1. 使用 SHOW GLOBAL STATUS LIKE 'Threads_connected' 查看当前连接数
  2. 使用 SHOW GLOBAL VARIABLES LIKE 'max_connections' 查看最大连接数限制
  3. 使用 SHOW FULL PROCESSLIST 查看连接详情
  4. 发现大量空闲连接,状态为 Sleep

处理方法

  1. 优化应用程序,减少空闲连接
  2. 配置 wait_timeoutinteractive_timeout,自动关闭长时间空闲的连接
  3. 考虑使用连接池,管理数据库连接
  4. 临时增加 max_connections 配置

优化结果

  • 连接数保持在合理范围内
  • 避免了连接数超过限制的问题
  • 提高了数据库的稳定性

案例二:缓存命中率低

问题描述: 某公司的 MariaDB 数据库 InnoDB 缓冲池命中率低于 90%,导致性能下降。

诊断过程

  1. 使用 SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%' 查看缓冲池状态
  2. 计算缓冲池命中率:
    sql
    SELECT CONCAT(ROUND(100 * (1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)), 2), '%') AS buffer_pool_hit_rate
    FROM information_schema.GLOBAL_STATUS
    WHERE VARIABLE_NAME IN ('Innodb_buffer_pool_reads', 'Innodb_buffer_pool_read_requests');
  3. 发现 Innodb_buffer_pool_size 设置过小

处理方法

  1. 调整 innodb_buffer_pool_size,增加缓冲池大小
  2. 重启数据库,使配置生效
  3. 监控缓冲池命中率,确保在 95% 以上

优化结果

  • 缓冲池命中率提高到 98%
  • 数据库性能显著提升
  • 磁盘 I/O 减少了 60%

案例三:主从延迟

问题描述: 某公司的 MariaDB 主从复制延迟达到了 5 分钟,影响了业务系统。

诊断过程

  1. 使用 SHOW SLAVE STATUSG 查看复制状态
  2. 发现 Seconds_Behind_Master 为 300
  3. 查看从库的 SHOW PROCESSLIST,发现 SQL 线程正在执行一个大查询
  4. 查看主库的慢查询日志,确认了该大查询

处理方法

  1. 优化大查询,将其拆分为多个小查询
  2. 调整从库的 slave_parallel_threads,增加并行复制线程数
  3. 配置主从复制的延迟告警,当延迟超过 30 秒时触发告警
  4. 定期监控主从复制状态

优化结果

  • 主从延迟降低到 5 秒以内
  • 复制稳定性显著提高
  • 业务系统恢复正常运行

FAQ

Q1: 如何查看数据库的当前状态?

A1: 可以使用以下命令查看数据库的当前状态:

sql
SHOW GLOBAL STATUS;
SHOW GLOBAL VARIABLES;
SHOW FULL PROCESSLIST;
SHOW ENGINE INNODB STATUS\G

Q2: 如何查看 InnoDB 缓冲池的使用情况?

A2: 可以使用以下命令查看 InnoDB 缓冲池的使用情况:

sql
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';

或者使用以下查询计算缓冲池命中率:

sql
SELECT 
  CONCAT(ROUND(100 * (1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)), 2), '%') AS buffer_pool_hit_rate,
  CONCAT(ROUND(100 * (Innodb_buffer_pool_pages_data / Innodb_buffer_pool_pages_total), 2), '%') AS buffer_pool_usage
FROM information_schema.GLOBAL_STATUS
WHERE VARIABLE_NAME IN ('Innodb_buffer_pool_reads', 'Innodb_buffer_pool_read_requests', 'Innodb_buffer_pool_pages_data', 'Innodb_buffer_pool_pages_total');

Q3: 如何查看当前执行的查询?

A3: 可以使用 SHOW FULL PROCESSLIST 命令查看当前执行的查询:

sql
SHOW FULL PROCESSLIST;

Q4: 如何查看主从复制状态?

A4: 可以使用 SHOW SLAVE STATUS\G 命令查看主从复制状态:

sql
SHOW SLAVE STATUS\G

Q5: 如何查看 Galera Cluster 的状态?

A5: 可以使用以下命令查看 Galera Cluster 的状态:

sql
SHOW GLOBAL STATUS LIKE 'wsrep%';

Q6: 如何建立性能基线?

A6: 可以采取以下步骤建立性能基线:

  1. 在系统正常运行时,收集状态指标
  2. 记录不同时间段的状态数据,如高峰和低峰期
  3. 分析数据,建立性能基线
  4. 定期对比当前状态与性能基线,识别异常变化

Q7: 如何优化连接数过高的问题?

A7: 可以采取以下措施优化连接数过高的问题:

  1. 优化应用程序,减少空闲连接
  2. 配置 wait_timeoutinteractive_timeout,自动关闭长时间空闲的连接
  3. 使用连接池管理数据库连接
  4. 临时增加 max_connections 配置
  5. 监控连接数,设置连接数告警

Q8: MariaDB 和 MySQL 的状态检查命令有什么区别?

A8: MariaDB 和 MySQL 的状态检查命令基本相似,但 MariaDB 提供了一些额外的命令和指标:

  • MariaDB 10.1+ 引入了更多的 Galera Cluster 状态指标
  • MariaDB 10.2+ 增加了更多的 InnoDB 状态指标
  • MariaDB 10.3+ 增强了慢查询日志的分析功能
  • MariaDB 支持 SHOW GLOBAL STATUS LIKE 'wsrep%' 查看 Galera Cluster 状态
  • MariaDB 提供了 mariadb-admin 命令,类似于 mysqladmin

附录:常用状态检查命令

全局状态检查

sql
-- 查看连接状态
SHOW GLOBAL STATUS LIKE 'Connections';
SHOW GLOBAL STATUS LIKE 'Threads%';

-- 查看查询性能
SHOW GLOBAL STATUS LIKE 'Queries';
SHOW GLOBAL STATUS LIKE 'Slow_queries';
SHOW GLOBAL STATUS LIKE 'Select%';

-- 查看缓存状态
SHOW GLOBAL STATUS LIKE 'Qcache%';
SHOW GLOBAL STATUS LIKE 'Key%';

-- 查看 InnoDB 状态
SHOW GLOBAL STATUS LIKE 'Innodb%';

-- 查看复制状态
SHOW GLOBAL STATUS LIKE 'Slave%';

-- 查看 Galera Cluster 状态
SHOW GLOBAL STATUS LIKE 'wsrep%';

配置参数检查

sql
-- 查看连接配置
SHOW GLOBAL VARIABLES LIKE 'max_connections';
SHOW GLOBAL VARIABLES LIKE 'wait_timeout';

-- 查看 InnoDB 配置
SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW GLOBAL VARIABLES LIKE 'innodb_log_file_size';

-- 查看日志配置
SHOW GLOBAL VARIABLES LIKE 'log_bin';
SHOW GLOBAL VARIABLES LIKE 'slow_query_log';
SHOW GLOBAL VARIABLES LIKE 'long_query_time';

-- 查看字符集配置
SHOW GLOBAL VARIABLES LIKE 'character_set%';
SHOW GLOBAL VARIABLES LIKE 'collation%';

进程和查询检查

sql
-- 查看所有进程
SHOW FULL PROCESSLIST;

-- 查看正在执行的查询
SELECT * FROM information_schema.PROCESSLIST WHERE COMMAND = 'Query';

-- 查看慢查询
SHOW GLOBAL STATUS LIKE 'Slow_queries';

-- 查看当前会话的查询
SHOW SESSION STATUS LIKE 'Last_query_cost';

存储引擎检查

sql
-- 查看 InnoDB 状态
SHOW ENGINE INNODB STATUS\G

-- 查看 MyISAM 状态
SHOW ENGINE MYISAM STATUS\G

-- 查看所有存储引擎
SHOW ENGINES;

表和索引检查

sql
-- 查看表状态
SHOW TABLE STATUS LIKE 'table_name';

-- 查看索引信息
SHOW INDEX FROM table_name;

-- 查看打开的表
SHOW OPEN TABLES;

-- 检查表
CHECK TABLE table_name;

-- 优化表
OPTIMIZE TABLE table_name;

-- 分析表
ANALYZE TABLE table_name;