MySQL主库高峰期备份引发504故障:从库手动切换接管 + 主从恢复同步 + Docker版DB2重启实战_2026-05-17

生产环境一次典型故障处理记录。

现象很经典:

复制代码
系统接口大量 504
业务无法正常写入

排查后发现:

  • MySQL 主库正在执行 xtrabackup 热备

  • 备份时间处于业务高峰期

  • 数据库 IO 压力升高

  • 接口请求超时

  • 应用出现 504

同时还涉及:

  • MySQL 从库临时切换为可写

  • 主库恢复后重新恢复主从同步

  • Docker 容器中的 DB2 数据库重启恢复

这篇文章只记录核心处理流程。


一、问题现象

服务器负载检查:

复制代码
top

发现:

复制代码
mysqld CPU 占用非常高
xtrabackup 正在运行
wa(IO等待)升高

进一步检查:

复制代码
ps -ef | grep xtrabackup

发现备份任务:

复制代码
xtrabackup --backup ...

查看 crontab:

复制代码
crontab -l

发现:

复制代码
40 17 * * * /home/mysql_backup/backup.sh

也就是:

复制代码
每天 17:40 执行 MySQL 物理热备

而此时间段正处于业务高峰期。


二、停止 xtrabackup 备份任务

先停止备份进程:

复制代码
kill xtrabackup_PID

检查是否结束:

复制代码
ps -ef | grep xtrabackup

确认无进程即可。

随后删除未完成备份目录:

复制代码
rm -rf /home/mysql_backup/2026-05-16_1740

三、MySQL 从库临时切换为可写

由于主库异常,需要临时将从库接管业务。

登录从库:

复制代码
mysql -uroot -p

查看只读状态:

复制代码
show variables like 'read_only';
show variables like 'super_read_only';

默认:

复制代码
ON

停止主从复制:

复制代码
stop slave;

关闭只读:

复制代码
set global super_read_only=OFF;
set global read_only=OFF;

确认:

复制代码
show variables like 'read_only';
show variables like 'super_read_only';

结果:

复制代码
OFF

此时:

复制代码
从库正式切换为可写库

业务随后切换连接至从库。


四、从库无法连接问题处理(3306 防火墙)

虽然 MySQL 已监听:

复制代码
ss -lntp | grep 3306

但远程仍报:

复制代码
2002 - Can't connect to server
10060

检查 firewalld:

复制代码
firewall-cmd --list-all

发现:

复制代码
3306 未放通

直接关闭防火墙:

复制代码
systemctl stop firewalld
systemctl disable firewalld

随后从库恢复远程连接。


五、主库恢复正常后,重新切回只读并恢复同步

主库恢复后,需要把从库重新恢复为:

复制代码
只读 + 主从同步

重新开启只读:

复制代码
set global read_only=ON;
set global super_read_only=ON;

重新开启同步:

复制代码
start slave;

检查同步状态:

复制代码
show slave status\G

重点确认:

复制代码
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

说明主从同步恢复正常。


六、Docker 容器中的 DB2 数据库重启

环境中的 DB2 为 Docker 部署。

查看容器:

复制代码
docker ps

发现:

复制代码
db-db2

通过 docker restart 重启 DB2 容器服务

重启 Docker 部署的 DB2 容器(db-db2):

复制代码
docker restart db-db2

注意:本次操作执行的是 docker restart db-db2,属于重启单个 DB2 容器,并不是重启 Docker 服务。如果执行 systemctl restart docker,则是重启 Docker 引擎,可能导致该服务器上的所有容器受到影响。

复制代码
docker restart db-db2
= 重启某一个容器:db-db2

systemctl restart docker
= 重启 Docker 服务/ Docker 引擎

查看状态:

复制代码
docker ps | grep db-db2

查看日志:

复制代码
docker logs --tail=100 db-db2

关键日志:

复制代码
SQL1063N DB2START processing was successful.

说明:

复制代码
DB2 启动成功

七、故障总结

本次问题本质上是:

复制代码
MySQL 热备任务在业务高峰执行
导致数据库 IO 压力升高
接口请求超时
最终触发 504

这类问题在生产环境非常常见。

后续优化建议:

  • MySQL 备份改至凌晨低峰期

  • 备份与压缩分离

  • 避免高峰期执行 xtrabackup

  • 主从切换前必须确认原主库停止写入

  • Docker 数据库容器需保留快速重启方案

一句话总结:

复制代码
数据库很多时候不是"挂了",而是"被高峰期备份拖慢了"。
相关推荐
古城小栈1 小时前
K8s 核心知识 讲解
docker·容器·kubernetes
lifewange1 小时前
Vim 统一替换(全局替换)
linux·编辑器·vim
倔强的石头_1 小时前
彻底告别Row-By-Row:标量子查询外连接改写与向量化引擎深潜
数据库
2301_809244531 小时前
如何解决宝塔面板磁盘空间占满问题_使用磁盘清理工具清理
jvm·数据库·python
用户2367829801681 小时前
Linux netstat 命令深度解析:从网络连接到端口监控的完整实现
linux
六月雨滴1 小时前
Oracle 数据库网络安全
数据库·安全·dba
曾帅1681 小时前
linux ubuntu 挂载硬盘
linux·运维·ubuntu
En^_^Joy1 小时前
Django模型:数据库操作全指南
数据库·django·sqlite
六月雨滴1 小时前
Oracle 数据库网络安全之加密配置
数据库·web安全·oracle