1. 首页 > MySQL教程 > 正文

MySQL教程FG263-MySQL遥测配置与使用

本文档风哥主要介绍MySQL遥测功能的配置与使用,包括Performance Schema、Sys Schema、指标收集、告警配置等内容,风哥教程参考MySQL官方文档Telemetry章节,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 MySQL遥测概述

MySQL遥测是指MySQL提供的监控和诊断功能,用于收集数据库运行时的各种指标和事件数据:

# MySQL遥测概述

1. 遥测功能组件

主要组件:
– Performance Schema:性能数据收集
– Sys Schema:便捷视图和存储过程
– Information Schema:元数据查询
– Slow Query Log:慢查询日志
– Error Log:错误日志
– General Log:通用查询日志

遥测架构:
+——————-+
| MySQL Server |
+——————-+
|
v
+——————-+ +——————-+
| Performance | | Information |
| Schema | | Schema |
+——————-+ +——————-+
| |
v v
+——————-+ +——————-+
| Sys Schema | | 日志文件 |
+——————-+ +——————-+

2. Performance Schema概述

Performance Schema特点:
– 低开销监控
– 实时数据收集
– 细粒度事件跟踪
– 无需修改应用
– 自动启用

查看Performance Schema状态:
mysql> SHOW VARIABLES LIKE ‘performance_schema’;

输出示例:
+——————–+——-+
| Variable_name | Value |
+——————–+——-+
| performance_schema | ON |
+——————–+——-+

3. Sys Schema概述

Sys Schema特点:
– 基于Performance Schema
– 易读的视图
– 便捷的存储过程
– 格式化输出
– DBA友好

查看Sys Schema:
mysql> SHOW DATABASES LIKE ‘sys’;

输出示例:
+—————-+
| Database (sys) |
+—————-+
| sys |
+—————-+

4. 遥测数据类型

等待事件:
– 等待类型:IO、锁、条件等
– 等待时间:延迟统计
– 等待次数:频率统计

语句事件:
– SQL语句执行
– 语句延迟
– 错误统计

阶段事件:
– 语句执行阶段
– 阶段进度
– 阶段时间

事务事件:
– 事务生命周期
– 锁等待
– 提交/回滚

内存事件:
– 内存分配
– 内存使用
– 内存泄漏

文件I/O事件:
– 文件读写
– I/O延迟
– I/O吞吐

5. 遥测开销评估

查看Performance Schema开销:
mysql> SELECT * FROM performance_schema.performance_timers;

输出示例:
+————-+—————–+———————-+—————-+
| TIMER_NAME | TIMER_FREQUENCY | TIMER_RESOLUTION | TIMER_OVERHEAD |
+————-+—————–+———————-+—————-+
| CYCLE | 2389029850 | 1 | 72 |
| NANOSECOND | 1000000000 | 1 | 112 |
| MICROSECOND | 1000000 | 1 | 136 |
| MILLISECOND | 1036 | 1000 | 168 |
+————-+—————–+———————-+—————-+

1.2 Performance Schema

Performance Schema是MySQL遥测的核心组件,提供详细的性能数据收集:

# Performance Schema详解

1. Performance Schema表结构

查看所有Performance Schema表:
mysql> SHOW TABLES FROM performance_schema;

输出示例:
+——————————————————+
| Tables_in_performance_schema |
+——————————————————+
| accounts |
| cond_instances |
| data_locks |
| events_stages_current |
| events_statements_current |
| events_statements_history |
| events_statements_summary_by_digest |
| events_waits_current |
| file_instances |
| file_summary_by_instance |
| memory_summary_global_by_event_name |
| setup_consumers |
| setup_instruments |
| threads |
+——————————————————+

2. 当前事件表

查看当前语句事件:
mysql> SELECT THREAD_ID, EVENT_ID, EVENT_NAME, TIMER_WAIT/1000000 AS WAIT_MS,
SQL_TEXT
FROM performance_schema.events_statements_current
WHERE SQL_TEXT IS NOT NULL;

输出示例:
+———–+———-+—————————+———-+—————————–+
| THREAD_ID | EVENT_ID | EVENT_NAME | WAIT_MS | SQL_TEXT |
+———–+———-+—————————+———-+—————————–+
| 25 | 6 | statement/sql/select | 123.45 | SELECT * FROM users LIMIT 10|
+———–+———-+—————————+———-+—————————–+

