恢复mysql数据表-不小心删除了/var/lib/mysql
起因是我做了一个毁灭性操作-强制删除了/var/lib这个目录,但其实我做这个操作是想要重装mysql,鬼使神差地执行了操作。因为是个人部署,mysql数据不是很重要,但是我还是想知道怎么恢复。以下给出了我问ai的一些记录,我认为可参考的就摘出来了。后面也给出了一般用于恢复数据表的一个完整步骤。
1. ai问答【用于参考,可以直接看后面的"数据表恢复"】
Q1:不小心执行了rm -rf /var/lib/mysql后果?
⚠️ 这是毁灭性操作!
你刚刚删除了 MySQL 的所有数据目录(/var/lib/mysql
及其子目录),包括:
- 所有数据库、表、索引
- 所有用户、权限
- InnoDB 系统表空间(
ibdata1
) - 二进制日志、redo log、undo log
→ 业务数据已全部丢失,除非有备份!
✅ 你现在最该做的:判断是否能找回数据
🔍 第一步:确认 MySQL 是否还在运行(关键!)
ps aux | grep mysqld
- 如果 MySQL 进程还在 → 有救!可以用
/proc/<pid>/fd
找回被删的文件(见下方方法) - 如果 进程已退出 → 只能尝试文件系统级恢复(extundelete)
✅ 方法一:MySQL 进程还在 → 用 /proc
恢复(成功率极高)
# 找到 mysqld 的进程号
ps aux | grep mysqld
# 假设 PID 是 1234
ls -l /proc/1234/fd | grep -E '\.(ibd|ibdata|frm|MYD|MYI)$'
你会看到类似:
lrwx------ 1 mysql mysql 64 Aug 4 16:00 10 -> /var/lib/mysql/ibdata1 (deleted)
这些文件虽然被删了,但只要进程没退出,数据还在内存里,你可以直接复制出来:
# 恢复 ibdata1
cp /proc/1234/fd/10 /var/lib/mysql/ibdata1
# 恢复其他表文件
cp /proc/1234/fd/XX /var/lib/mysql/yourdb/yourtable.ibd
# 修复权限
sudo chown -R mysql:mysql /var/lib/mysql
# 重启 MySQL
sudo systemctl start mysqld
这个方法不需要第三方工具,成功率极高,只要进程没重启就能救回几乎全部数据。
✅ 方法二:MySQL 已退出 → 用 extundelete
恢复(成功率一般)
# 安装 extundelete
sudo yum install -y extundelete
# 卸载磁盘(防止写入覆盖)
sudo umount /dev/vda1 # 根据实际磁盘替换
# 恢复整个目录
sudo extundelete /dev/vda1 --restore-directory /var/lib/mysql
恢复的文件会出现在:
RECOVERED_FILES/var/lib/mysql/
然后:
# 复制回原位
sudo cp -a RECOVERED_FILES/var/lib/mysql/* /var/lib/mysql/
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysqld
⚠️ 注意:extundelete 只能恢复未被覆盖的文件,越早操作越好。
✅ 方法三:如果以上都失败 → 只能重装 + 接受数据丢失
- 重装步骤我前面已经发给你了;
- 以后务必开启 binlog 和定时备份(见下方建议)。
✅ 建议:以后一定要做的事
操作 | 命令示例 |
---|---|
开启 binlog | 在 /etc/my.cnf 添加:log_bin=mysql-bin binlog_format=ROW |
每日备份 | mysqldump -uroot -p --all-databases > /backup/all_$(date +%F).sql |
自动脚本 | 用 crontab -e 每天凌晨备份 |
✅ 你现在该做什么?
- 立刻执行
ps aux | grep mysqld
- 如果进程还在 → 用
/proc
恢复(方法一) - 如果进程没了 → 用
extundelete
(方法二)
2. 数据表恢复,根据步骤即可完成
我尝试过了,我的数据还在内存中,没有丢失的情况下可以用这种方法进行恢复,因为是个人部署,数据也没那么重要,实际生产环境应该要定时备份!!!
你看到的这些 (deleted)
文件,说明它们已经被删除,但 MySQL 进程(PID 18561)仍然持有这些文件的文件描述符,所以它们实际上还在内存中,数据尚未丢失。
但你在尝试用 cp
恢复 ibdata1
时遇到错误:
cp: 无法创建普通文件"/var/lib/mysql/ibdata1": 没有那个文件或目录
这个错误并不是说你不能恢复文件,而是说明 目标目录 /var/lib/mysql
不存在了,或者被重命名了。你可以先检查:
ls -ld /var/lib/mysql
大概率这个目录已经被删除或移动了。
✅ 正确恢复步骤如下:
1. 确保 MySQL 进程还在运行(这很关键)
ps aux | grep [m]ysqld
2. 创建缺失的目录(如果确实不存在)
sudo mkdir -p /var/lib/mysql
sudo chown mysql:mysql /var/lib/mysql
3. 恢复 ibdata1
sudo cp /proc/18561/fd/10 /var/lib/mysql/ibdata1
sudo chown mysql:mysql /var/lib/mysql/ibdata1
执行了sudo cp /proc/18561/fd/10 /var/lib/mysql/ibdata1这个命令后ibdata1恢复了,下面是ai对目录解释
4. 恢复其他 .ibd
文件
你可以用类似方式恢复其他 .ibd
文件,比如:
sudo cp /proc/18561/fd/14 /var/lib/mysql/mysql.ibd
sudo chown mysql:mysql /var/lib/mysql/mysql.ibd
5. 恢复数据库目录结构(如 community
目录)
sudo mkdir -p /var/lib/mysql/community
sudo cp /proc/18561/fd/23 /var/lib/mysql/community/comment.ibd
sudo chown mysql:mysql /var/lib/mysql/community/comment.ibd
依次类推,恢复所有 .ibd
文件。
⚠️ 注意事项
-
不要重启 MySQL! 一旦重启,文件描述符会丢失,数据就真的没了。
-
恢复后建议立即做全库备份:
mysqldump --all-databases --single-transaction > /root/mysql_backup_$(date +%F).sql
更多推荐
所有评论(0)