ProxySQL

ProxySQL 是一个高性能、智能化的 MySQL 中间件代理。它的核心定位是 MySQL 专属的“流量警察”和“智能路由器”,专门解决数据库层面的流量管理、负载均衡和高可用问题。在数据库中间件的江湖中,ProxySQL 是 MySQL 生态链里的“瑞士军刀”,尤其是在读写分离、查询优化和连接池管理方面,被认为是事实上的行业标准

详细阐述

1. ProxySQL 是什么?(一句话定义)

ProxySQL 是一个用 C++ 编写的、专为 MySQL/MariaDB/Percona Server 设计的智能代理中间件。它不是数据库,也不是存储引擎,而是一个站在应用和数据库之间的智能调度器

2. 核心功能:它能干什么?

核心功能 具体作用 比喻解释
智能读写分离 自动识别 SQL 语句类型,将写请求(INSERT/UPDATE/DELETE)路由到主库,读请求(SELECT)路由到从库。 交通警察:看到卡车(写操作)指向主路(主库),看到轿车(读操作)指向辅路(从库)。
高级负载均衡 基于多种算法(最少连接、响应时间、权重等)在多个数据库节点间分配连接。 智能调度中心:根据各条生产线(数据库)的忙闲程度,分配新订单(查询)。
查询缓存 缓存 SELECT 查询结果,相同查询直接返回缓存,减轻数据库压力。 快递自提柜:常用包裹放在柜子里,客户来了直接取,不用每次都去仓库。
连接池管理 复用数据库连接,避免应用频繁创建/销毁连接的开销。 出租车调度站:车辆(连接)循环使用,不用每次乘客都等新车出厂。
SQL防火墙 拦截恶意查询、限制查询频率、防止 SQL 注入。 安检关卡:检查每个包裹(查询)是否安全、是否超重。
查询重写 动态修改 SQL 语句,比如给所有 SELECT 自动加上 LIMIT。 同声传译:把客户说的话(SQL)翻译成后端能更好理解的形式。
故障自动转移 主库宕机时,自动将流量切换到从库。 备用发电机:主电源坏了,毫秒级切换到备用电源。
实时监控 提供详细的查询统计、连接状态、性能指标。 监控大屏:实时显示每条道路的交通流量、拥堵情况。

3. 江湖地位:在生态链中的位置

技术栈中的定位:

应用层 (Application)
       ↓
   中间件层 (Middleware)  ← ProxySQL 在这里!
       ↓
   数据库层 (MySQL集群)

同领域竞品对比:

工具 定位 江湖地位 适用场景
ProxySQL MySQL专用智能代理 行业标杆,功能最全,性能最好,社区最活跃 生产环境 MySQL 读写分离、负载均衡
HAProxy 通用 TCP/HTTP 代理 四层/七层负载均衡的老大哥 非 MySQL 协议、简单 TCP 转发
MaxScale MySQL 代理 (MariaDB) 官方出身,与 MariaDB 集成好 MariaDB 生态、企业级特性需求
MySQL Router MySQL 官方路由 亲儿子,但功能简单 MySQL InnoDB Cluster、MGR
PgBouncer PostgreSQL 连接池 PostgreSQL 连接池专家 仅连接池,无复杂路由

江湖评价:

  1. 性能王者:C++ 编写,事件驱动,单实例可处理数十万 QPS
  2. 功能最全:在 MySQL 代理领域,功能覆盖度无人能及
  3. 稳定性高:被 Cloudflare、GitHub、Booking.com 等巨头生产验证
  4. 社区活跃:GitHub 8k+ stars,持续更新,问题响应快
  5. 学习曲线:中等偏上,配置灵活但需要理解概念

4. 典型使用场景

场景1:电商网站数据库架构

用户请求 → Web服务器 → ProxySQL → { 主库(写订单) + 3个从库(读商品) }
  • 双11大促时,ProxySQL 自动将 99% 的读请求分摊到从库
  • 恶意爬虫刷接口时,SQL防火墙自动限流
  • 商品详情页相同查询命中缓存,数据库压力减少 80%

场景2:SaaS 多租户系统

租户A应用 → ProxySQL → 分片1 {主+从}
租户B应用 →      ↓     → 分片2 {主+从}
租户C应用 →      ↓     → 分片3 {主+从}
  • 根据租户ID自动路由到不同数据库分片
  • 大客户独享数据库,小客户共享但隔离

场景3:数据库迁移透明切换

老数据库 → ProxySQL (双写) → 新数据库
  • 应用无感知完成数据库迁移
  • 可对比两边数据一致性
  • 随时一键回滚

5. 为什么选择 ProxySQL?

选择 ProxySQL 当:

  1. 你有 MySQL 主从复制架构,需要自动读写分离
  2. 你的应用有 大量只读查询,想充分利用从库
  3. 你想 零代码修改 实现数据库水平扩展
  4. 你需要 SQL级的监控和优化
  5. 你想 防止数据库被慢查询打挂

不选 ProxySQL 当:

  1. 你只有单个数据库,无复制架构
  2. 你的协议不是 MySQL(考虑 HAProxy)
  3. 你需要极简方案(考虑云厂商的负载均衡器)
  4. 你的团队只有 DBA 没有运维

6. 在云原生时代的地位

即使在 Kubernetes 和 Service Mesh 时代,ProxySQL 依然不可或缺:

Kubernetes Pod → Service → ProxySQL → MySQL Cluster
                     ↑
               (简单的负载均衡)
  • K8s Service 只能做简单的 TCP 转发
  • ProxySQL 提供 MySQL 感知的智能路由
  • 很多公司用 ProxySQL 作为 K8s 的 MySQL Ingress Controller

7. 一个生动的比喻

如果把数据库集群比作一个大型医院

  • 主库 = 手术室(做写操作)
  • 从库 = 门诊部(做读操作)
  • 应用程序 = 病人
  • ProxySQL = 智能分诊台 + 导医系统

ProxySQL 的作用:

  1. 病人来了,先判断是手术(写)还是看病(读)
  2. 手术的指向手术室,看病的根据科室空闲情况分配医生
  3. 常见小病(缓存命中)直接开药,不用排队
  4. 实时监控各科室排队情况,动态调整
  5. 手术室医生累了,自动安排备用医生顶上

总结

ProxySQL 是:

  • 🎯 专才:只做 MySQL 代理,但做到极致
  • 🚀 高性能:C++ 编写,单实例抗数十万 QPS
  • 🧠 智能化:能理解 SQL 语义,做智能路由
  • 🛡️ 稳定:经过巨头生产环境验证
  • 🔧 灵活:配置项丰富,适应各种场景

在数据库中间件的江湖中:

  • 如果说 HAProxy 是“十八般武艺样样精通”的武林盟主
  • 那么 ProxySQL 就是“专精 MySQL 剑法”的绝世高手
  • MySQL 代理 这个细分领域,它就是 当之无愧的 No.1

它的存在,让 DBA 晚上能睡得着觉,让开发不用改代码就能扩展数据库,让运维有详细的监控数据。这就是 ProxySQL 的江湖地位和价值。

纯SQL配置ProxySQL完整步骤

前提条件

  1. MySQL主从复制已搭建完成
  2. ProxySQL已安装(版本2.0+)
  3. 网络互通,防火墙已放行相关端口

步骤1:启动ProxySQL并连接管理接口

# 启动ProxySQL服务
sudo systemctl start proxysql
sudo systemctl enable proxysql

# 连接到管理接口(端口6032)
mysql -u admin -padmin -h 127.0.0.1 -P 6032 --prompt='ProxySQL> '
# 密码默认 admin/admin

步骤2:在MySQL主库创建必要的用户

在MySQL主库上执行以下SQL:

-- 1. 创建ProxySQL监控用户(用于健康检查)
CREATE USER 'proxysql_monitor'@'%' IDENTIFIED BY 'MonitorPass123!';
GRANT REPLICATION CLIENT ON *.* TO 'proxysql_monitor'@'%';

-- 2. 创建应用连接用户
CREATE USER 'app_user'@'%' IDENTIFIED BY 'AppUserPass123!';
GRANT ALL PRIVILEGES ON *.* TO 'app_user'@'%';