3. 历史事件表

查看历史等待事件:
mysql> SELECT EVENT_NAME, COUNT(*) AS COUNT,
SUM(TIMER_WAIT)/1000000000 AS TOTAL_SEC
FROM performance_schema.events_waits_history_long
GROUP BY EVENT_NAME
ORDER BY TOTAL_SEC DESC
LIMIT 10;

输出示例:
+———————————————-+——-+————+
| EVENT_NAME | COUNT | TOTAL_SEC |
+———————————————-+——-+————+
| wait/io/file/innodb/innodb_data_file | 1234 | 12.56 |
| wait/io/file/innodb/innodb_log_file | 567 | 5.23 |
| wait/lock/table/sql/handler | 234 | 2.34 |
+———————————————-+——-+————+

4. 汇总表

按语句摘要汇总:
mysql> SELECT DIGEST, DIGEST_TEXT, COUNT_STAR,
SUM_TIMER_WAIT/1000000000 AS TOTAL_SEC
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;

输出示例:
+——————————————————————+——————————–+————+————+
| DIGEST | DIGEST_TEXT | COUNT_STAR | TOTAL_SEC |
+——————————————————————+——————————–+————+————+
| a1b2c3d4e5f6… | SELECT * FROM `orders` WHERE…| 12345 | 123.45 |
| b2c3d4e5f6g7… | INSERT INTO `logs` VALUES… | 23456 | 98.76 |
+——————————————————————+——————————–+————+————+

5. 文件I/O统计

查看文件I/O汇总:
mysql> SELECT FILE_NAME, COUNT_READ, COUNT_WRITE,
SUM_NUMBER_OF_BYTES_READ/1024/1024 AS READ_MB,
SUM_NUMBER_OF_BYTES_WRITE/1024/1024 AS WRITE_MB
FROM performance_schema.file_summary_by_instance
ORDER BY SUM_NUMBER_OF_BYTES_READ + SUM_NUMBER_OF_BYTES_WRITE DESC
LIMIT 10;

输出示例:
+—————————————-+————+————-+———-+———–+
| FILE_NAME | COUNT_READ | COUNT_WRITE | READ_MB | WRITE_MB |
+—————————————-+————+————-+———-+———–+
| /var/lib/mysql/ibdata1 | 5678 | 1234 | 1234.5 | 567.8 |
| /var/lib/mysql/ib_logfile0 | 1234 | 5678 | 567.8 | 1234.5 |
+—————————————-+————+————-+———-+———–+

6. 内存使用统计

查看内存使用:
mysql> SELECT EVENT_NAME, CURRENT_NUMBER_OF_BYTES_USED/1024/1024 AS USED_MB,
HIGH_NUMBER_OF_BYTES_USED/1024/1024 AS HIGH_MB
FROM performance_schema.memory_summary_global_by_event_name
WHERE CURRENT_NUMBER_OF_BYTES_USED > 0
ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC
LIMIT 10;

输出示例:
+——————————————-+———-+———-+
| EVENT_NAME | USED_MB | HIGH_MB |
+——————————————-+———-+———-+
| memory/innodb/buf_buf_pool | 1024.5 | 1024.5 |
| memory/innodb/log_buffer_memory | 64.0 | 64.0 |
| memory/sql/THD::main_mem_root | 12.5 | 25.0 |
+——————————————-+———-+———-+

1.3 Sys Schema

Sys Schema提供了更易用的视图和存储过程来分析Performance Schema数据:

# Sys Schema详解

1. 进程列表视图

查看进程列表:
mysql> SELECT * FROM sys.processlist;

输出示例:
+—-+——+———–+—————-+———+——+———–+———————————+
| ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |
+—-+——+———–+—————-+———+——+———–+———————————+
| 5 | root | localhost | production_db | Query | 0 | executing | SELECT * FROM sys.processlist |
| 8 | app | 10.0.2.10 | production_db | Sleep | 45 | | NULL |
+—-+——+———–+—————-+———+——+———–+———————————+

2. 语句分析视图

查看语句分析:
mysql> SELECT query, db, exec_count, total_latency, avg_latency
FROM sys.statement_analysis LIMIT 5;

输出示例:
+——————————–+—————-+————+—————+————-+
| query | db | exec_count | total_latency | avg_latency |
+——————————–+—————-+————+—————+————-+
| SELECT * FROM `orders` WHERE…| production_db | 12345 | 00:02:03.45 | 10.00 ms |
| INSERT INTO `logs` VALUES… | production_db | 23456 | 00:01:38.76 | 4.21 ms |
+——————————–+—————-+————+—————+————-+

3. 表统计视图

查看表统计:
mysql> SELECT table_schema, table_name, rows_fetched, rows_inserted
FROM sys.schema_table_statistics
WHERE table_schema = ‘production_db’
LIMIT 5;

输出示例:
+—————-+————-+————+—————-+
| table_schema | table_name | rows_fetched| rows_inserted |
+—————-+————-+————+—————-+
| production_db | orders | 1234567 | 123456 |
| production_db | users | 567890 | 12345 |
+—————-+————-+————+—————-+

4. 未使用索引视图

查看未使用的索引:
mysql> SELECT * FROM sys.schema_unused_indexes;

输出示例:
+—————-+————-+—————-+
| object_schema | object_name | index_name |
+—————-+————-+—————-+
| production_db | orders | idx_old_status |
| production_db | users | idx_old_email |
+—————-+————-+—————-+

5. 全表扫描视图

查看全表扫描:
mysql> SELECT * FROM sys.schema_tables_with_full_table_scans;

输出示例:
+—————-+————-+——————-+———————+
| object_schema | object_name | rows_full_scanned | latency |
+—————-+————-+——————-+———————+
| production_db | logs | 12345678 | 00:05:23.45 |
+—————-+————-+——————-+———————+

6. 内存使用视图

查看内存使用:
mysql> SELECT event_name, current_count, current_alloc
FROM sys.memory_global_by_current_bytes
LIMIT 10;

输出示例:
+——————————————-+————-+—————+
| event_name | current_count| current_alloc |
+——————————————-+————-+—————+
| memory/innodb/buf_buf_pool | 1| 1.00 GiB |
| memory/innodb/log_buffer_memory | 1| 64.00 MiB |
| memory/sql/THD::main_mem_root | 25| 12.50 MiB |
+——————————————-+————-+—————+

Part02-生产环境规划与建议

2.1 遥测规划

在生产环境中使用遥测功能需要进行合理规划:

# 遥测规划

1. 遥测需求分析

监控需求:
– 性能监控:响应时间、吞吐量
– 资源监控:CPU、内存、磁盘I/O
– 连接监控:连接数、连接状态
– 错误监控:错误率、异常情况

分析需求:
– 慢查询分析
– 锁等待分析
– 内存使用分析
– 索引使用分析

2. Performance Schema配置规划

配置参数:
# 在my.cnf中配置
[mysqld]
performance_schema = ON

# 消费者配置
performance-schema-consumer-events-statements-current = ON
performance-schema-consumer-events-statements-history = ON
performance-schema-consumer-events-waits-current = ON

内存配置:
# 历史表大小
performance-schema-events-waits-history-long-size = 10000
performance-schema-events-statements-history-long-size = 10000

3. 日志配置规划

慢查询日志配置:
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = ON

4. 监控指标规划

关键指标:
– QPS(每秒查询数)
– TPS(每秒事务数)
– 连接数
– 缓冲池命中率
– 锁等待时间
– 慢查询数量

5. 告警阈值规划

性能告警阈值:
– 慢查询率 > 5%
– 缓冲池命中率 < 95% - 连接使用率 > 80%
– 锁等待时间 > 5秒

2.2 仪器配置

仪器(Instrumentation)是Performance Schema收集数据的基础:

# 仪器配置

1. 查看仪器配置

查看所有仪器:
mysql> SELECT NAME, ENABLED, TIMED
FROM performance_schema.setup_instruments
LIMIT 10;

输出示例:
+—————————————————+———+——-+
| NAME | ENABLED | TIMED |
+—————————————————+———+——-+
| wait/synch/mutex/sql/TC_LOG_MMAP::LOCK_tc | NO | NO |
| wait/io/file/sql/binlog | YES | YES |
| wait/io/file/innodb/innodb_data_file | YES | YES |
| statement/sql/select | YES | YES |
+—————————————————+———+——-+

2. 启用/禁用仪器

启用特定仪器:
mysql> UPDATE performance_schema.setup_instruments
SET ENABLED = ‘YES’, TIMED = ‘YES’
WHERE NAME = ‘wait/io/file/innodb/innodb_data_file’;

输出示例:
Query OK, 1 row affected (0.00 sec)

