dlcyj 发表于 2009-4-10 01:25:36

数据库碎片组合原理实现

最近很多同行,在询问我关于MSSQL的MDF碎片文件的手工修复方法,其实这项工作操作起来,非常简单。

原理是:MDF文件的基本组成单位是页,页的上层结构为盘区,页与页之间也为链式结构,即一个页由前一个页指向位置,然后本身又指向下一个页,对于页中的大部分数据类型都是按照此方法,如果页中有BLOB数据,则由指针指向,MDF中页有缺损或丢失,则数据库将无法正常附加或运行,因为库本身对页将进行非常严格的校验。

   数据库文件在被删除或者格式后化,软件恢复出来的基本上都是不完整数据。这是因为数据库在使用中,每天都要进行大量的INSERT INTO或DROP操作,存储上为连续结构比较少。能在手工上将数据库碎片组合起来,是每个数据修复技术同行的追求目标。

    下面为MDF文件的前96字节的文件头定义,此文件头中详细地描述了MDF文件的页链结构,我想有很多数据库修复人员已经掌握此类技术,所以不在此过多地展示细节,不懂的同仁,在掌握此文件结构后,对数据库的手工组合,也不会有技术上的障碍。
   本人在此结构基础上,写个页链结构VIEW工具,由于工具公开对市场的冲击性,所以不便提供,有能力者可与本人交流。   

    由于时间有限,先写到此处。字节含义在下一段中再写,敬请谅解。页数据存储结构SLOT定位工具在编写中,希望有DEPHI软件开发能力者与本人交流。
    00:0Fm_headerVersionm_typem_typeFlagBitsm_levelm_flagBitsm_indexIdm_prevPage(2)m_prevPage(1)pminlen10:1Fm_nextPage(2)m_nextPage(1)m_slotCntAllocUnitId.idObjm_freeCntm_freeData20:2Fm_pageId(2)m_pageId(1)m_reservedCntm_lsn(1)m_lsn(2)30:3Fm_lsn(3)m_xactReservedm_xdesId(2)m_xdesId(1)m_ghostRecCntm_tornBits

40:4F

m_pageId(1)值为1时,都是0


50:5F
m_pageId(1)值为1时,都是0


yuwufeichen 发表于 2009-4-10 05:52:26

学习了增长见识

xulemeng 发表于 2009-4-10 08:16:12

不错,好东西。谢谢楼主!

dgtan 发表于 2009-4-10 08:58:59

收藏一下,慢慢消化了.好東西!頂起來!!!

xiongdeyuan 发表于 2009-4-12 13:26:23

好东西,支持一下啊

wnving 发表于 2009-4-12 13:44:11

有了这96个字节的含义,能恢复出磁盘簇大小大于8K的有碎片MDF文件。但对于簇大小 小于8K的,理论上手工能完全恢复。但是,在实际应用中,MDF文件都非常大。手工恢复需要的时间太长,而且在操作过程中难免会有出错的地方。所以,如果写软件代替,将事半功倍。

wcy6820 发表于 2009-4-19 15:15:40

1111

数据库修复技术,会的人不多,顶一下!

reeker 发表于 2009-4-24 01:04:44

好文!顶一下!!!!!!!

lhw8033 发表于 2009-4-27 14:57:57

就等别人研究出来啦!

tonxiankun 发表于 2009-5-2 16:15:18

有点深啊
支持一下
页: [1] 2 3 4 5
查看完整版本: 数据库碎片组合原理实现