记录一次数据恢复过程

本周由于机器迁移,结果一台迁移后发现很多服务不能正常启动,用户登录也是login后会快速的logout。第一反应是文件系统损坏了。 但是首要任务还是要进入系统,于是我使劲的回忆着以前是否有相同的现象发生过,突然想起来以前在madhouse的时候一台内网freebsd机器也出现过类似的问题。那次文件的问题是tcsh出现了问题,后来改成sh后进入系统后重新安装了tcsh就好了,但是至于是什么原因,应该是就是文件系统在重启的时候给损坏了。 于是这次我想用同样的方式来进行,但是进入单用户模式后更改root的shell在登录发现还是同样的情况。那看来估计是硬盘损坏了,于是用了Livecd上的磁盘检测工具进行检测,但是时间太长就放弃了。 这个服务器不能启动对于内网测试来说是重大的打击,上面所有静态文件和数据库都在上面呢,还有邮件和dns服务呢。没有办法,没有任何备份,于是只能一点点从公网上进行恢复下来,这个几乎花了我一天多的时间全都在整这个事情。那块硬盘就交给专业数据恢复公司进行恢复了。本来说好当天就可以的,结果给我弄了2天还没好,于是一狠心就要回来自己弄了。 要说这些专业数据恢复公司也就只能恢复恢复windows下的数据,而对于Linux下的分区基本也算是新手。 星期五一早硬盘回来了,网上搜索了会。 首先是把硬盘挂在到一个Linux系统,我自己是UBUNTU,所以直接挂上启动机器就行。这个时候要注意硬盘的启动顺序,这个在新的BIOS里都可以自己设定,但是一些老的机器的BIOS可能都得靠硬盘跳线来完成启动顺序的选择了,具体可以参考硬盘上的说明。 进入系统后先不要进行mount,我们先用fsck对分区进行扫描修复。

1
fsck -y /dev/sdb1

这里的sdb1就是我那块坏掉的硬盘的根分区。如果你不能确定的话直接用

1
fdisk -l 

来进行查看就行了。 接着就进行一次模拟分区

1
mkfs.ext3 -n /dev/sda1 

切记一定要加上-n这个参数,这个表示模式分区,而不是真实的。 接着就把这个硬盘mount到系统中现有的一个目录下

1
mount -o sb=131072 /dev/sda1 /mnt/redhat 

这样就把这个根分区下的东西全部找到了。也可以对它进行修改操作。 这个还只是第一步呢对于我来说,由于数据库是innodb的,所以直接拷贝数据库文件是无法把数据倒出来的,当时想唯一的办法只能先装个mysql-server,然后根据ibdata进入到数据库中,然后用mysqldump把数据库全部倒出。可这个数据库安装半天,把数据目录一指向原来的数据库目录就是起不来。这样折腾来折腾去弄了半天没有任何进展,这些可愁坏我了。突然看到数据库的bin-log还是全部保留的。 于是就启动起来mysql后,通过bin-log来进行恢复数据。具体方法为

1
mysqlbinlog bing-log.0000001 | mysql -uroot -p