首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL Server 简单模式上,误删除堆表记录进行数据恢复(技术贴)

2013-02-15 
SQL Server 简单模式下,误删除堆表记录进行数据恢复(技术贴)3.DBCC IND命令来找到数据页id,找到数据页id:2

SQL Server 简单模式下,误删除堆表记录进行数据恢复(技术贴)


3.DBCC IND命令来找到数据页id,找到数据页id:219,这个数据页存放了test_del的数据

SQL Server 简单模式上,误删除堆表记录进行数据恢复(技术贴)

使用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


SQL Server 简单模式上,误删除堆表记录进行数据恢复(技术贴)
 

记录被成功恢复。

可惜小弟不才,还没研究页眉结构对应的物理16进制关系。只靠修改前的页眉截图,修改后按照截图还原页眉,这里无法向大家说明白修改的地方。希望有经验或者有兴趣的朋友可以和我分享下,谢谢~

文笔不好,如果哪里看的模糊请留言。 sql?server 数据库
[解决办法]
高,学习了,感谢分享。
[解决办法]
个人感觉这种方式只适合研究数据库的原理,而不适合实际应用

因为在实际情况下,误删数据时不可能提供这么多信息供你做恢复参考的


[解决办法]
引用:
引用:个人感觉这种方式只适合研究数据库的原理,而不适合实际应用

因为在实际情况下,误删数据时不可能提供这么多信息供你做恢复参考的
很多数据是可以自己计算出来的,目前我了解的,除了页眉格式外,其他的都已经能确保推出需要的数据了。
其实可以利用这个原理继续深入,


楼主的探索精神值得学习,真的!!!

现实的情况是,做的内部系统,很多表主键没有,约束没有,索引没有,到处select * 各种不规范



人们对数据的认识停留在很浅的层次

你写出了一个页面,人家点两下,不报错,再加上整个样式啥的,看起来“还不错”

老板眼里你比那弄数据库的强多了,

弄数据的,老板看不见,摸不着,除了问题还怪你恢复的不及时,没有问题更觉着你没“价值”

哎,数据库不玩到一定的水平,一个数据库管理员的作用看起来微乎其微
[解决办法]
SQL Server 简单模式上,误删除堆表记录进行数据恢复(技术贴)期待后续。另外我听说过能通过mdf找回比较高百分比的数据,估计他们的原理和你的差不多。
[解决办法]
SQL Server 简单模式上,误删除堆表记录进行数据恢复(技术贴)膜拜一下~~那么只是适合堆表吗?还有如果批量删除数据的话。。这个方法可以批量找回吗?
[解决办法]
首先要知道删除的数据所在的文件号页面号,而且delete之后再多insert几下可能Slot 2就被使用了,所以实际应用上没太大的可操作性。

而且实际的表有N个页面,在Heap的IAM_Chain里面要查出被删除数据页面号,难度可向而知。

知道页面号的情况下,用DBCC WRITEPAGE在线情况下就可以改回来。

[解决办法]

支持lz继续研究~早日发布成果给大家分享呵呵
[解决办法]
引用:
引用:首先要知道删除的数据所在的文件号页面号,而且delete之后再多insert几下可能Slot 2就被使用了,所以实际应用上没太大的可操作性。

而且实际的表有N个页面,在Heap的IAM_Chain里面要查出被删除数据页面号,难度可向而知。

知道页面号的情况下,用DBCC WRITEPAGE在线情况下就可以改回来。
槽2可能……

不锁表或不删除表的前提下,堆表的delete是不会release page的。详见
http://support.microsoft.com/kb/913399/en-us
[解决办法]
删除记录 ,有时 在空间不够的情况 或者有转移记录 的 幻想记录 等这种方法可能不行

热点排行