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

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

背景

SQL Server是一种常见的关系型数据库管理系统,堆表是其一种表的存储形式。在误删除堆表记录并进行回滚时,如果数据库处于简单模式下,数据不可恢复。本攻略在简单模式下误删除堆表记录并绕过页眉校验,实现数据恢复。

简单模式下误删除堆表记录

在SQL Server中,简单模式下的事务处理不支持日志记录和回滚操作,也就是说使用简单模式的数据库如果误删除数据,将无法进行恢复操作,因此一定要谨慎操作。

绕过页眉校验实现数据恢复

SQL Server在表的数据页头中保存了相应的元数据信息,用于维护数据完整性。其中 校验字符串(Checksum) 是SQL Server用于判断表是否损坏的关键信息之一。我们在进行数据恢复前,需要先对表的数据页头进行修改,绕过页眉校验,否则恢复的数据可能会不完整。具体操作步骤如下:

  1. 确定误删除记录所在的堆表和行数。
  2. 在SQL Server中以sa账号登录,打开SQL Server Management Studio。
  3. 使用下面的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算法和值,确保页眉校验被绕过。

  1. 使用下面的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技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • JSP动态实现web网页登陆和注册功能

    JSP(Java Server Pages)是一种使用Java编程语言编写的动态Web页面技术。在JSP中,使用Java代码、HTML、CSS、JavaScript和JSP页面特定元素来开发Web应用程序。 下面是实现JSP动态实现Web网页登陆和注册功能的完整攻略: 第一步:搭建Web应用程序 要实现令人担心的Web登录和注册功能,必须首先建立您的Web应…

    database 2023年5月22日
    00
  • Openstack 使用migrate进行数据库升级实现方案详细介绍

    Openstack 使用migrate进行数据库升级实现方案详细介绍 简介 Openstack是一个开放源代码的云计算软件平台,其中涉及到的各种组件和服务都需要对应的数据存储支持。在不同的版本之间,组件的数据存储模式可能发生变化,此时就需要进行数据库升级。其中,常用的数据库升级工具之一就是migrate。 本文将详细介绍Openstack使用migrate进…

    database 2023年5月22日
    00
  • linux环境下安装pyramid和新建项目的步骤

    下面是在Linux环境下安装Pyramid和新建项目的步骤的完整攻略: 安装Pyramid 步骤1:安装Python 安装Pyramid需要先安装Python,可参考以下命令进行安装: sudo apt-get update sudo apt-get install python3 步骤2:安装pip 安装pip可以方便地安装Python的包,可参考以下命令…

    database 2023年5月22日
    00
  • linux下使用cmake编译安装mysql的详细教程

    以下是“linux下使用cmake编译安装mysql的详细教程”的完整攻略。 安装依赖项 在编译过程之前,请先确保您的系统上已经安装了以下依赖项: sudo apt-get install build-essential cmake libncurses5-dev libssl-dev libboost-dev 下载源码 从MySQL 官网上下载源码,将其解…

    database 2023年5月22日
    00
  • MySQL——排序和分页

    1、排序(ORDER BY) 升序 :ASC 降序 :DESC ORDER BY: 通过那个字段排序,怎么排 — 查询的结果根据 成绩升序 排序 SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult` FROM student s INNER JOIN `result` r ON s…

    2023年4月12日
    00
  • 一文带你了解MySQL中的事务

    一文带你了解 MySQL 中的事务 什么是事务? 事务是指作为单个逻辑工作单元执行的一系列操作。这些操作必须全部执行或者全部不执行,如果其中有任何一个操作失败,则整个事务都必须回滚到起始状态。 MySQL 中的事务 MySQL 中的事务是通过 commit 和 rollback 语句进行控制的。commit 语句用于提交事务,将进行的所有更改保存到数据库中,…

    database 2023年5月22日
    00
  • SQL Server使用一个语句块批量插入多条记录的三种方法

    SQL Server可以使用一个语句块批量插入多条记录。这种方法比逐条插入单个记录更高效。下面介绍三种实现方法。 方法1:使用INSERT INTO VALUES语法 可以使用INSERT INTO VALUES语法插入多条记录。代码如下: INSERT INTO table_name(column1, column2, column3) VALUES (v…

    database 2023年5月21日
    00
  • Shell调用curl实现IP归属地查询的脚本

    那么我们先来简要介绍一下Shell与curl。 Shell是一种脚本语言,可以在命令行中按照一定的语法编写指令,用于操作计算机系统。而curl则是一种用于在Linux和Unix系统中传输数据的命令行工具和库,支持各种协议,如HTTP、FTP、SMTP等。 当我们需要查询一个IP地址所对应的归属地信息时,我们可以通过curl来实现这个功能。具体步骤如下: 打开…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部