SQL Server数据恢复准备之TRUNCATE TABLE理解

转自:https://blog.51cto.com/aimax/2142553

当truncate table发生时,如何进行恢复,相信大部分人都会选择通过还原备份到truncate table前,然后将数据重新导入正式表中。

那么在SQL Server中是不是真的只有这种方法呢,当然不是,这也是本文即将介绍的内容,前提条件是SQL Server完整恢复模式(大容量日志模式未做测试,暂不介绍)。

首先,了解一下truncate table的一些相关知识

官档:

TRUNCATE TABLE 通过释放用于存储表数据的数据页删除数据,且仅在事务日志中记录页释放。

这句话包含的信息量是很大的,通过实验进行验证,解释如下:

truncate table时,数据库日志中不会记录确切的已删除值,只记录截断记录的页的ID,并且这些记录所占用的空间会被标识为可重写,

mdf中会暂时保留这些页内的数据,当有新事务写入这些页时,truncate table的数据将会被覆盖(数据页被format,然后重新使用)。

测试:

创建一张表,并插入数据

create table test_truncate(id int,name varchar(20),address varchar(20))
go
insert into test_truncate select 1,'zhangsan','first road'
go
insert into test_truncate select 2,'wangxiao','second road'
go

DBCC TRACEON(3604):必须开启此标识才能使用

利用dbcc ind找到该表的数据页,如下PageType=1为数据页,即为:288

使用dbcc page查看数据页内容

PAGE: (1:288)
BUFFER:
BUF @0x000000000563C600
bpage = 0x0000000150020000 bhash = 0x0000000000000000 bpageno = (1:288)
bdbid = 9 breferences = 0 bcputicks = 0
bsampleCount = 0 bUse1 = 56673 bstat = 0x10b
blog = 0x7adb21cc bnext = 0x0000000000000000
PAGE HEADER:
Page @0x0000000150020000
m_pageId = (1:288) m_headerVersion = 1 m_type = 1
m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8000
m_objId (AllocUnitId.idObj) = 489 m_indexId (AllocUnitId.idInd) = 256
Metadata: AllocUnitId = 72057594069975040
Metadata: PartitionId = 72057594062241792 Metadata: IndexId = 0
Metadata: ObjectId = 935674381 m_prevPage = (0:0) m_nextPage = (0:0)
pminlen = 8 m_slotCnt = 2 m_freeCnt = 8021
m_freeData = 167 m_reservedCnt = 0 m_lsn = (49:7380:2)
m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0
m_tornBits = 0 DB Frag ID = 1
Allocation Status
GAM (1:2) = ALLOCATED SGAM (1:3) = ALLOCATED
PFS (1:1) = 0x61 MIXED_EXT ALLOCATED 50_PCT_FULL DIFF (1:6) = CHANGED
ML (1:7) = NOT MIN_LOGGED
Slot 0 Offset 0x60 Length 35
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
Record Size = 35
Memory Dump @0x000000006DDF8060
0000000000000000: 30000800 01000000 03000002 00190023 007a6861 0..............#.zha
0000000000000014: 6e677361 6e666972 73742072 6f6164 ngsanfirst road
Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4
id = 1
Slot 0 Column 2 Offset 0x11 Length 8 Length (physical) 8
name = zhangsan
Slot 0 Column 3 Offset 0x19 Length 10 Length (physical) 10
address = first road
Slot 1 Offset 0x83 Length 36
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
Record Size = 36
Memory Dump @0x000000006DDF8083
0000000000000000: 30000800 02000000 03000002 00190024 0077616e 0..............$.wan
0000000000000014: 67786961 6f736563 6f6e6420 726f6164 gxiaosecond road
Slot 1 Column 1 Offset 0x4 Length 4 Length (physical) 4
id = 2
Slot 1 Column 2 Offset 0x11 Length 8 Length (physical) 8
name = wangxiao
Slot 1 Column 3 Offset 0x19 Length 11 Length (physical) 11
address = second road
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
 

可以看到数据页中存在的记录

Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4
id = 1
Slot 0 Column 2 Offset 0x11 Length 8 Length (physical) 8
name = zhangsan
Slot 0 Column 3 Offset 0x19 Length 10 Length (physical) 10
address = first road Slot 1 Column 1 Offset 0x4 Length 4 Length (physical) 4
id = 2
Slot 1 Column 2 Offset 0x11 Length 8 Length (physical) 8
name = wangxiao
Slot 1 Column 3 Offset 0x19 Length 11 Length (physical) 11
address = second road
 

执行truncate table后

可以看到数据页中仍保留着truncate table的相关记录。

那么,truncate table的第二种恢复方法就显而易见了,在这些数据被覆盖之前,从页面中将数据提取出来,并恢复到表中。

©著作权归作者所有:来自51CTO博客作者易语随风去的原创作品,如需转载,请注明出处,否则将追究法律责任