启用所有等待仪器:
mysql> UPDATE performance_schema.setup_instruments
SET ENABLED = ‘YES’, TIMED = ‘YES’
WHERE NAME LIKE ‘wait/%’;

输出示例:
Query OK, 234 rows affected (0.01 sec)

3. 仪器分类

等待事件仪器:
– wait/io/file:文件I/O等待
– wait/io/socket:Socket I/O等待
– wait/lock:锁等待
– wait/synch:同步等待

语句事件仪器:
– statement/sql:SQL语句
– statement/sp:存储过程

内存事件仪器:
– memory/%:内存分配

4. 仪器配置示例

配置文件方式:
[mysqld]
performance-schema-instrument = ‘wait/%=ON’
performance-schema-instrument = ‘statement/%=ON’
performance-schema-instrument = ‘wait/synch/mutex/%=OFF’

运行时配置:
mysql> CALL sys.ps_setup_enable_instrument(‘wait/io/file/innodb/%’);

输出示例:
+———————–+
| summary |
+———————–+
| Enabled 5 instruments |
+———————–+

2.3 消费者配置

消费者(Consumer)决定哪些数据被存储和汇总:

# 消费者配置

1. 查看消费者配置

查看所有消费者:
mysql> SELECT * FROM performance_schema.setup_consumers;

输出示例:
+———————————-+———+
| NAME | ENABLED |
+———————————-+———+
| events_statements_current | YES |
| events_statements_history | YES |
| events_statements_history_long | NO |
| events_waits_current | NO |
| events_waits_history | NO |
| global_instrumentation | YES |
| thread_instrumentation | YES |
| statements_digest | YES |
+———————————-+———+

2. 启用/禁用消费者

启用消费者:
mysql> UPDATE performance_schema.setup_consumers
SET ENABLED = ‘YES’
WHERE NAME = ‘events_statements_history_long’;

输出示例:
Query OK, 1 row affected (0.00 sec)

启用所有历史消费者:
mysql> UPDATE performance_schema.setup_consumers
SET ENABLED = ‘YES’
WHERE NAME LIKE ‘%history%’;

输出示例:
Query OK, 6 rows affected (0.00 sec)

3. 消费者层级关系

消费者层级:
global_instrumentation
└── thread_instrumentation
├── events_waits_current
│ ├── events_waits_history
│ └── events_waits_history_long
├── events_statements_current
│ ├── events_statements_history
│ └── events_statements_history_long
└── events_transactions_current
├── events_transactions_history
└── events_transactions_history_long

4. 消费者配置示例

配置文件方式:
[mysqld]
performance-schema-consumer-events-statements-current = ON
performance-schema-consumer-events-statements-history = ON
performance-schema-consumer-events-statements-history-long = ON

运行时配置:
mysql> CALL sys.ps_setup_enable_consumer(‘events_statements_%’);

输出示例:
+———————-+
| summary |
+———————-+
| Enabled 3 consumers |
+———————-+

Part03-生产环境项目实施方案

3.1 遥测配置实施

以下是MySQL遥测功能的配置实施方案:

# 遥测配置实施

1. Performance Schema配置

配置文件:
vim /etc/my.cnf

添加配置:
[mysqld]
performance_schema = ON

# 消费者配置
performance-schema-consumer-events-statements-current = ON
performance-schema-consumer-events-statements-history = ON
performance-schema-consumer-events-statements-history-long = ON
performance-schema-consumer-events-waits-current = ON

# 历史表大小
performance-schema-events-waits-history-long-size = 10000
performance-schema-events-statements-history-long-size = 10000

重启MySQL:
systemctl restart mysqld

输出示例:
MySQL service restarted successfully.

2. 仪器配置脚本

创建配置脚本:
vim /opt/mysql/scripts/configure_telemetry.sql

脚本内容:
UPDATE performance_schema.setup_instruments
SET ENABLED = ‘YES’, TIMED = ‘YES’
WHERE NAME LIKE ‘wait/io/%’;

UPDATE performance_schema.setup_instruments
SET ENABLED = ‘YES’, TIMED = ‘YES’
WHERE NAME LIKE ‘statement/%’;

UPDATE performance_schema.setup_consumers
SET ENABLED = ‘YES’;

执行脚本:
mysql -u root -p < /opt/mysql/scripts/configure_telemetry.sql 输出示例: Query OK, 0 rows affected (0.00 sec) 3. 慢查询日志配置 配置文件: [mysqld] slow_query_log = ON slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 log_queries_not_using_indexes = ON 创建日志目录: mkdir -p /var/log/mysql chown mysql:mysql /var/log/mysql 验证配置: mysql> SHOW VARIABLES LIKE ‘slow_query%’;

输出示例:
+———————+————————–+
| Variable_name | Value |
+———————+————————–+
| slow_query_log | ON |
| slow_query_log_file | /var/log/mysql/slow.log |
+———————+————————–+

3.2 指标收集

以下是MySQL遥测指标的收集方法:

# 指标收集

1. 性能指标收集

收集QPS和TPS:
mysql> SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM performance_schema.global_status
WHERE VARIABLE_NAME IN (‘Questions’, ‘Com_commit’, ‘Uptime’);

输出示例:
+—————+—————-+
| VARIABLE_NAME | VARIABLE_VALUE |
+—————+—————-+
| Questions | 12345678 |
| Com_commit | 1234567 |
| Uptime | 86400 |
+—————+—————-+

计算QPS:
mysql> SELECT VARIABLE_VALUE / (
SELECT VARIABLE_VALUE
FROM performance_schema.global_status
WHERE VARIABLE_NAME = ‘Uptime’
) AS QPS
FROM performance_schema.global_status
WHERE VARIABLE_NAME = ‘Questions’;

输出示例:
+———–+
| QPS |
+———–+
| 142.89 |
+———–+

2. 连接指标收集

收集连接信息:
mysql> SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM performance_schema.global_status
WHERE VARIABLE_NAME IN (‘Threads_connected’, ‘Threads_running’);

输出示例:
+——————-+—————-+
| VARIABLE_NAME | VARIABLE_VALUE |
+——————-+—————-+
| Threads_connected | 45 |
| Threads_running | 12 |
+——————-+—————-+

3. InnoDB指标收集

收集缓冲池信息:
mysql> SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM performance_schema.global_status
WHERE VARIABLE_NAME LIKE ‘Innodb_buffer_pool%’;

输出示例:
+—————————————+—————-+
| VARIABLE_NAME | VARIABLE_VALUE |
+—————————————+—————-+
| Innodb_buffer_pool_pages_total | 65536 |
| Innodb_buffer_pool_pages_data | 52428 |
| Innodb_buffer_pool_read_requests | 12345678 |
| Innodb_buffer_pool_reads | 12345 |
+—————————————+—————-+

计算缓冲池命中率:
mysql> SELECT (1 – (
SELECT VARIABLE_VALUE
FROM performance_schema.global_status
WHERE VARIABLE_NAME = ‘Innodb_buffer_pool_reads’
) / (
SELECT VARIABLE_VALUE
FROM performance_schema.global_status
WHERE VARIABLE_NAME = ‘Innodb_buffer_pool_read_requests’
)) * 100 AS BufferPoolHitRate;

输出示例:
+——————-+
| BufferPoolHitRate |
+——————-+
| 99.90 |
+——————-+

4. 慢查询指标收集

收集慢查询统计:
mysql> SELECT DIGEST_TEXT, COUNT_STAR,
SUM_TIMER_WAIT/1000000000 AS TOTAL_SEC,
AVG_TIMER_WAIT/1000000 AS AVG_MS
FROM performance_schema.events_statements_summary_by_digest
WHERE SUM_TIMER_WAIT > 1000000000
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;

输出示例:
+——————————–+————+————+——–+
| DIGEST_TEXT | COUNT_STAR | TOTAL_SEC | AVG_MS |
+——————————–+————+————+——–+
| SELECT * FROM `orders` WHERE…| 12345 | 123.45 | 10.00 |
| INSERT INTO `logs` VALUES… | 23456 | 98.76 | 4.21 |
+——————————–+————+————+——–+

5. 自动化指标收集脚本

创建收集脚本:
vim /opt/mysql/scripts/collect_metrics.sh

脚本内容:
#!/bin/bash
MYSQL_USER=”monitor”
MYSQL_PASS=”********”
OUTPUT_DIR=”/var/log/mysql/metrics”

mkdir -p $OUTPUT_DIR
DATE=$(date +%Y%m%d_%H%M%S)
OUTPUT_FILE=”$OUTPUT_DIR/metrics_$DATE.log”

