14.10.8 升级回滚与兼容性问题
升级与回滚是ProxySQL稳定运维的高风险操作,本节提供兼容性评估、升级流程、回滚步骤、排错与练习,包含可执行命令与示例。
一、原理草图:升级/回滚与配置库关系
二、升级前的兼容性评估与准备(含示例)
- 版本差异评估:阅读发行说明并记录变更点。
# 记录当前版本
proxysql --version
# 拉取发行说明(示例)
curl -s https://github.com/sysown/proxysql/releases | head -n 20
- 兼容性验证:在测试环境模拟升级,验证核心功能。
-- 验证路由规则是否仍命中
SELECT rule_id, match_pattern, destination_hostgroup, active
FROM runtime_mysql_query_rules
ORDER BY rule_id;
- 配置与数据备份:保存配置与DB文件,确保可回滚。
# 进入管理端
mysql -h127.0.0.1 -P6032 -uadmin -padmin
-- 保存配置到磁盘
SAVE MYSQL USERS TO DISK;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;
SAVE MYSQL VARIABLES TO DISK;
# 备份配置库
cp /var/lib/proxysql/proxysql.db /var/backups/proxysql.db.$(date +%F)
# 备份二进制与配置文件
cp /usr/bin/proxysql /var/backups/proxysql.bin.$(date +%F)
cp /etc/proxysql.cnf /var/backups/proxysql.cnf.$(date +%F)
三、升级流程(含可执行步骤与命令说明)
- 推荐停机升级:避免热升级引发运行时配置不一致。
# 1) 停止服务
systemctl stop proxysql
# 2) 安装新版本(二进制或包)
# 以RPM为例
rpm -Uvh proxysql-2.x.x-1.x86_64.rpm
# 3) 启动服务
systemctl start proxysql
# 4) 检查监听端口
ss -lntp | grep proxysql
- 升级后一致性校验:
-- 检查运行时配置是否加载
SELECT * FROM runtime_mysql_servers;
SELECT * FROM runtime_mysql_users;
SELECT * FROM runtime_mysql_query_rules;
-- 若运行时为空,重新加载
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
- 灰度/滚动升级示例(两节点):
# 节点A升级,节点B保持旧版承载流量
# 切走流量(DNS/SLB/应用连接串)
# 升级节点A → 验证通过 → 切流量回节点A
# 再升级节点B
四、回滚策略与命令(含说明与预期效果)
- 快速回滚:恢复旧二进制与配置库。
# 1) 停止服务
systemctl stop proxysql
# 2) 恢复旧二进制
cp /var/backups/proxysql.bin.2024-01-01 /usr/bin/proxysql
chmod +x /usr/bin/proxysql
# 3) 恢复配置库
cp /var/backups/proxysql.db.2024-01-01 /var/lib/proxysql/proxysql.db
# 4) 启动服务并加载配置
systemctl start proxysql
mysql -h127.0.0.1 -P6032 -uadmin -padmin -e "
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL USERS TO DISK;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;"
预期效果:旧版本服务启动、运行时配置恢复、应用连接正常。
五、常见兼容性问题与排错技巧(含命令)
1. 配置表字段变更导致加载失败
# 查看日志定位字段错误
tail -n 200 /var/lib/proxysql/proxysql.log | grep -i "unknown column"
处理建议:初始化新库并导入旧配置。
# 备份后移除损坏库,重启生成新库
mv /var/lib/proxysql/proxysql.db /var/lib/proxysql/proxysql.db.bad
systemctl restart proxysql
# 从备份导入(示例为SQL导出方式)
mysql -h127.0.0.1 -P6032 -uadmin -padmin < /var/backups/proxysql_config.sql
- 变量默认值改变导致延迟
-- 比对关键变量
SELECT * FROM global_variables
WHERE variable_name IN ('mysql-connect_timeout_server','mysql-default_query_delay');
-- 手动修正并生效
UPDATE global_variables
SET variable_value=2000
WHERE variable_name='mysql-connect_timeout_server';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
- 路由规则匹配异常
-- 验证规则排序与apply
SELECT rule_id, match_pattern, apply, destination_hostgroup
FROM runtime_mysql_query_rules
ORDER BY rule_id;
-- 修正规则优先级
UPDATE mysql_query_rules
SET rule_id=100
WHERE rule_id=1000;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
- 监控指标变化导致采集失败
# Prometheus exporter 与 ProxySQL 版本匹配
proxysql_exporter --version
# 检查管理端访问
mysql -h127.0.0.1 -P6032 -uadmin -padmin -e "SHOW STATS;"
- 认证方式不兼容(MySQL 8.0)
-- 检查用户认证插件
SELECT username, default_hostgroup, transaction_persistent
FROM mysql_users;
-- 若需改为 mysql_native_password,示例:
UPDATE mysql_users SET password='pass', frontend=1, backend=1;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
六、升级失败应急处理流程(含命令)
# 1) 查看日志
tail -n 200 /var/lib/proxysql/proxysql.log
# 2) 健康检查
mysql -h127.0.0.1 -P6032 -uadmin -padmin -e \
"SELECT hostgroup_id, hostname, status FROM runtime_mysql_servers;"
# 3) 快速回滚(见上一节)
七、练习与验证
1. 演练升级:在测试环境从2.4.x升级到2.5.x,记录差异与问题。
2. 故障注入:人为修改一条路由规则并验证是否恢复。
UPDATE mysql_query_rules SET match_pattern='^select 1$' WHERE rule_id=1;
LOAD MYSQL QUERY RULES TO RUNTIME;
-- 测试命中
- 回滚演练:执行回滚脚本,验证应用连接与读写分离规则是否恢复。
八、最佳实践清单
- 变更窗口内执行升级,预留回滚通道。
- 保留至少一个稳定旧版本实例。
- 升级后进行功能回归:连接、路由、监控、故障切换。