硬盘坏道检测脚本抢救服务器重要业务数据
服务器硬盘一旦出现坏道,业务数据就可能随时丢失。
本文要解决的核心问题是:如何用硬盘坏道检测脚本快速确认磁盘状态,并在坏道扩散前把重要业务数据完整抢救出来。
适合没接触过底层命令的站长和运维新手,跟着操作就能得到一个可执行的救急流程。
动手前先看清磁盘状态
坏道初期往往没有明显征兆,等系统出现 I/O 报错或文件读取卡顿再处理,风险已经很高。
所以第一步不是直接跑检测脚本,而是先确认哪块盘有异常。
登录服务器后执行:
smartctl -a /dev/sda
重点看 Reallocated_Sector_Ct 和 Current_Pending_Sector 两个指标,只要其中任意一个值大于 0,就说明硬盘已经出现物理坏道或正在重映射扇区,需要立刻启动抢救流程。
建议把这两项数值写进检测脚本,每次巡检自动输出告警。
用检测脚本圈定坏道范围
确认有坏道后,别急着全盘扫描,先按分区粒度缩小范围。
查看磁盘分区表:
fdisk -l /dev/sda
把疑似损坏的分区记录下来,再用 badblocks 做只读扫描,避免写入加重损坏:
badblocks -b 4096 -s -o /root/badblocks.txt /dev/sda1
参数说明:-b 4096 指定块大小,-s 显示进度,-o 把坏块列表输出到文件。
扫描期间服务器负载会明显上升,如果业务不能停,建议用 nice -n 19 降低优先级:
nice -n 19 badblocks -b 4096 -s -o /root/badblocks.txt /dev/sda1
这个脚本会把每个坏块的偏移量记录下来,后续恢复数据时就能跳过这些区域。
抢救数据的核心一步:ddrescue 镜像备份
检测到坏道后,最稳妥的做法不是直接在原盘上读取文件,而是把整个分区做成镜像。ddrescue 是专门应对坏道的工具,遇到读取错误会跳过并记录位置,不会卡死。
先安装:
# Debian/Ubuntu
apt install gddrescue
# CentOS/RHEL
yum install ddrescue
备份到另一块健康硬盘或网络存储,命令如下:
ddrescue -d -r 3 /dev/sda1 /mnt/backup/sda1.img /root/ddrescue.log
关键参数解释:-d 直接读取绕过系统缓存,-r 3 对失败块最多重试 3 次,日志文件记录恢复进度。
如果第一次中断,下次执行同一命令会从日志断点继续,不需要重头开始。
镜像完成后,用 mount -o loop,ro /mnt/backup/sda1.img /mnt/recover 只读挂载,然后复制出数据库文件、网站源码和配置目录。
避坑:这些操作会让数据更难救回
第一,不要对坏盘执行 fsck 或强制挂载写入,这会扩大物理损伤。
第二,不要反复重启服务器,电源浪涌可能让坏道区域磁头受损。
第三,检测脚本扫描时尽量避免高并发读写业务,最好在业务低峰期运行。
第四,badblocks 输出的是坏块编号,不是文件路径,千万别拿它直接去删除文件,否则可能误删好数据。
如果服务器同时有 RAID 阵列,处理方式不同:先确认阵列状态,不要随意把单块盘拔出来离线重建,建议先把整块盘做成镜像,再由阵列控制器做后续恢复。
验证抢救结果并建立日常巡检
数据复制出来后,先核对文件数量和大小:
diff -r /mnt/recover/www /var/www_backup 2>/dev/null | head -20
数据库文件最好用对应引擎的恢复工具做完整性校验,比如 MySQL 的 innodb_force_recovery 只适合应急读取,不要长期启用。
抢救完成后,把 smartctl 检查命令写进 cron 定时任务,每天自动巡检硬盘健康状态,发现异常立即通知你:
0 2 * * * smartctl -a /dev/sda | grep -E "Reallocated|Pending" >> /var/log/disk_health.log
硬盘坏道检测脚本的价值在于尽早发现、及时止损。
如果你正在处理这类故障,建议先按本文步骤做镜像备份,再根据备份恢复业务数据;
遇到扫描结果异常或命令报错,优先回看避坑部分,不要盲目重试写操作。
数据安全没有后悔药,提前具备这套救急流程,遇到坏道时才不会手忙脚乱。