-- 3. 创建管理用户(可选,用于ProxySQL管理)
CREATE USER 'proxysql_admin'@'%' IDENTIFIED BY 'AdminPass123!';
GRANT ALL PRIVILEGES ON *.* TO 'proxysql_admin'@'%';

FLUSH PRIVILEGES;

步骤3:配置ProxySQL监控用户

在ProxySQL管理接口执行:

-- 设置监控用户
UPDATE global_variables SET variable_value='proxysql_monitor'
WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='MonitorPass123!'
WHERE variable_name='mysql-monitor_password';

-- 配置监控间隔(单位:毫秒)
UPDATE global_variables SET variable_value='2000'
WHERE variable_name='mysql-monitor_connect_interval';
UPDATE global_variables SET variable_value='2000'
WHERE variable_name='mysql-monitor_ping_interval';
UPDATE global_variables SET variable_value='1000'
WHERE variable_name='mysql-monitor_read_only_interval';
UPDATE global_variables SET variable_value='3000'
WHERE variable_name='mysql-monitor_replication_lag_interval';

-- 设置健康检查超时
UPDATE global_variables SET variable_value='800'
WHERE variable_name='mysql-monitor_connect_timeout';
UPDATE global_variables SET variable_value='800'
WHERE variable_name='mysql-monitor_ping_timeout';
UPDATE global_variables SET variable_value='1000'
WHERE variable_name='mysql-monitor_read_only_timeout';

-- 激活监控配置
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

步骤4:添加后端MySQL服务器

-- 清空现有服务器配置(如果是新安装)
DELETE FROM mysql_servers;

-- 添加主库到写组 (hostgroup_id = 10)
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight, max_connections, max_replication_lag, use_ssl, compression) VALUES
(10, '192.168.1.101', 3306, 10000, 300, 0, 0, 0);  -- 主库,权重最高

-- 添加从库到读组 (hostgroup_id = 20)
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight, max_connections, max_replication_lag, use_ssl, compression) VALUES
(20, '192.168.1.102', 3306, 100, 500, 5, 0, 0),     -- 从库1
(20, '192.168.1.103', 3306, 100, 500, 5, 0, 0),     -- 从库2
(20, '192.168.1.104', 3306, 150, 500, 5, 0, 0);     -- 从库3,性能更好,权重更高

-- 查看添加的服务器
SELECT hostgroup_id, hostname, port, status, weight, max_replication_lag, max_connections 
FROM mysql_servers 
ORDER BY hostgroup_id, weight DESC;

步骤5:配置应用用户

-- 清空现有用户
DELETE FROM mysql_users;

-- 添加应用用户
INSERT INTO mysql_users(username, password, default_hostgroup, default_schema, transaction_persistent, fast_forward, backend, frontend, max_connections) VALUES
('app_user', 'AppUserPass123!', 10, '', 1, 0, 1, 1, 10000);

-- 可选:添加管理用户
INSERT INTO mysql_users(username, password, default_hostgroup, default_schema, transaction_persistent, fast_forward, backend, frontend, max_connections) VALUES
('proxysql_admin', 'AdminPass123!', 10, '', 1, 0, 1, 1, 100);

-- 查看用户配置
SELECT username, password, default_hostgroup, transaction_persistent, max_connections 
FROM mysql_users;

步骤6:配置主从复制组(关键!)

-- 配置主从复制组关系
DELETE FROM mysql_replication_hostgroups;
INSERT INTO mysql_replication_hostgroups(writer_hostgroup, reader_hostgroup, comment) VALUES
(10, 20, 'mysql主从复制组');

-- 让ProxySQL自动根据read_only标志识别主从
UPDATE global_variables SET variable_value='true'
WHERE variable_name='mysql-monitor_writer_is_also_reader';

-- 激活配置
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

步骤7:配置读写分离查询规则(核心配置)

-- 清空现有规则
DELETE FROM mysql_query_rules;

-- 规则1-50: 写操作路由到主库 (hostgroup 10)
INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, apply, comment) VALUES
(1, 1, '^SELECT.*FOR UPDATE$', 10, 1, 'SELECT FOR UPDATE 去主库'),
(2, 1, '^INSERT', 10, 1, 'INSERT 去主库'),
(3, 1, '^UPDATE', 10, 1, 'UPDATE 去主库'),
(4, 1, '^DELETE', 10, 1, 'DELETE 去主库'),
(5, 1, '^REPLACE', 10, 1, 'REPLACE 去主库'),
(6, 1, '^DROP', 10, 1, 'DROP 去主库'),
(7, 1, '^CREATE', 10, 1, 'CREATE 去主库'),
(8, 1, '^ALTER', 10, 1, 'ALTER 去主库'),
(9, 1, '^TRUNCATE', 10, 1, 'TRUNCATE 去主库'),
(10, 1, '^RENAME', 10, 1, 'RENAME 去主库'),
(11, 1, '^OPTIMIZE', 10, 1, 'OPTIMIZE 去主库'),
(12, 1, '^LOCK', 10, 1, 'LOCK 去主库'),
(13, 1, '^UNLOCK', 10, 1, 'UNLOCK 去主库'),
(14, 1, '^FLUSH', 10, 1, 'FLUSH 去主库'),
(15, 1, '^GRANT', 10, 1, 'GRANT 去主库'),
(16, 1, '^REVOKE', 10, 1, 'REVOKE 去主库');

-- 事务控制语句
INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, apply, comment) VALUES
(20, 1, '^BEGIN', 10, 1, 'BEGIN 去主库'),
(21, 1, '^START TRANSACTION', 10, 1, 'START TRANSACTION 去主库'),
(22, 1, '^COMMIT', 10, 1, 'COMMIT 去主库'),
(23, 1, '^ROLLBACK', 10, 1, 'ROLLBACK 去主库'),
(24, 1, '^SAVEPOINT', 10, 1, 'SAVEPOINT 去主库'),
(25, 1, '^RELEASE SAVEPOINT', 10, 1, 'RELEASE SAVEPOINT 去主库');

-- 存储过程和函数
INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, apply, comment) VALUES
(30, 1, '^CALL', 10, 1, 'CALL 去主库'),
(31, 1, '^EXECUTE', 10, 1, 'EXECUTE 去主库'),
(32, 1, '^PREPARE', 10, 1, 'PREPARE 去主库'),
(33, 1, '^DEALLOCATE', 10, 1, 'DEALLOCATE 去主库');

-- 规则100-150: 读操作路由到从库 (hostgroup 20),带缓存
INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, cache_ttl, apply, comment) VALUES
(100, 1, '^SELECT', 20, 100, 1, 'SELECT 去从库,缓存100ms'),
(101, 1, '^SHOW', 20, NULL, 1, 'SHOW 去从库'),
(102, 1, '^DESC', 20, NULL, 1, 'DESC 去从库'),
(103, 1, '^DESCRIBE', 20, NULL, 1, 'DESCRIBE 去从库'),
(104, 1, '^EXPLAIN', 20, NULL, 1, 'EXPLAIN 去从库');

-- 特殊情况:某些SELECT需要去主库
INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, apply, comment) VALUES
(150, 1, 'SELECT.*LAST_INSERT_ID', 10, 1, 'LAST_INSERT_ID 去主库'),
(151, 1, 'SELECT.*@@.*IDENTITY', 10, 1, '@@IDENTITY 去主库'),
(152, 1, 'SELECT.*@@.*VERSION', 10, 1, '@@VERSION 去主库'),
(153, 1, 'SELECT.*GET_LOCK', 10, 1, 'GET_LOCK 去主库'),
(154, 1, 'SELECT.*RELEASE_LOCK', 10, 1, 'RELEASE_LOCK 去主库'),
(155, 1, 'SELECT.*FOUND_ROWS', 10, 1, 'FOUND_ROWS 去主库'),
(156, 1, 'SELECT.*ROW_COUNT', 10, 1, 'ROW_COUNT 去主库');

-- 管理查询
INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, apply, comment) VALUES
(200, 1, '^KILL', 10, 1, 'KILL 去主库'),
(201, 1, '^SET', 10, 1, 'SET 去主库'),
(202, 1, '^USE', 10, 1, 'USE 去主库');

-- 默认规则:未匹配的查询去主库
INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, apply, log, comment) VALUES
(1000, 1, '^.*', 10, 1, 1, '默认规则:未匹配的去主库');

-- 查看规则配置
SELECT rule_id, match_digest, destination_hostgroup, cache_ttl, apply, comment 
FROM mysql_query_rules 
ORDER BY rule_id;

步骤8:激活所有配置

-- 批量激活所有配置到运行时
LOAD MYSQL VARIABLES TO RUNTIME;
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;

-- 批量持久化到磁盘
SAVE MYSQL VARIABLES TO DISK;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;

-- 或者使用一条命令(ProxySQL 2.0+)
LOAD MYSQL VARIABLES/SERVERS/USERS/QUERY RULES TO RUNTIME;
SAVE MYSQL VARIABLES/SERVERS/USERS/QUERY RULES TO DISK;

步骤9:验证配置

-- 1. 查看服务器状态
SELECT hostgroup_id AS hg, hostname, port, status, weight, 
       max_replication_lag AS max_lag, max_connections AS max_conn,
       (CASE hostgroup_id 
          WHEN 10 THEN 'MASTER' 
          WHEN 20 THEN 'SLAVE' 
          ELSE 'OTHER' 
        END) AS role
FROM runtime_mysql_servers 
ORDER BY hostgroup_id, weight DESC;

-- 2. 查看监控状态
SELECT hostname, port, 
       (SELECT MAX(time_start_us) FROM monitor.mysql_server_ping_log 
        WHERE hostname = msh.hostname AND port = msh.port) AS last_ping,
       (SELECT ping_error FROM monitor.mysql_server_ping_log 
        WHERE hostname = msh.hostname AND port = msh.port 
        ORDER BY time_start_us DESC LIMIT 1) AS last_ping_error
FROM mysql_servers msh;

-- 3. 查看复制延迟
SELECT hostname, replication_lag 
FROM stats_mysql_connection_pool 
WHERE hostgroup = 20 
ORDER BY replication_lag DESC;

-- 4. 查看生效的规则
SELECT rule_id, match_digest, destination_hostgroup, cache_ttl, hits, active
FROM stats_mysql_query_rules 
WHERE hits > 0 
ORDER BY hits DESC;

步骤10:测试读写分离

# 通过ProxySQL连接MySQL(使用应用端口6033)
mysql -u app_user -pAppUserPass123! -h 127.0.0.1 -P 6033

# 在MySQL客户端中执行以下测试:
-- 测试1:读操作(应该路由到从库)
SELECT '读测试' AS test_type, @@server_id AS server_id, 
       (SELECT hostgroup FROM stats_mysql_connection_pool 
        WHERE srv_host = @@hostname) AS hostgroup;

-- 测试2:写操作(应该路由到主库)
CREATE DATABASE IF NOT EXISTS proxysql_test;
USE proxysql_test;
CREATE TABLE IF NOT EXISTS test_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    data VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO test_table(data) VALUES ('写测试');
SELECT '写测试' AS test_type, @@server_id AS server_id, 
       LAST_INSERT_ID() AS last_id;

-- 测试3:事务测试
START TRANSACTION;
INSERT INTO test_table(data) VALUES ('事务测试1');
INSERT INTO test_table(data) VALUES ('事务测试2');
SELECT '事务中查询' AS test_type, @@server_id AS server_id;
COMMIT;

-- 测试4:复杂查询
SELECT COUNT(*) AS total_rows FROM test_table;
EXPLAIN SELECT * FROM test_table WHERE id = 1;

步骤11:监控和调优

-- 查看查询统计
SELECT digest, substr(digest_text, 1, 100) AS query_sample,
       count_star, sum_time, min_time, max_time,
       (sum_time/count_star) AS avg_time
FROM stats_mysql_query_digest
WHERE digest_text NOT LIKE '%ping%'
ORDER BY sum_time DESC
LIMIT 10;

-- 查看连接池状态
SELECT hostgroup, srv_host, status, 
       ConnUsed, ConnFree, ConnOK, ConnERR,
       Queries, Queries_GTID_sync,
       (ConnUsed * 100.0 / (ConnUsed + ConnFree)) AS used_percent
