?
SQLserver数据文件(MDF)的页面文件头结构剖析
先执行一下以下SQL语句,我的测试环境为SQL2005
 dbcc
traceon(
3604
)
go

dbcc
page(master,
1
,
0
,
2
)
可以看到MDF文件的一些物理结构信息,其中包括重要的头96个字节。也就是第一个页面的文件头。
........
PAGE HEADER:
Page @0x03FA0000
m_pageId = (1:0) m_headerVersion = 1 m_type = 15 m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8 m_objId (AllocUnitId.idObj) = 99 m_indexId (AllocUnitId.idInd) = 0 Metadata: AllocUnitId = 6488064 Metadata: PartitionId = 0 Metadata: IndexId = 0 Metadata: ObjectId = 99 m_prevPage = (0:0) m_nextPage = (0:0) pminlen = 0 m_slotCnt = 1 m_freeCnt = 7937 m_freeData = 3059 m_reservedCnt = 0 m_lsn = (149:448:1) m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0 m_tornBits = -1073741694
........
DATA:
Memory Dump @0x62FEC000
62FEC000: 010f0000 08000000 00000000 00000000 ?................ 62FEC010: 00000000 00000100 63000000 011ff30b ?........c....... 62FEC020: 00000000 01000000 95000000 c0010000 ?................ 62FEC030: 01000000 00000000 00000000 820000c0 ?................ 62FEC040: 00000000 00000000 00000000 00000000 ?................ 62FEC050: 00000000 00000000 00000000 00000000 ?................
以上蓝色的文字就是文件头的一些信息。如果这些信息损坏将会造成严重的后果。
经过简单的逐个字节分析,中间借助了windows计算器和c#的BitConverter.GetBytes函数。得出了如下文件结构图,其中每行4个字节,一共分析了文件头的前64个字节。
?
|