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

一句话总结:

复制代码
数据库很多时候不是"挂了",而是"被高峰期备份拖慢了"。
相关推荐
GBASE5 小时前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr15 小时前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
AlfredZhao1 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
唐青枫2 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
吃糖的小孩2 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
小满8782 天前
5.Mysql事务隔离级别与锁机制
mysql
笃行3502 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3502 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3502 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
元Y亨H2 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql