在Linux系统中,当文件被意外删除后,有多种方法可以尝试恢复数据。本文档详细介绍了各种文件恢复技术,包括普通文件和数据库的恢复方法。
rm
命令删除文件时,系统只是将文件的inode标记为可用# 1. 立即停止对该分区的写操作
sudo mount -o remount,ro /path/to/partition
# 2. 卸载相关分区(如果可能)
sudo umount /path/to/partition
# 3. 创建磁盘镜像备份
sudo dd if=/dev/sdX of=/backup/disk_image.img bs=4M
功能强大的数据恢复工具,支持多种文件系统。
# 安装TestDisk
sudo apt-get install testdisk # Ubuntu/Debian
sudo yum install testdisk # CentOS/RHEL
# 使用TestDisk
sudo testdisk
使用步骤:
TestDisk套件中的文件恢复工具,专门用于恢复各种文件格式。
# 启动PhotoRec
sudo photorec
专门针对ext文件系统的恢复工具。
# 安装extundelete
sudo apt-get install extundelete
# 恢复指定文件
sudo extundelete /dev/sdX1 --restore-file path/to/deleted/file
# 恢复指定目录
sudo extundelete /dev/sdX1 --restore-directory path/to/deleted/directory
# 恢复所有删除的文件
sudo extundelete /dev/sdX1 --restore-all
基于文件头和尾部特征的数据雕刻工具。
# 安装Scalpel
sudo apt-get install scalpel
# 配置文件位置
sudo nano /etc/scalpel/scalpel.conf
# 运行恢复
sudo scalpel -o /recovery/output /dev/sdX1
另一个优秀的文件雕刻工具。
# 安装Foremost
sudo apt-get install foremost
# 恢复文件
sudo foremost -i /dev/sdX1 -o /recovery/output
# 查看二进制日志
mysql> SHOW BINARY LOGS;
# 查看日志内容
mysqlbinlog /var/lib/mysql/mysql-bin.000001
# 从指定时间点恢复
mysqlbinlog --start-datetime="2024-01-01 10:00:00" \
--stop-datetime="2024-01-01 11:00:00" \
/var/lib/mysql/mysql-bin.000001 | mysql -u root -p
# 恢复完整备份
mysql -u root -p database_name < backup.sql
# 恢复特定表
mysql -u root -p -e "source /path/to/table_backup.sql" database_name
# 恢复到特定位置
mysqlbinlog --start-position=154 --stop-position=368 \
/var/lib/mysql/mysql-bin.000001 | mysql -u root -p
# 配置恢复
echo "restore_command = 'cp /archive/%f %p'" >> recovery.conf
echo "recovery_target_time = '2024-01-01 10:30:00'" >> recovery.conf
# 启动恢复模式
pg_ctl start -D /var/lib/postgresql/data
# 恢复数据库
pg_restore -d database_name backup.dump
# 恢复特定表
pg_restore -d database_name -t table_name backup.dump
# 恢复整个数据库
mongorestore --db database_name /path/to/backup/
# 恢复特定集合
mongorestore --db database_name --collection collection_name /path/to/backup/
# 查看oplog
mongo --eval "db.oplog.rs.find().sort({ts:-1}).limit(10)"
# 从oplog恢复
mongorestore --oplogReplay --oplogLimit 1640995200:1 /path/to/backup/
# 搜索特定字符串
sudo dd if=/dev/sdX1 | strings | grep "search_pattern"
# 十六进制查看
sudo hexdump -C /dev/sdX1 | grep "pattern"
# 使用xfs_repair
sudo xfs_repair -n /dev/sdX1 # 检查模式
sudo xfs_repair /dev/sdX1 # 修复模式
# 检查文件系统
sudo btrfs check /dev/sdX1
# 恢复超级块
sudo btrfs rescue super-recover /dev/sdX1
# 查看RAID状态
cat /proc/mdstat
# 重新组装RAID
sudo mdadm --assemble --scan
# 强制组装
sudo mdadm --assemble --force /dev/md0 /dev/sd[abc]1
# 创建自动备份脚本
#!/bin/bash
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/home_backup.tar.gz /home
tar -czf $BACKUP_DIR/etc_backup.tar.gz /etc
# LVM快照
sudo lvcreate -L 1G -s -n home_snapshot /dev/vg0/home
# Btrfs快照
sudo btrfs subvolume snapshot /home /home/.snapshots/$(date +%Y%m%d)
# 安装trash-cli
sudo apt-get install trash-cli
# 使用trash代替rm
alias rm='trash'
# 恢复文件
trash-restore
# 使用安全删除别名
alias rm='rm -i' # 交互式删除
alias rm='echo "Use trash command instead"' # 禁用rm
# 设置文件不可删除属性
sudo chattr +i important_file
# 移除保护属性
sudo chattr -i important_file
# 使用inotify监控
sudo apt-get install inotify-tools
inotifywait -m -r -e delete /important/directory
文件恢复的成功率很大程度上取决于:
建议建立完善的备份策略,这是最可靠的数据保护方法。当发生数据丢失时,保持冷静,按照本文档的步骤进行操作,可以最大化数据恢复的成功率。