在生产环境中直接执行mysql服务重启命令,很容易导致正在处理的数据库请求被强制中断,轻则引发业务接口报错,重则可能造成未提交的事务回滚,影响数据一致性。因此掌握mysql在生产环境的优雅重启方法,实现连接平滑切换和服务重载,是运维和开发人员的必备技能。

优雅重启的核心思路
mysql优雅重启的核心目标是让服务重启过程中,客户端连接不会出现断连报错,正在执行的事务可以正常完成或者被合理处理,最终服务完成重载后恢复正常可用状态。整体流程可以分为三个阶段:重启前检查、连接平滑过渡、服务重载与验证。
重启前的必要检查
在操作前需要先确认当前mysql的实例状态,避免重启过程中出现不可控问题。
- 检查当前mysql的版本和运行状态,确认没有正在执行的大表结构变更、数据导入导出等耗时操作
- 查看当前活跃连接数,记录业务高峰时段的连接峰值,评估重启窗口时间
- 确认mysql的配置文件路径,提前备份当前的
my.cnf配置文件,避免配置丢失 - 检查主从复制状态,如果是主库重启,需要提前确认从库同步正常,避免主从延迟过大
检查mysql运行状态的命令示例
# 查看mysql服务运行状态 systemctl status mysqld # 查看当前活跃连接数 mysql -u root -p -e "show processlist;" | wc -l # 查看主从复制状态(如果是主从架构) mysql -u root -p -e "show slave statusG;"
连接平滑切换的实现方式
要实现连接的平滑切换,避免客户端直接感知到服务重启,通常可以通过以下两种方式处理。
方式一:使用代理层过渡
如果生产环境mysql前端部署了数据库代理(如ProxySQL、MaxScale等),可以先把代理层的后端mysql节点标记为下线,让新连接不再路由到待重启的实例,等待存量连接处理完成后再执行重启。
ProxySQL标记节点下线的示例操作
-- 登录ProxySQL管理端 mysql -u admin -p -h 127.0.0.1 -P 6032 -- 将待重启的mysql节点状态改为OFFLINE_SOFT,不再接收新连接 UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE hostgroup_id=1 AND hostname='192.168.0.1' AND port=3306; -- 加载配置到运行时并保存到磁盘 LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;
方式二:无代理层的直接处理
如果没有代理层,需要先通知业务方在重启窗口暂停新的数据库请求,或者通过max_connections参数临时限制新连接,等待存量连接处理完成。
-- 临时调低最大连接数,避免新连接进入(注意提前评估当前连接数,不要小于当前活跃连接数) SET GLOBAL max_connections=当前活跃连接数+10; -- 查看当前连接处理情况,直到活跃连接数降到安全阈值 SHOW PROCESSLIST;
服务重载与重启操作
当存量连接处理完成后,就可以执行服务重载或者重启操作,推荐使用mysql自带的安全关闭命令,避免强制终止进程。
安全重启mysql服务的操作
# 安全关闭mysql服务,会等待当前事务完成后再关闭 systemctl stop mysqld # 如果需要重载配置文件,修改完my.cnf后启动服务即可 systemctl start mysqld # 查看服务启动状态 systemctl status mysqld
如果是只需要重载配置不需要重启进程,可以使用mysql的FLUSH命令或者发送SIGHUP信号给mysql进程。
# 查看mysql进程PID
ps -ef | grep mysqld | grep -v grep | awk '{print $2}'
# 发送SIGHUP信号重载配置,不需要重启进程
kill -SIGHUP 上面查到的PID
重启后的验证步骤
服务重启完成后,需要完成以下验证确保服务正常可用。
- 检查mysql服务状态,确认进程正常运行
- 验证数据库账号权限、业务库表是否正常可访问
- 如果是主从架构,检查主从复制是否恢复正常同步
- 逐步放开连接限制,观察业务请求是否正常处理,没有报错
重启后验证的示例命令
-- 验证业务库是否正常 USE 业务库名; SHOW TABLES; -- 验证主从同步状态 SHOW SLAVE STATUSG; -- 查看当前连接数是否正常 SHOW STATUS LIKE 'Threads_connected';
注意事项与常见问题
注意:生产环境操作一定要提前在测试环境验证流程,选择业务低峰时段操作,操作前做好数据备份,避免误操作导致数据丢失。
常见问题一:重启后客户端连接报错。通常是重启后没有及时放开连接限制,或者代理层配置没有恢复,需要检查代理配置和mysql的max_connections参数。
常见问题二:重启后主从复制中断。可能是重启前主库有未同步的事务,需要检查从库的同步报错信息,重新配置同步位点即可恢复。
常见问题三:重启时间过长。如果mysql实例有大量的未提交事务或者脏页,关闭时会等待刷脏完成,此时不要强制终止进程,耐心等待即可。