[原创] 数据库碎片组合原理实现

  [复制链接]
  • TA的每日心情
    开心
    2012-5-10 21:03
  • 签到天数: 1 天

    [LV.1]布衣百姓

    9

    主题

    83

    回帖

    6349

    积分

    [INTOHARD]团长

    Rank: 8Rank: 8

    积分
    6349
    QQ
    发表于 2009-4-10 01:25:36 | 显示全部楼层 |阅读模式
    最近很多同行,在询问我关于MSSQL的MDF碎片文件的手工修复方法,其实这项工作操作起来,非常简单。

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

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

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

        由于时间有限,先写到此处。字节含义在下一段中再写,敬请谅解。页数据存储结构SLOT定位工具在编写中,希望有DEPHI软件开发能力者与本人交流。
       
    00:0F
    m_headerVersion
    m_type
    m_typeFlagBits
    m_level
    m_flagBits
    m_indexId
    m_prevPage(2)
    m_prevPage(1)
    pminlen
    10:1F
    m_nextPage(2)
    m_nextPage(1)
    m_slotCnt
    AllocUnitId.idObj
    m_freeCnt
    m_freeData
    20:2F
    m_pageId(2)
    m_pageId(1)
    m_reservedCnt
    m_lsn(1)
    m_lsn(2)
    30:3F
    m_lsn(3)
    m_xactReserved
    m_xdesId(2)
    m_xdesId(1)
    m_ghostRecCnt
    m_tornBits


    40
    4F

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


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



      

    该用户从未签到

    28

    主题

    94

    回帖

    106

    积分

    [INTOHARD]班长

    Rank: 2

    积分
    106
    发表于 2009-4-10 05:52:26 | 显示全部楼层
    学习了  增长见识

    该用户从未签到

    15

    主题

    674

    回帖

    9299

    积分

    [INTOHARD]团长

    浸淫

    Rank: 8Rank: 8

    积分
    9299
    发表于 2009-4-10 08:16:12 | 显示全部楼层
    不错,好东西。谢谢楼主!

    该用户从未签到

    18

    主题

    1353

    回帖

    1万

    积分

    [INTOHARD]团长

    Rank: 8Rank: 8

    积分
    13472
    QQ
    发表于 2009-4-10 08:58:59 | 显示全部楼层
    收藏一下,慢慢消化了.好東西!頂起來!!!
  • TA的每日心情
    开心
    2015-8-1 07:19
  • 签到天数: 15 天

    [LV.4]七品知县

    2

    主题

    954

    回帖

    1万

    积分

    [INTOHARD]团长

    Rank: 8Rank: 8

    积分
    14100
    发表于 2009-4-12 13:26:23 | 显示全部楼层
    好东西,支持一下啊

    该用户从未签到

    10

    主题

    140

    回帖

    1万

    积分

    [INTOHARD]旅长

    Rank: 9Rank: 9Rank: 9

    积分
    18800
    QQ
    发表于 2009-4-12 13:44:11 | 显示全部楼层
    有了这96个字节的含义,能恢复出磁盘簇大小大于8K的有碎片MDF文件。但对于簇大小 小于8K的,理论上手工能完全恢复。但是,在实际应用中,MDF文件都非常大。手工恢复需要的时间太长,而且在操作过程中难免会有出错的地方。所以,如果写软件代替,将事半功倍。

    该用户从未签到

    1

    主题

    11

    回帖

    16

    积分

    [INTOHARD]工兵

    Rank: 1

    积分
    16
    发表于 2009-4-19 15:15:40 | 显示全部楼层

    1111

    数据库修复技术,会的人不多,顶一下!
  • TA的每日心情
    开心
    2012-7-26 00:26
  • 签到天数: 2 天

    [LV.1]布衣百姓

    12

    主题

    290

    回帖

    7076

    积分

    [INTOHARD]团长

    古典音乐

    Rank: 8Rank: 8

    积分
    7076
    发表于 2009-4-24 01:04:44 | 显示全部楼层
    好文!顶一下!!!!!!!
  • TA的每日心情
    慵懒
    2019-3-26 09:25
  • 签到天数: 3 天

    [LV.2]九品芝麻官

    31

    主题

    799

    回帖

    1万

    积分

    [INTOHARD]团长

    Rank: 8Rank: 8

    积分
    12962
    发表于 2009-4-27 14:57:57 | 显示全部楼层
    就等别人研究出来啦!
  • TA的每日心情
    开心
    2015-9-6 23:23
  • 签到天数: 2 天

    [LV.1]布衣百姓

    1

    主题

    120

    回帖

    81

    积分

    [INTOHARD]班长

    Rank: 2

    积分
    81
    QQ
    发表于 2009-5-2 16:15:18 | 显示全部楼层
    有点深啊
    支持一下
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表