16_MySQL 运维监控与管理工具 —— MySQL Enterprise Monitor / ProxySQL / 中间件(对标 EMCC)
系列定位:《MySQL 数据库全栈运维实战系列》第 16 篇,与《Oracle 数据库全栈运维实战系列(VMware 版)》同构对标(Oracle 16 EMCC:Enterprise Manager Cloud Control 集中纳管与深度诊断)。适用版本:MySQL 8.0(5.7 差异随文标注)。官方文档:MySQL Enterprise Monitor、ProxySQL 官方文档、MySQL Routers / ShardingSphere。
一、管理工具体系全景

图 1

图 2
| 工具 | 定位 | 类比 Oracle EMCC | 开源/商业 |
|---|---|---|---|
| MySQL Enterprise Monitor (MEM) | 集中纳管、Advisor 建议、Query Analyzer | EMCC(深度诊断+纳管) | 商业(企业版) |
| ProxySQL | 高性能 SQL 代理、读写分离、查询路由、缓存 | Listener + 连接池 + 路由 | 开源 |
| MySQL Router | InnoDB Cluster 配套路由 | SCAN 服务 | 开源 |
| ShardingSphere / MyCat | 分库分表中间件(番外-02 详解) | — | 开源 |
双轨定位(与 Oracle 16 同构):MEM 管"深度诊断 + 集中纳管"(对应 EMCC 的 Advisor/AWR 中心);Prometheus+Grafana 管"秒级实时告警"(第 17 篇);ProxySQL 管"连接与流量路由"。三者互补,EMCC 在 MySQL 侧的对应物就是 MEM + 可观测体系。
二、MySQL Enterprise Monitor(MEM)—— 对标 EMCC

图 3
| 能力 | 说明 | 类比 EMCC |
|---|---|---|
| 实例纳管 | 一次管理多个 MySQL 实例/集群 | EMCC Target 纳管 |
| Query Analyzer | 实时抓取 SQL、执行计划、耗时排行 | SQL Performance Center |
| Advisors | 内建数百条健康/安全/复制建议 | Advisor / ADDM |
| 自动备份巡检 | 备份状态、复制延迟告警 | EM 备份巡检 |
| 可视化仪表盘 | 实例状态、吞吐、连接趋势 | EM 控制台 |
VMware 注意事项:MEM 自身需要一个仓库库(repository),建议独立一台虚机(4C8G 起步),不要和被监控的业务库同机——否则 MEM 出问题会拖垮生产(这正是 Oracle 16 踩坑"资料库与目标同库"的同款教训)。MEM 仓库库会持续存储 SQL 审计数据,磁盘要预留 100G+。
-- MEM 纳管时在目标库建监控账号(解释:只读 + 审计抓取权限)
CREATE USER 'mem_user'@'%' IDENTIFIED BY 'Mem@Pass2026';
GRANT SELECT, SUPER, REPLICATION CLIENT ON *.* TO 'mem_user'@'%';
MEM 为商业组件,安装走 MySQL 企业版仓库;本篇以"对标 EMCC 的能力地图"为主,实际部署以官方 Enterprise Monitor 安装指南为准。
三、ProxySQL:高性能 SQL 代理(核心实操)

图 4
ProxySQL 是开源、支持 MySQL 协议的中间层代理,把应用的连接收拢,按规则把读打到从库、写打到主库,并做连接复用与查询缓存。
3.1 架构

图 5
| 端口 | 用途 |
|---|---|
| 6033 | 代理端口(应用连接这个,不是直连 MySQL) |
| 6032 | 管理端口(DBA 用 mysql 客户端连进来配置) |
3.2 连接管理端口并配置读写分离
# ① 连接 ProxySQL 管理接口(解释:默认 admin/admin,库为 main)
mysql -uadmin -padmin -h127.0.0.1 -P6032 --prompt='Proxysql> '
-- ② 配置后端 MySQL 节点(解释:hostgroup 10=写组,20=读组)
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(10,'192.168.10.51',3306), -- 主库:写组
(20,'192.168.10.52',3306), -- 从库:读组
(20,'192.168.10.53',3306); -- 从库:读组
-- ③ 配置应用连接用的账号(解释:密码用 mysql_native_password 明文或 hash)
INSERT INTO mysql_users(username,password,default_hostgroup)
VALUES('app_user','App@Pass2026',10); -- 解释:默认走写组
-- ④ 配置查询路由规则(解释:SELECT ... FOR UPDATE 走写组,普通 SELECT 走读组)
INSERT INTO mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)
VALUES
(1,1,'^SELECT.*FOR UPDATE$',10,1),
(2,1,'^SELECT',20,1);
-- ⑤ 生效并持久化(解释:LOAD 到运行内存,SAVE 到磁盘 sqlite)
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;
3.3 验证
-- 在 ProxySQL 管理接口查看路由统计(解释:stats 库看每条规则命中次数)
SELECT rule_id, match_digest, hits FROM stats_mysql_query_rules;
-- 查看各后端节点的连接数与流量(解释:确认读流量打到从库)
SELECT hostgroup, srv_host, ConnUsed, ConnFree, Queries
FROM stats_mysql_connection_pool;
应用连接方式:应用把连接地址改成
ProxySQL_IP:6033,账号app_user。之后 ProxySQL 自动按规则把SELECT分到从库、写操作分到主库——业务零改动。
四、ProxySQL 高级能力
| 能力 | 说明 | 类比 |
|---|---|---|
| 连接复用 | 应用短连接收拢为后端长连接 | 连接池 |
| 查询缓存 | 相同 SELECT 结果缓存(mysql_query_rules 的 cache_ttl) | 结果集缓存 |
| 故障摘除 | 后端节点宕机自动踢出读组 | Listener 故障转移 |
| 读写拆分 | 按 SQL 特征路由 | 应用层读写分离的产品化 |
| 审计/重写 | 重写 SQL、记录慢查询 | EM SQL 审计 |
-- 给某条规则加查询缓存(解释:相同 SELECT 5 秒内直接返回缓存)
UPDATE mysql_query_rules SET cache_ttl=5000 WHERE rule_id=2;
LOAD MYSQL QUERY RULES TO RUNTIME;
五、中间件选型对比

