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 数据库容器需保留快速重启方案

一句话总结:

复制代码
数据库很多时候不是"挂了",而是"被高峰期备份拖慢了"。
相关推荐
知行合一。。。2 小时前
RAG--03--Milvus基本用法
数据库·oracle·milvus
志栋智能2 小时前
超自动化运维如何支持合规审计?
运维·自动化
TDengine (老段)2 小时前
TDengine 线程模型 — 网络、调度、执行
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
小诗懂技术2 小时前
【网络通信UDP】基础 进程间不同主机的通信
运维·服务器·网络
名字还没想好☜2 小时前
Docker 容器安全加固实战:非 root、只读根文件系统、drop capabilities 与最小攻击面
运维·安全·docker·容器·kubernetes
琥珀色糖3 小时前
Linux守护进程
linux·终端·守护进程·会话·进程组
鹤落晴春3 小时前
有状态应用 vs 无状态应用
运维·云原生·k8s
上学的小垃圾3 小时前
01-数据库系统概述
数据库
码--到成功3 小时前
Docker、Kubernetes安装系列 二
docker·容器·kubernetes
二进制漫游记4 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding