SQL Server 简单模式下,误删除堆表记录进行数据恢复(技术贴)3.DBCC IND命令来找到数据页id,找到数据页id:2
SQL Server 简单模式下,误删除堆表记录进行数据恢复(技术贴)
3.DBCC IND命令来找到数据页id,找到数据页id:219,这个数据页存放了test_del的数据

使用dbcc page查看数据页的内容以及行偏移量
dbcc page(repl_test,1,219,1)
go
输出结果为:
DATA:
Slot 0, Offset 0x60, Length 21, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21
Memory Dump @0x00000000120CC060
0000000000000000: 10001200 01000000 726f7720 31202020 ?........row 1
0000000000000010: 20200200 00?????????????????????????? ...
Slot 1, Offset 0x75, Length 21, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21
Memory Dump @0x00000000120CC075
0000000000000000: 10001200 02000000 726f7720 32202020 ?........row 2
0000000000000010: 20200200 00?????????????????????????? ...
Slot 2, Offset 0x8a, Length 21, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21
Memory Dump @0x00000000120CC08A
0000000000000000: 10001200 03000000 726f7720 33202020 ?........row 3
0000000000000010: 20200200 00?????????????????????????? ...
Slot 3, Offset 0x9f, Length 21, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21
Memory Dump @0x00000000120CC09F
0000000000000000: 10001200 04000000 726f7720 34202020 ?........row 4
0000000000000010: 20200200 00?????????????????????????? ...
Slot 4, Offset 0xb4, Length 21, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21
Memory Dump @0x00000000120CC0B4
0000000000000000: 10001200 05000000 726f7720 35202020 ?........row 5
0000000000000010: 20200200 00?????????????????????????? ...
OFFSET TABLE:
Row - Offset
4 (0x4) - 180 (0xb4)
3 (0x3) - 159 (0x9f)
2 (0x2) - 138 (0x8a)
1 (0x1) - 117 (0x75)
0 (0x0) - 96 (0x60)
其中行偏移量第一行为96 (0x60),实际记录为row 1,row 2: (0x75),row 3: (0x8a),row 4:(0x9f),row 5: (0xb4)
4. 删除第三行数据 a = 3,b = row 3的记录
说明a=3 b=row3的记录已经被删除。
5.再次查看数据页的行偏移 果然第3行的行偏移量为00 00,那么我将其改回8A 00后保存,(删除记录前,我对该页的页眉16进制代码进行了截图,还原记录时人工对应截图修改回了页眉16进制码)并将数据库设置为online
记录被成功恢复。
可惜小弟不才,还没研究页眉结构对应的物理16进制关系。只靠修改前的页眉截图,修改后按照截图还原页眉,这里无法向大家说明白修改的地方。希望有经验或者有兴趣的朋友可以和我分享下,谢谢~
文笔不好,如果哪里看的模糊请留言。 sql?server 数据库
[解决办法]高,学习了,感谢分享。
[解决办法]个人感觉这种方式只适合研究数据库的原理,而不适合实际应用
因为在实际情况下,误删数据时不可能提供这么多信息供你做恢复参考的
[解决办法]楼主的探索精神值得学习,真的!!!
现实的情况是,做的内部系统,很多表主键没有,约束没有,索引没有,到处select * 各种不规范
人们对数据的认识停留在很浅的层次
你写出了一个页面,人家点两下,不报错,再加上整个样式啥的,看起来“还不错”
老板眼里你比那弄数据库的强多了,
弄数据的,老板看不见,摸不着,除了问题还怪你恢复的不及时,没有问题更觉着你没“价值”
哎,数据库不玩到一定的水平,一个数据库管理员的作用看起来微乎其微
[解决办法]
期待后续。另外我听说过能通过mdf找回比较高百分比的数据,估计他们的原理和你的差不多。
[解决办法]
膜拜一下~~那么只是适合堆表吗?还有如果批量删除数据的话。。这个方法可以批量找回吗?
[解决办法]
首先要知道删除的数据所在的文件号页面号,而且delete之后再多insert几下可能Slot 2就被使用了,所以实际应用上没太大的可操作性。
而且实际的表有N个页面,在Heap的IAM_Chain里面要查出被删除数据页面号,难度可向而知。
知道页面号的情况下,用DBCC WRITEPAGE在线情况下就可以改回来。
[解决办法]