恢复 MySQL 服务(Docker 环境专用)

异常断电引起的MySQL不可用,恢复 MySQL 服务(Docker 环境专用)

1、确认 MySQL 容器使用的 volume

  • 运行以下命令查看 ehigh-mysql 容器挂载的卷:
sh 复制代码
docker inspect ehigh-mysql | grep -A 10 -B 5 "Source\|Destination"

2、立即备份整个数据目录

sh 复制代码
sudo cp -r /home/ehdata/mysql /home/backup/mysql/cache

3、尝试用 innodb_force_recovery=1 启动一个临时恢复容器

  • 如果看到 mysqld: ready for connections 或容器保持运行不退出 → 成功!
  • 如果几秒后退出,说明 =1 不够,尝试 =2=3......
  • 不要直接跳到 4+,除非 1~3 都失败。level 4 以上会跳过索引重建,可能导致导出数据不完整。

确保 recovery 容器运行(使用 force-recovery 模式)

sh 复制代码
docker stop mysql-recovery 2>/dev/null || true
docker rm mysql-recovery 2>/dev/null || true
sh 复制代码
docker run -it --rm \
  --name mysql-recovery \
  -v /home/ehdata/mysql:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=eHIGH2014 \
  ehigh-mysql:8.0.39 \
  --innodb-force-recovery=1

sh 复制代码
docker run -it --rm \
  --name mysql-recovery \
  -v /home/ehdata/mysql:/var/lib/mysql \
  -v /opt/ehighps/common/config/mysql/mysqld.cnf:/etc/mysql/conf.d/mysqld.cnf \
  ehigh-mysql:8.0.39 \
  --innodb-force-recovery=1

sh 复制代码
docker run -it --rm \
  --name mysql-recovery \
  -v /home/ehdata/mysql:/var/lib/mysql \
  -v /opt/ehighps/common/config/mysql/mysqld.cnf:/etc/mysql/conf.d/mysqld.cnf \
  ehigh-mysql:8.0.39 \
  --innodb-force-recovery=1

4、若上述级别异常,则尝试更高恢复级别

  • =6完全跳过 redo log roll-forward
  • 数据页可能是"过时"的,但 某些表可能还能 SELECT
  • 启动后 只能做 SELECT,不能 DROP/CREATE/INSERT
sh 复制代码
docker run -it --rm \
  --name mysql-recovery \
  -v /home/ehdata/mysql:/var/lib/mysql \
  ehigh-mysql:8.0.39 \
  --innodb-force-recovery=6

5、立即导出你能访问的数据

  • 直接在容器内执行 mysqldump(推荐)

  • 导出全部数据库(注意:只能 SELECT,不能写

sh 复制代码
docker exec -t mysql-recovery mysqldump -u root -p'eHIGH2014' --all-databases > /home/ehdata/full_recovery.sql
项目 说明
🔒 数据库状态 只读!不能 INSERT, UPDATE, DROP
📁 数据目录 /home/ehdata/mysql 中的文件可能已被修改或损坏,不要继续使用
🔄 是否可重启 不要重启容器!一旦退出,下次再启动可能又崩溃

数据保存完后,停止 recovery 容器

sh 复制代码
docker stop mysql-recovery
docker rm mysql-recovery

6、保存所有能导出的数据

sh 复制代码
cp /home/ehdata/full_recovery.sql /home/backup/mysql/full/

7、启动容器

sh 复制代码
# 停止并删除旧容器(如果还在)
docker stop ehigh-mysql 2>/dev/null
docker rm ehigh-mysql 2>/dev/null

# 清空损坏的数据(确保已备份!)
sudo rm -rf /home/ehdata/mysql/*

sh 复制代码
# 1. 确保容器已删除
docker stop ehigh-mysql 2>/dev/null && docker rm ehigh-mysql 2>/dev/null

# 2. 清空数据目录(⚠️ 确认你已有 SQL 备份!)
sudo rm -rf /home/ehdata/mysql/*

8、修复 init.sql 脚本(若出现)

  • 编辑你的初始化脚本文件
sh 复制代码
sudo vim /opt/ehighps/common/db/init.sql
sh 复制代码
-- 创建用户(替换 your_strong_password 为你的真实密码)
CREATE USER IF NOT EXISTS 'ehigh'@'%' IDENTIFIED BY 'eHIGH2014';

-- 授权
GRANT ALL PRIVILEGES ON *.* TO 'ehigh'@'%';

-- 刷新权限
FLUSH PRIVILEGES;

9、启动MySQL

sh 复制代码
docker run -d \
  --name ehigh-mysql \
  --restart=always \
  -p 3306:3306 \
  -v /home/ehdata/mysql:/var/lib/mysql \
  -v /opt/ehighps/common/config/mysql/mysqld.cnf:/etc/mysql/conf.d/mysqld.cnf \
  -v /opt/ehighps/common/db:/docker-entrypoint-initdb.d \
  -e MYSQL_ROOT_PASSWORD=eHIGH2014 \
  -e MYSQL_DATABASE=limited_space \
  ehigh-mysql:8.0.39

10、解决导出文件异常问题

  • 查看文件开头内容
sh 复制代码
head -n 10 /home/ehdata/full_recovery.sql
  • 生成一个干净的 SQL 文件
sh 复制代码
sed '/^mysqldump:/d' /home/ehdata/full_recovery.sql > /home/ehdata/clean_recovery.sql
  • 验证 clean.sql 是干净的
sh 复制代码
head -n 3 /home/ehdata/clean_recovery.sql

11、导入干净的 SQL 文件

sh 复制代码
docker exec -i ehigh-mysql mysql -u root -p'eHIGH2014' < /home/ehdata/clean_recovery.sql
相关推荐
程序员老赵8 小时前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua11112 小时前
LM Studio Docker 部署——本地大模型一键启动
docker
Jim6001 天前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障
mysql
曲幽2 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
GreatSQL2 天前
gt-checksum v4.0.0 新功能解读系列文章(4):SSL 加密连接——数据校验传输安全再升级
mysql
武子康3 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
云技纵横5 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二5 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
小猿姐5 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops