异常断电引起的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