FROM stats_mysql_connection_pool
ORDER BY hostgroup, srv_host;

-- 查看系统状态
SELECT Variable_name, Variable_value 
FROM stats_mysql_global
WHERE Variable_name IN (
    'Active_Transactions', 'Client_Connections_connected',
    'Questions', 'Backend_query_time_nsec'
);

-- 查看内存使用
SELECT * FROM stats_memory_metrics
WHERE Variable_name LIKE '%memory%';

步骤12:高级配置(可选)

-- 1. 配置查询缓存
UPDATE mysql_query_rules 
SET cache_ttl = 5000  -- 5秒缓存
WHERE rule_id = 100 AND match_digest = '^SELECT';

-- 2. 配置连接复用
UPDATE global_variables 
SET variable_value = 'true' 
WHERE variable_name = 'mysql-use_tcp_keepalive';

UPDATE global_variables 
SET variable_value = '60' 
WHERE variable_name = 'mysql-tcp_keepalive_time';

-- 3. 配置自动故障转移
UPDATE global_variables 
SET variable_value = '3' 
WHERE variable_name = 'mysql-connect_retries_on_failure';

UPDATE global_variables 
SET variable_value = '100' 
WHERE variable_name = 'mysql-connect_timeout_server_max';

-- 4. 配置日志
UPDATE global_variables 
SET variable_value = '/var/lib/proxysql/proxysql.log' 
WHERE variable_name = 'mysql-eventslog_filename';

UPDATE global_variables 
SET variable_value = 'true' 
WHERE variable_name = 'mysql-eventslog_default_log';

-- 激活高级配置
LOAD MYSQL VARIABLES TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
SAVE MYSQL QUERY RULES TO DISK;

一键配置脚本

将以上所有SQL命令保存为脚本 proxysql_setup.sql

#!/bin/bash
# proxysql_auto_setup.sh
# 一键配置ProxySQL主从读写分离

echo "开始配置ProxySQL..."

# 连接到ProxySQL管理接口并执行配置
mysql -u admin -padmin -h 127.0.0.1 -P 6032 << 'EOF'

-- 这里粘贴上面的所有SQL配置命令
-- 从步骤3到步骤12的所有SQL命令

EOF

if [ $? -eq 0 ]; then
    echo "ProxySQL配置完成!"
    echo "管理接口: mysql -u admin -padmin -h 127.0.0.1 -P 6032"
    echo "应用连接: mysql -u app_user -pAppUserPass123! -h 127.0.0.1 -P 6033"
else
    echo "配置失败,请检查错误信息"
    exit 1
fi

关键要点总结

  1. 纯SQL配置:所有配置通过SQL管理接口完成,无需修改配置文件
  2. 在线生效LOAD ... TO RUNTIME 立即生效,无需重启
  3. 持久化SAVE ... TO DISK 保证重启后配置不丢失
  4. 三层架构:理解disk/memory/runtime三层的关系
  5. 监控先行:先配置监控用户,确保ProxySQL能检测后端状态
  6. 规则优先级:规则ID越小,优先级越高,匹配后停止
  7. 自动主从识别:通过mysql_replication_hostgroupsread_only标志自动识别主从

日常维护命令

-- 临时下线服务器(软下线)
UPDATE mysql_servers SET status = 'OFFLINE_SOFT' WHERE hostname = '故障服务器IP';
LOAD MYSQL SERVERS TO RUNTIME;

-- 恢复服务器
UPDATE mysql_servers SET status = 'ONLINE' WHERE hostname = '恢复服务器IP';
LOAD MYSQL SERVERS TO RUNTIME;

-- 查看慢查询
SELECT hostgroup, digest_text, count_star, sum_time, (sum_time/count_star) as avg_time
FROM stats_mysql_query_digest
WHERE sum_time > 1000000  -- 大于1秒
ORDER BY sum_time DESC
LIMIT 20;

-- 清空统计
SELECT * FROM stats_mysql_query_digest_reset;

按照这个纯SQL流程配置,您可以完全掌控ProxySQL的每个配置细节,实现零停机时间的配置更新和调优。

作者:严锋  创建时间:2026-01-08 08:26
最后编辑:严锋  更新时间:2026-01-08 08:29