- ProxySQL
- 详细阐述
- 1. ProxySQL 是什么?(一句话定义)
- 2. 核心功能:它能干什么?
- 3. 江湖地位:在生态链中的位置
- 4. 典型使用场景
- 5. 为什么选择 ProxySQL?
- 6. 在云原生时代的地位
- 7. 一个生动的比喻
- 总结
- 纯SQL配置ProxySQL完整步骤
- 前提条件
- 步骤1:启动ProxySQL并连接管理接口
- 步骤2:在MySQL主库创建必要的用户
- 步骤3:配置ProxySQL监控用户
- 步骤4:添加后端MySQL服务器
- 步骤5:配置应用用户
- 步骤6:配置主从复制组(关键!)
- 步骤7:配置读写分离查询规则(核心配置)
- 步骤8:激活所有配置
- 步骤9:验证配置
- 步骤10:测试读写分离
- 步骤11:监控和调优
- 步骤12:高级配置(可选)
- 一键配置脚本
- 关键要点总结
- 日常维护命令
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 连接池专家 | 仅连接池,无复杂路由 |
江湖评价:
- 性能王者:C++ 编写,事件驱动,单实例可处理数十万 QPS
- 功能最全:在 MySQL 代理领域,功能覆盖度无人能及
- 稳定性高:被 Cloudflare、GitHub、Booking.com 等巨头生产验证
- 社区活跃:GitHub 8k+ stars,持续更新,问题响应快
- 学习曲线:中等偏上,配置灵活但需要理解概念
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 当:
- 你有 MySQL 主从复制架构,需要自动读写分离
- 你的应用有 大量只读查询,想充分利用从库
- 你想 零代码修改 实现数据库水平扩展
- 你需要 SQL级的监控和优化
- 你想 防止数据库被慢查询打挂
不选 ProxySQL 当:
- 你只有单个数据库,无复制架构
- 你的协议不是 MySQL(考虑 HAProxy)
- 你需要极简方案(考虑云厂商的负载均衡器)
- 你的团队只有 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 的作用:
- 病人来了,先判断是手术(写)还是看病(读)
- 手术的指向手术室,看病的根据科室空闲情况分配医生
- 常见小病(缓存命中)直接开药,不用排队
- 实时监控各科室排队情况,动态调整
- 手术室医生累了,自动安排备用医生顶上
总结
ProxySQL 是:
- 🎯 专才:只做 MySQL 代理,但做到极致
- 🚀 高性能:C++ 编写,单实例抗数十万 QPS
- 🧠 智能化:能理解 SQL 语义,做智能路由
- 🛡️ 稳定:经过巨头生产环境验证
- 🔧 灵活:配置项丰富,适应各种场景
在数据库中间件的江湖中:
- 如果说 HAProxy 是“十八般武艺样样精通”的武林盟主
- 那么 ProxySQL 就是“专精 MySQL 剑法”的绝世高手
- 在 MySQL 代理 这个细分领域,它就是 当之无愧的 No.1
它的存在,让 DBA 晚上能睡得着觉,让开发不用改代码就能扩展数据库,让运维有详细的监控数据。这就是 ProxySQL 的江湖地位和价值。
纯SQL配置ProxySQL完整步骤
前提条件
- MySQL主从复制已搭建完成
- ProxySQL已安装(版本2.0+)
- 网络互通,防火墙已放行相关端口
步骤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关键要点总结
- 纯SQL配置:所有配置通过SQL管理接口完成,无需修改配置文件
- 在线生效:
LOAD ... TO RUNTIME立即生效,无需重启 - 持久化:
SAVE ... TO DISK保证重启后配置不丢失 - 三层架构:理解disk/memory/runtime三层的关系
- 监控先行:先配置监控用户,确保ProxySQL能检测后端状态
- 规则优先级:规则ID越小,优先级越高,匹配后停止
- 自动主从识别:通过
mysql_replication_hostgroups和read_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
最后编辑:严锋 更新时间:2026-01-08 08:29