图 6
| 维度 | ProxySQL | MySQL Router | ShardingSphere/MyCat |
|---|---|---|---|
| 核心目的 | 代理+读写分离+缓存 | InnoDB Cluster 路由 | 分库分表 |
| 读写分离 | 强(规则引擎) | 简单(端口区分) | 支持 |
| 分库分表 | 不支持 | 不支持 | 核心能力 |
| 查询缓存 | 支持 | 不支持 | 部分 |
| 适用 | 读写分离/连接收拢 | 集群高可用接入 | 数据量超单库、需水平拆分 |
衔接:分库分表中间件(ShardingSphere / MyCat)在番外-02 篇展开;本篇聚焦"集中纳管(MEM)+ 流量代理(ProxySQL)"这两个对标 EMCC 的管理工具。
六、与 Oracle EMCC 的能力对照
| Oracle EMCC 能力 | MySQL 对应物 | 说明 |
|---|---|---|
| Target 纳管(多库集中) | MEM 纳管 + 第17篇 Prometheus targets | 统一管理界面 |
| SQL Performance Center | MEM Query Analyzer / performance_schema | Top SQL 抓取 |
| Advisor / ADDM | MEM Advisors + 巡检脚本(第18篇) | 健康建议 |
| Listener / SCAN 路由 | ProxySQL / MySQL Router | 连接接入 |
| 连接池管理 | ProxySQL 连接复用 | 短连接收拢 |
| 告警通知 | Alertmanager(第17/19篇) | 实时告警 |
结论:MySQL 生态没有一个"EMCC 全家桶"式的单一产品,而是 MEM(商业深度诊断)+ ProxySQL(流量代理)+ Prometheus/Grafana(开源可观测)+ 巡检脚本(第18篇) 组合出同等能力。
七、要点速记
- MEM 对标 EMCC:商业版,管集中纳管、Query Analyzer、Advisors;仓库库必须独立虚机。
- ProxySQL 是生产级读写分离代理:6033 代理 / 6032 管理,配置存在 sqlite,
LOAD ... TO RUNTIME生效、SAVE ... TO DISK持久化。 - 读写分离靠 query_rules:写走 hostgroup 10,普通 SELECT 走 hostgroup 20。
- 应用连 ProxySQL 而非直连 MySQL,业务零改动即可享连接复用与缓存。
- 中间件分工:ProxySQL 管代理、MySQL Router 管集群接入、ShardingSphere 管分片。
- MySQL 没有 EMCC 全家桶,用 MEM + ProxySQL + Prometheus + 巡检脚本组合出等价能力。
八、踩坑记录(实测汇总)
| # | 坑 | 现象 | 解决 |
|---|---|---|---|
| 1 | MEM 仓库与业务库同机 | MEM 拖垮生产 | 仓库独立虚机、磁盘预留 |
| 2 | ProxySQL 管理密码未改 | admin/admin 裸奔 | 改管理账号密码 |
| 3 | 忘 LOAD 到 RUNTIME | 配置不生效 | INSERT 后必须 LOAD ... TO RUNTIME |
| 4 | 忘 SAVE 到 DISK | 重启后配置丢失 | 生效后 SAVE ... TO DISK |
| 5 | SELECT 带写语义被路由到从库 | 读到旧数据 | FOR UPDATE/事务内 SELECT 强制走写组 |
| 6 | 从库延迟大仍接读 | 用户读到不一致 | 配合第17篇延迟监控摘除读节点 |
| 7 | 应用直连 MySQL 绕过代理 | 代理形同虚设 | 防火墙只开放 6033,禁直连 3306 |
| 8 | 缓存 TTL 过大 | 读到旧数据 | cache_ttl 按业务一致性要求设小 |
| 9 | 后端密码 hash 不匹配 | 应用连不上 | mysql_users 密码与后端账号一致 |
| 10 | ProxySQL 单点 | 代理成单点故障 | 多台 ProxySQL + 上层 VIP/Keepalived |
九、参考资料(官方正式文档)
| 主题 | 官方链接 |
|---|---|
| MySQL Enterprise Monitor 文档 | https://dev.mysql.com/doc/enterprise-monitor/en/ |
| MySQL 8.0 Reference Manual | https://dev.mysql.com/doc/refman/8.0/en/ |
| ProxySQL 官方文档 | https://proxysql.com/documentation/ |
| ProxySQL GitHub | https://github.com/sysown/proxysql |
| MySQL Router | https://dev.mysql.com/doc/mysql-router/8.0/en/ |
| ShardingSphere 官方 | https://shardingsphere.apache.org/ |
本文章属于《MySQL 数据库全栈运维实战系列》高可用架构篇。欢迎收藏、交流。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/dk843108982/article/details/169914988




