SQL Server简单模式下误删除堆表记录恢复方法(绕过页眉校验)
背景
SQL Server是一种常见的关系型数据库管理系统,堆表是其一种表的存储形式。在误删除堆表记录并进行回滚时,如果数据库处于简单模式下,数据不可恢复。本攻略在简单模式下误删除堆表记录并绕过页眉校验,实现数据恢复。
简单模式下误删除堆表记录
在SQL Server中,简单模式下的事务处理不支持日志记录和回滚操作,也就是说使用简单模式的数据库如果误删除数据,将无法进行恢复操作,因此一定要谨慎操作。
绕过页眉校验实现数据恢复
SQL Server在表的数据页头中保存了相应的元数据信息,用于维护数据完整性。其中 校验字符串(Checksum) 是SQL Server用于判断表是否损坏的关键信息之一。我们在进行数据恢复前,需要先对表的数据页头进行修改,绕过页眉校验,否则恢复的数据可能会不完整。具体操作步骤如下:
- 确定误删除记录所在的堆表和行数。
- 在SQL Server中以sa账号登录,打开SQL Server Management Studio。
- 使用下面的sql语句,手动修改目标数据页头的Checksum,绕过页眉校验。
DBCC TRACEON (3604);
DBCC PAGE ('<Database_Name>', <File_ID>, <Page_ID>, 3) WITH TABLERESULTS;
USE [<Database_Name>]
GO
DBCC PAGE ('<Database_Name>', <File_ID>, <Page_ID>, 3) WITH TABLERESULTS;
GO
UPDATE [<Table_Name>] SET <Column_Name>='<Value>' WHERE <Unique_ID>='<Unique_ID_Value>'
其中,<Database_Name>
是指误删的数据所在的数据库名称,<File_ID>
是指数据文件编号,<Page_ID>
是指数据页编号,在SQL Server Management Studio中可以通过右键点击数据表,选择【属性】,在【选项】中查找获取。<Table_Name>
是指误删除的数据所在的表名称,<Column_Name>
是指误删除的列名称,<Value>
是指误删除的数据的值,<Unique_ID>
是指误删除记录的ID编号列名称,<Unique_ID_Value>
是指误删除记录的唯一ID编号值,可以通过查询堆表获取。修改Checksum算法和值,确保页眉校验被绕过。
- 使用下面的sql语句将新修改的数据页写入磁盘,此步骤是为了推进数据页的
写出操作,使写入的信息能保存到数据库文件中。
USE [<Database_Name>]
GO
ALTER DATABASE [<Database_Name>] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DBCC TRACEON (3604);
DBCC PAGE ('<Database_Name>', <File_ID>, <Page_ID>, 3) WITH TABLERESULTS;
USE [<Database_Name>]
GO
UPDATE [<Table_Name>] SET <Column_Name>='<Value>' WHERE <Unique_ID>='<Unique_ID_Value>'
GO
ALTER DATABASE [<Database_Name>] SET MULTI_USER;
GO
示例
为了更好地说明操作步骤,以下提供两个示例说明。
示例一
误删除了数据库Test
中的UserInfo
表的第2行数据,假设以下条件:
- 数据库名称:
Test
- 数据文件编号:
1
- 数据页编号:
10899
- 表名称:
UserInfo
- 列名称:
UserName
- 列值:
Tom
- ID列名称:
UserID
- ID列值:
2
我们需要用以下代码进行数据恢复操作:
USE [Test]
GO
DBCC TRACEON (3604)
GO
DBCC PAGE ('Test', 1, 10899, 3) WITH TABLERESULTS
GO
UPDATE UserInfo SET UserName='Tom' WHERE UserID='2'
GO
USE [Test]
GO
ALTER DATABASE [Test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DBCC TRACEON (3604)
GO
DBCC PAGE ('Test', 1, 10899, 3) WITH TABLERESULTS;
GO
USE [Test]
GO
UPDATE UserInfo SET UserName='Tom' WHERE UserID='2'
GO
ALTER DATABASE [Test] SET MULTI_USER
GO
示例二
误删除了数据库Test
中的UserInfo
表的第5行数据,假设以下条件:
- 数据库名称:
Test
- 数据文件编号:
2
- 数据页编号:
2125
- 表名称:
UserInfo
- 列名称:
UserName
- 列值:
Lily
- ID列名称:
UserID
- ID列值:
5
我们需要用以下代码进行数据恢复操作:
USE [Test]
GO
DBCC TRACEON (3604)
GO
DBCC PAGE ('Test', 2, 2125, 3) WITH TABLERESULTS
GO
UPDATE UserInfo SET UserName='Lily' WHERE UserID='5'
GO
USE [Test]
GO
ALTER DATABASE [Test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DBCC TRACEON (3604)
GO
DBCC PAGE ('Test', 2, 2125, 3) WITH TABLERESULTS;
GO
USE [Test]
GO
UPDATE UserInfo SET UserName='Lily' WHERE UserID='5'
GO
ALTER DATABASE [Test] SET MULTI_USER
GO
以上就是本攻略的具体操作步骤与示例说明。需要注意的是,在使用本方法时要谨慎操作,避免因不慎操作导致数据损坏。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL Server简单模式下误删除堆表记录恢复方法(绕过页眉校验) - Python技术站