基于 Docker Compose 的一键式 MySQL InnoDB 恢复流程
下面是一个基于 Docker Compose 的一键式 MySQL InnoDB 恢复流程,适用于InnoDB 表损坏导致数据库无法正常启动的场景。该方案涵盖:
- 启动带有
innodb_force_recovery参数的 MySQL 容器 - 一键导出可恢复数据(使用
mysqldump) - 清理后恢复为干净环境(去掉恢复参数)
- 保留数据文件、SQL 文件及日志
场景说明
| 项目 | 值 |
|---|---|
| 使用方式 | docker-compose 管理 MySQL 容器 |
| 数据目录 | 映射至宿主机:./mysql_data |
| 目标 | 遇到 InnoDB 损坏时,一键恢复、导出、重新部署干净容器 |
一、项目目录结构
mysql-recovery/
├── docker-compose.yml
├── recovery.env
├── mysql/
│ └── my.cnf
├── dump/
├── scripts/
│ └── dump_all.sh
└── README.md
二、docker-compose.yml 配置(两阶段)
1. 第一阶段:挂载 innodb_force_recovery(恢复模式)
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql_recovery
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root123
volumes:
- ./mysql_data:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
ports:
- "3306:3306"
my.cnf中需要配置:
[mysqld]
innodb_force_recovery = 3
你可以调节恢复等级为
1~6,推荐从低等级尝试。
三、步骤流程概览
Step 1:启动恢复模式
docker-compose up -d
Step 2:执行一键导出脚本
scripts/dump_all.sh:
#!/bin/bash
MYSQL_USER="root"
MYSQL_PASS="root123"
CONTAINER="mysql_recovery"
DUMP_DIR="../dump"
mkdir -p "$DUMP_DIR"
echo "[INFO] 正在导出数据库列表..."
DBS=$(docker exec -i $CONTAINER \
mysql -u$MYSQL_USER -p$MYSQL_PASS -Nse \
"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('mysql','information_schema','performance_schema','sys');")
for DB in $DBS; do
echo "[INFO] 导出数据库:$DB"
docker exec $CONTAINER \
mysqldump -u$MYSQL_USER -p$MYSQL_PASS \
--single-transaction --skip-lock-tables --quick $DB \
> "$DUMP_DIR/${DB}.sql"
done
echo "[DONE] 所有数据库导出完成,文件保存在 $DUMP_DIR"
执行方式:
cd scripts
bash dump_all.sh
Step 3:关闭并移除恢复容器
docker-compose down
Step 4:清理恢复参数
编辑 ./mysql/my.cnf,删除或注释掉:
# innodb_force_recovery = 3
Step 5:启动干净环境并恢复数据
docker-compose up -d
然后进入容器导入 SQL 文件:
docker exec -i mysql_recovery mysql -uroot -proot123 < /dump/your_db.sql
或用脚本循环导入所有
.sql文件。
四、my.cnf 示例
路径:./mysql/my.cnf
[mysqld]
innodb_force_recovery = 3
skip-name-resolve
sql_mode=STRICT_ALL_TABLES
五、自动触发脚本(可选)
可编写一个检测容器启动失败 ➜ 自动设置 innodb_force_recovery ➜ 启动恢复容器 ➜ 自动 dump 的 恢复感知工具(适合 DevOps 场景)。如有需要我可提供。
六、参考资料
后续可选增强
| 需求 | 实现方案 |
|---|---|
| 📦 自动打包导出数据 | tar -czf dump_2025-07-06.tar.gz dump/ |
| 📤 上传 OSS/S3 | 使用 awscli / rclone 工具 |
🔄 使用 make 一键恢复 | make recover && make restore |
| 🧪 自动校验 SQL 可导入性 | mysql --dry-run 模式验证 |
BONUS:一键恢复脚本(Makefile 示例)
recover:
docker-compose down
echo "[INFO] 设置恢复模式..."
sed -i '/^\[mysqld\]/a innodb_force_recovery = 3' mysql/my.cnf
docker-compose up -d
restore:
docker-compose down
echo "[INFO] 清理恢复参数..."
sed -i '/innodb_force_recovery/d' mysql/my.cnf
docker-compose up -d
更多详细内容请关注其他相关文章!