起因是我做了一个毁灭性操作-强制删除了/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 每天凌晨备份

✅ 你现在该做什么?

  1. 立刻执行 ps aux | grep mysqld
  2. 如果进程还在 → 用 /proc 恢复(方法一)
  3. 如果进程没了 → 用 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
    
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