SQL Server数据恢复准备之TRUNCATE TABLE理解的更多相关文章

  1. SQL Server 数据恢复到指点时间点(完整恢复)

    SQL Server 数据恢复到指点时间点(完整恢复) 高文龙关注2人评论944人阅读2017-03-20 12:57:12 SQL Server 数据恢复到指点时间点(完整恢复) 说到数据库恢复,其 ...

  2. SQL Server 查看分区表(partition table)的分区范围(partition range)

    https://www.cnblogs.com/chuncn/archive/2009/02/20/1395165.html SQL Server 2005 的分区表(partition table) ...

  3. SQL Server中DELETE和TRUNCATE的区别

    ​DELETE和TRUNCATE语句之间的区别是求职面试中最常见的问题之一.这两条语句都可以从表中删除数据.然而,也有不同之处. 本文将重点讨论这些差异,并通过实例加以说明. TRUNCATE DEL ...

  4. sql server 的约束的作用 于 理解 [转]

    SQL Server中的约束用来确保系统的完整性.一般约束可以分为:主键约束外键约束检查约束默认约束唯一约束非空约束 但是一般我们需要特别注意前三种约束:主键约束,一就是说跟你系统的实体有很大的关系, ...

  5. SQL Server性能优化(7)理解数据库文件组织

    一.基本单位"页"     SQL Server是用8KB的页来存储数据.物理I/O操作也是在页级执行.页的种类有很多,具体参考(MSDN).我们关注更多的是数据页的结构,包括三部 ...

  6. SQL SERVER - set statistics time on的理解

    一.set statistics time on的作用 显示分析.编译和执行各语句所需的毫秒数. 二.语法 SET STATISTICS TIME { ON | OFF } 注释 1.当 SET ST ...

  7. SQL Server数据恢复——日志备份

    太坑了,我把数据给删了 “大坑啊,数据被我误删了.”从事数据库相关工作的过程中,我想应该很多人会有过和我一样的遭遇吧?尤其是在进行update或者delete操作的时候,忘记了where条件.这些毁灭 ...

  8. SQL SERVER 中PatIndex的用法个人理解

    一般用法:PatIndex('%AAA%',‘BBBBBBBB’) 上句的意思是查找AAA在BBBBBBBB中的位置,从1开始计算,如果没有的话则返回0 其中%AAA%的用法和 SQL语句中like的 ...

  9. 1 SQL SERVER 实现字符串分割成table的方法

    CREATE FUNCTION [dbo].[fn_SplitStringToTable] ( @p_Input VARCHAR(MAX), @p_Delimeter CHAR() = ',' ) R ...

随机推荐

  1. msyql同步的时候报错 : 错误代码: 1293 Incorrect table definition;there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

    场景,两个不同服务器上的数据库,进行数据库同步 但是执行之后,提示报错 错误代码: 1293 Incorrect table definition; there can be only one TIM ...

  2. 三、主流区块链技术特点及Hyperledger Fabric V1.0版本特点

    一.Hyperledger fabric V1.0 架构 1.逻辑架构: 2.区块链网络 3.运行时架构 二.架构总结 1.架构要点 分拆Peer的功能,将Blockchain的数据维护和共识服务进行 ...

  3. MAC下Myeclipse SVN插件安装

    1.下载SVN插件包:http://download.csdn.net/detail/frankyanchen/4512899 2.在myeclipse文件夹下创建一个文件夹为svntool并复制下载 ...

  4. Git 解决本地远端版本冲突

    简单粗暴.... git push -u origin master -f

  5. 使用Three.js里的各种光源

    1.three.js库提供的光源 three.js库提供了一些列光源,而且没种光源都有特定的行为和用途.这些光源包括: 光源名称/描述 AmbientLight(环境光)/这是一种基础光源,它的颜色会 ...

  6. actor 内最好不要阻塞

    1. 在使用 akka cluster singleton 时,我需要知道被创建的 singleton proxy 的 actorRef,通过绝对路径加 actorSelection 方法,应该很容易 ...

  7. 《Python3网络爬虫开发实战》

    推荐:★ ★ ★ ★ ★ 第1章 开发环境配置 第2章 网页基础知识 第3章 网络爬虫基础 第4章 基本库的使用 第5章 解析库的使用 第6章 数据存储 第7章 Ajax数据爬取 第8章 动态渲染页面 ...

  8. HashMap和Hashtable的区别 2

    导读: 1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值.HashMap允许null k ...

  9. JS正则校验

    /** 用途:检查输入字符串是否为空或者全部都是空格 输入:str:字符串 返回: 如果全是空返回true,否则返回false */ function isNull(str) { if (str == ...

  10. IntelliJ IDEA连接TFS local workspace无法正常签入

    前几天为了便于在本地修改,将TFS workspace的类型从Server修改为Local.基于Visual Studio的开发正常没有问题,用IntelliJ IDEA时却提示以下错误: Error ...