SQL Server简单模式下,误删除堆表记录如何恢复(绕过页眉校验)(二)

2014-11-24 09:52:35 · 作者: · 浏览: 1
.......row 4
00000000120CC0B0: 20020000 10001200 05000000 726f7720 ...........row
00000000120CC0C0: 35202020 20200200 00000021 21212121
发现row3的记录还存在数据页中!
那么猜想,是否将第三行的行偏移量0x0修改回原来的0x8a就可以恢复记录了?
利用winHex工具,打开mdf文件,因为是219页面,8*220 = 1802240字节,所以219的行偏移量应该在1802239处,剩下的工作就很简单了
6.关闭数据库的数据页I/O保护机制,即设置page_verify数据库选项为none,并将repl_test 数据库设置为脱机,利用winhex找到repl_test.mdf文件的1802240结尾处16进制码
alter database repl_test set page_verify none
go
use master
alter database repl_test set offline
go
把repl_test数据库设置为脱机,用winhex工具找到219页面的结尾处(220页面的其实位置):
果然第3行的行偏移量为00 00,那么我将其改回8A 00后保存,并将数据库设置为online
记录被成功恢复。
如果不进行
alter database repl_test set page_verify none
go
则会读取表时发生页面校验错误。
那么如何找回记录又可以DBCC checkdb安全通过呢?
1.笨方法找回记录后将原表删除,损坏页面会被丢失,重新表,导入数据即可。
2.修改页眉校验,可惜小弟不才,还没研究页眉结构对应的物理16进制关系。只靠修改前的页眉截图,修改后按照截图还原页眉,这里无法向大家说明白修改的地方。希望有经验或者有兴趣的朋友可以和我分享下,谢谢~
如何释放堆中的空闲页面?
www.2cto.com
若要删除堆中的行并释放页,我们可以使用下列方法之一。
在 DELETE 语句中指定 TABLOCK 提示。使用 TABLOCK 提示会导致删除操作获取表的共享锁,而不是行锁或页锁。这将允许释放页。
如果要从表中删除所有行,请使用 TRUNCATE TABLE。
删除行之前,请对堆创建聚集索引。删除行之后,可以删除聚集索引。与先前的方法相比,此方法非常耗时,并且使用更多的临时资源。
如果释放空闲页面空间,很有可能记录就无法再恢复了,同时说明数据库完整模式+日志备份是多么的重要,可以省去很多发杂的步骤