我在做MDFfind软件前,有10年时间再做医疗保险刷卡系统程序,这是个管理程序,终端刷卡数据存放在MSSQL数据库中,由于工作人员操作失误,从企业管理器里面删除了数据库,直接导致MDF和ldf文件被删除.。发现后立即用easyrecover等通用文件恢复工具恢复了MDF文件,发现文件大小也对,可是附加却怎么附加不上。换了其他的文件恢复工具也能恢复MDF,但同样不能附加。那时不知到什么原因,搞的赔偿客户4千多元数据损失费用。
等我2011年下半年不再为烦琐的MIS程序开发的时候,深入研究了下MSSQL的MDF文件结构和文件系统结构,终于搞清楚当年我碰到的问题的原因和正确的解决方法。
在Fat32系统里,文件被删除后,FAT表里面对应的簇链表被清0,通用恢复软件一般是根据文件大小和文件起始簇这两个能知道的信息直接从硬盘起始簇连续copy相当于文件大小的字节作为恢复的文件。但对SQL这种自动增长的大文件来说,一般在磁盘上是不连续存放的,因此从硬盘起始簇连续copy相当于文件大小的字节作为恢复的文件是只有前面很少一部分是正确的数据,其他的并不是正确的数据。
在NTFS文件系统里,由于SQL数据文件大,不连续存放的簇有很多,那类似FAT簇链表的datarun会很大,如果SQL数据文件被删除,大到一定程度的DATArun就会被释放空间,导致通用恢复软件一样无法取得文件所有簇号信息而无法正确恢复文件。
这就是为什么恢复软件找到的SQL数据文件附加失败的原因。因为找回的不是真正原来的文件。
正确的处理应该是根据MDF文件结构特点从磁盘扫描所有符合MDF文件特点的数据,然后根据MDF文件特点和规律组合成用户需要的MDF文件。然后再用sp_attach_single_file_db 附加数据库。
经过不间断的努力,MDFFIND开发成功,希望能够解决碰到同样问题的朋友的烦恼。
该MDFfind是一款SQLSERver数据文件删除恢复的专用工具,它从磁盘扫描删除的SQL数据文件碎片,并把它们组合成一个完整的MDF文件,用于直接附加.即使MDF文件被部分覆盖,该工具依然可以把未覆盖部分的表数据提取出来。
我的csdn资源里面也有。