mysql -u $MYSQL_USER -p$MYSQL_PASS -e ”
SELECT NOW() AS timestamp;
SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM performance_schema.global_status
WHERE VARIABLE_NAME IN (‘Questions’, ‘Threads_connected’);
” > $OUTPUT_FILE

设置定时任务:
crontab -e

添加内容:
* * * * * /opt/mysql/scripts/collect_metrics.sh

输出示例:
crontab: installing new crontab

3.3 告警配置

以下是MySQL遥测告警的配置方法:

# 告警配置

1. 告警脚本创建

创建告警检查脚本:
vim /opt/mysql/scripts/check_alerts.sh

脚本内容:
#!/bin/bash
MYSQL_USER=”monitor”
MYSQL_PASS=”********”
ALERT_EMAIL=”dba@company.com”

# 检查慢查询率
SLOW_RATE=$(mysql -u $MYSQL_USER -p$MYSQL_PASS -N -e ”
SELECT COUNT(*) * 100.0 / (
SELECT COUNT(*)
FROM performance_schema.events_statements_summary_by_digest
)
FROM performance_schema.events_statements_summary_by_digest
WHERE AVG_TIMER_WAIT > 2000000
“)

if (( $(echo “$SLOW_RATE > 5” | bc -l) )); then
echo “ALERT: Slow query rate is $SLOW_RATE%” | mail -s “MySQL Alert” $ALERT_EMAIL
fi

设置执行权限:
chmod +x /opt/mysql/scripts/check_alerts.sh

2. 告警定时任务

配置定时任务:
crontab -e

添加内容:
*/5 * * * * /opt/mysql/scripts/check_alerts.sh

输出示例:
crontab: installing new crontab

3. 告警日志记录

创建告警日志:
vim /opt/mysql/scripts/log_alerts.sh

脚本内容:
#!/bin/bash
LOG_FILE=”/var/log/mysql/alerts.log”

log_alert() {
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – $1” >> $LOG_FILE
}

log_alert “Alert check completed”

Part04-生产案例与实战讲解

4.1 性能分析案例

以下是使用遥测功能进行性能分析的实战案例:

# 性能分析案例

# 案例1:分析慢查询

# 步骤1:识别慢查询
mysql> SELECT DIGEST_TEXT, COUNT_STAR,
SUM_TIMER_WAIT/1000000000 AS TOTAL_SEC,
AVG_TIMER_WAIT/1000000 AS AVG_MS
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;

# 输出示例:
+——————————–+————+————+——–+
| DIGEST_TEXT | COUNT_STAR | TOTAL_SEC | AVG_MS |
+——————————–+————+————+——–+
| SELECT * FROM `orders` WHERE…| 12345 | 123.45 | 10.00 |
+——————————–+————+————+——–+

# 步骤2:分析查询执行计划
mysql> EXPLAIN SELECT * FROM orders WHERE status = ‘pending’\G

# 输出示例:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: orders
type: ALL
possible_keys: idx_status
key: NULL
rows: 1000000
Extra: Using where

# 步骤3:创建索引优化
mysql> CREATE INDEX idx_status_created ON orders(status, created_at);

# 输出示例:
Query OK, 0 rows affected (12.34 sec)

# 案例2:分析锁等待

# 步骤1:识别锁等待
mysql> SELECT OBJECT_SCHEMA, OBJECT_NAME, LOCK_TYPE, LOCK_MODE,
THREAD_ID, PROCESSLIST_ID
FROM performance_schema.data_locks
WHERE LOCK_STATUS = ‘PENDING’;

# 输出示例:
+—————+————-+———–+———–+———–+————–+
| OBJECT_SCHEMA | OBJECT_NAME | LOCK_TYPE | LOCK_MODE | THREAD_ID | PROCESSLIST_ID|
+—————+————-+———–+———–+———–+————–+
| production_db | orders | RECORD | X | 30 | 10|
+—————+————-+———–+———–+———–+————–+

# 步骤2:查找阻塞会话
mysql> SELECT r.THREAD_ID AS waiting_thread,
b.THREAD_ID AS blocking_thread
FROM performance_schema.threads r
JOIN performance_schema.data_lock_waits w
ON r.THREAD_ID = w.REQUESTING_THREAD_ID
JOIN performance_schema.threads b
ON w.BLOCKING_THREAD_ID = b.THREAD_ID;

# 输出示例:
+—————-+—————–+
| waiting_thread | blocking_thread |
+—————-+—————–+
| 30 | 25 |
+—————-+—————–+

# 案例3:分析内存使用

# 步骤1:查看内存使用分布
mysql> SELECT EVENT_NAME,
CURRENT_NUMBER_OF_BYTES_USED/1024/1024 AS USED_MB
FROM performance_schema.memory_summary_global_by_event_name
WHERE CURRENT_NUMBER_OF_BYTES_USED > 0
ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC
LIMIT 10;

# 输出示例:
+——————————————-+———-+
| EVENT_NAME | USED_MB |
+——————————————-+———-+
| memory/innodb/buf_buf_pool | 1024.5 |
| memory/innodb/log_buffer_memory | 64.0 |
+——————————————-+———-+

4.2 故障排查案例

以下是使用遥测功能进行故障排查的实战案例:

# 故障排查案例

# 案例1:排查连接超时问题

# 步骤1:检查连接状态
mysql> SELECT STATE, COUNT(*) AS COUNT
FROM performance_schema.threads
WHERE PROCESSLIST_ID IS NOT NULL
GROUP BY STATE;

# 输出示例:
+——————-+——-+
| STATE | COUNT |
+——————-+——-+
| executing | 5 |
| Sending data | 3 |
| Sleeping | 40 |
+——————-+——-+

# 案例2:排查磁盘I/O瓶颈

# 步骤1:检查文件I/O统计
mysql> SELECT FILE_NAME, COUNT_READ, COUNT_WRITE,
SUM_NUMBER_OF_BYTES_READ/1024/1024 AS READ_MB
FROM performance_schema.file_summary_by_instance
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;

# 输出示例:
+—————————————-+————+————-+———-+
| FILE_NAME | COUNT_READ | COUNT_WRITE | READ_MB |
+—————————————-+————+————-+———-+
| /var/lib/mysql/ibdata1 | 5678 | 1234 | 1234.5 |
+—————————————-+————+————-+———-+

# 案例3:排查死锁问题

# 步骤1:查看死锁信息
mysql> SHOW ENGINE INNODB STATUS\G

# 输出示例:

————————
LATEST DETECTED DEADLOCK
————————
TRANSACTION 12345, ACTIVE 5 sec
UPDATE orders SET status = ‘processing’ WHERE id = 1

4.3 优化建议案例

以下是基于遥测数据提供优化建议的实战案例:

# 优化建议案例

# 案例1:索引优化建议

# 步骤1:识别未使用的索引
mysql> SELECT * FROM sys.schema_unused_indexes;

# 输出示例:
+—————-+————-+—————-+
| object_schema | object_name | index_name |
+—————-+————-+—————-+
| production_db | orders | idx_old_status |
+—————-+————-+—————-+

# 步骤2:删除未使用的索引
mysql> ALTER TABLE production_db.orders DROP INDEX idx_old_status;

# 输出示例:
Query OK, 0 rows affected (0.05 sec)

# 案例2:查询优化建议

# 步骤1:识别全表扫描
mysql> SELECT * FROM sys.schema_tables_with_full_table_scans;

# 输出示例:
+—————-+————-+——————-+
| object_schema | object_name | rows_full_scanned |
+—————-+————-+——————-+
| production_db | logs | 12345678 |
+—————-+————-+——————-+

# 步骤2:创建索引
mysql> CREATE INDEX idx_created_at ON logs(created_at);

# 输出示例:
Query OK, 0 rows affected (15.23 sec)

# 案例3:配置优化建议

# 步骤1:分析缓冲池使用
mysql> SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM performance_schema.global_status
WHERE VARIABLE_NAME LIKE ‘Innodb_buffer_pool%’;

# 输出示例:
+—————————————+—————-+
| VARIABLE_NAME | VARIABLE_VALUE |
+—————————————+—————-+
| Innodb_buffer_pool_pages_free | 36 |
| Innodb_buffer_pool_read_requests | 12345678 |
| Innodb_buffer_pool_reads | 1234567 |
+—————————————+—————-+

# 步骤2:调整配置
mysql> SET GLOBAL innodb_buffer_pool_size = 21474836480;

# 输出示例:
Query OK, 0 rows affected (0.00 sec)

Part05-风哥经验总结与分享

5.1 遥测最佳实践

以下是MySQL遥测的最佳实践建议:

# 遥测最佳实践

1. Performance Schema最佳实践

– 启用必要的仪器和消费者
– 定期清理历史数据
– 监控Performance Schema自身开销
– 使用Sys Schema简化查询

2. 监控最佳实践

– 建立监控基线
– 设置合理的告警阈值
– 定期审查监控指标
– 保留历史数据用于趋势分析

3. 分析最佳实践

– 优先分析高影响问题
– 结合多种数据源
– 建立问题排查流程
– 记录优化历史

4. 性能最佳实践

– 避免过度监控
– 定期优化遥测配置
– 使用采样减少开销
– 合理设置历史表大小

5.2 遥测工具集成

以下是将MySQL遥测与第三方工具集成的方法:

# 遥测工具集成

1. Prometheus集成

安装MySQL Exporter:
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gz
tar -xzf mysqld_exporter-0.15.0.linux-amd64.tar.gz

配置数据源:
export DATA_SOURCE_NAME=’monitor:password@(localhost:3306)/’

启动Exporter:
./mysqld_exporter

输出示例:
ts=2026-04-01T12:00:00.000Z caller=mysqld_exporter.go:72 level=info msg=”Starting mysqld_exporter”
ts=2026-04-01T12:00:00.000Z caller=mysqld_exporter.go:73 level=info msg=”Listening on :9104″

2. Grafana集成

配置数据源:
1. 登录Grafana
2. 添加数据源 -> Prometheus
3. 输入URL: http://prometheus:9090
4. 保存并测试

导入Dashboard:
1. 导入 -> 输入Dashboard ID: 7362
2. 选择数据源
3. 导入

3. PMM集成

安装PMM Client:
wget https://downloads.percona.com/downloads/pmm2/2.38.0/binary/tarball/pmm2-client-2.38.0.tar.gz
tar -xzf pmm2-client-2.38.0.tar.gz

配置PMM:
pmm-admin config –server-insecure-tls –server-url=https://admin:admin@pmm-server:443

添加MySQL实例:
pmm-admin add mysql –username=monitor –password=********

输出示例:
MySQL Service added.
Service ID : /service_id/xxxxxxxx
Service name: mysql

5.3 遥测性能调优

以下是遥测性能调优的方法:

# 遥测性能调优

1. 减少遥测开销

禁用不必要的仪器:
mysql> UPDATE performance_schema.setup_instruments
SET ENABLED = ‘NO’
WHERE NAME LIKE ‘wait/synch/mutex/%’;

输出示例:
Query OK, 123 rows affected (0.01 sec)

减少历史表大小:
[mysqld]
performance-schema-events-waits-history-long-size = 1000
performance-schema-events-statements-history-long-size = 1000

2. 优化遥测配置

只启用关键仪器:
mysql> UPDATE performance_schema.setup_instruments
SET ENABLED = ‘NO’;

mysql> UPDATE performance_schema.setup_instruments
SET ENABLED = ‘YES’, TIMED = ‘YES’
WHERE NAME IN (
‘statement/sql/select’,
‘statement/sql/insert’,
‘statement/sql/update’,
‘statement/sql/delete’
);

输出示例:
Query OK, 4 rows affected (0.00 sec)

3. 监控遥测开销

查看Performance Schema内存使用:
mysql> SELECT EVENT_NAME, CURRENT_NUMBER_OF_BYTES_USED/1024/1024 AS USED_MB
FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME LIKE ‘memory/performance_schema%’
ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC;

输出示例:
+——————————————-+———-+
| EVENT_NAME | USED_MB |
+——————————————-+———-+
| memory/performance_schema/events_waits | 50.0 |
| memory/performance_schema/events_statements| 30.0 |
+——————————————-+———-+

风哥提示:MySQL遥测功能是数据库性能监控和故障排查的重要工具。Performance Schema提供了丰富的性能数据,但需要注意配置合理的仪器和消费者以避免过度开销。Sys Schema大大简化了性能分析工作,建议DBA熟练掌握。在生产环境中,建议将遥测数据与监控系统集成,实现自动化告警和趋势分析。更多视频教程请访问www.fgedu.net.cn

注意:本文档内容基于MySQL 8.4官方文档编写,适合DBA人员在学习和测试中使用。在生产环境中应用时,请务必进行充分的测试和验证。遥测功能会产生一定的性能开销,需要根据实际情况平衡监控粒度和性能影响。文档中的命令和配置可能因MySQL版本不同而有所差异,请根据实际情况进行调整。

GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息