基于 Docker Compose 的一键式 MySQL InnoDB 恢复流程
                           
天天向上
发布: 2025-07-06 14:26:07

原创
46 人浏览过

下面是一个基于 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

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *