数据库碎片组合原理实现
最近很多同行,在询问我关于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
学习了增长见识 不错,好东西。谢谢楼主! 收藏一下,慢慢消化了.好東西!頂起來!!! 好东西,支持一下啊 有了这96个字节的含义,能恢复出磁盘簇大小大于8K的有碎片MDF文件。但对于簇大小 小于8K的,理论上手工能完全恢复。但是,在实际应用中,MDF文件都非常大。手工恢复需要的时间太长,而且在操作过程中难免会有出错的地方。所以,如果写软件代替,将事半功倍。
1111
数据库修复技术,会的人不多,顶一下! 好文!顶一下!!!!!!! 就等别人研究出来啦! 有点深啊支持一下