当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 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的第二种恢复方法就显而易见了,在这些数据被覆盖之前,从页面中将数据提取出来,并恢复到表中。

转载于:https://blog.51cto.com/aimax/2142553

SQL Server数据恢复准备之TRUNCATE TABLE理解相关推荐

  1. SQL Server中drop、truncate和delete语句的用法

    SQL Server中drop.truncate和delete语句的用法 drop  删除表和表中的所有数据(不保留表的结构) drop table tablename truncate   删除表中 ...

  2. Sql Server 中利用游标对table 的数据进行分组统计式输出…

    Sql Server 中利用游标对table 的数据进行分组统计式输出- Table Name: Tb_Color Create table Tb_Color(id int identity(1,1) ...

  3. MS SQL Server数据库修复利器—D-Recovery For MS SQL Server数据恢复软件

    微软的SQL Server 数据库最常用的有两种类型的文件: 1.主要数据文件,文件后缀一般是.MDF: 2.事务日志文件,文件后缀一般是.LDF. 用户数据表.视图.存储过程等等数据,都是存放在MD ...

  4. SQL Server 数据恢复

    配置SQL Server数据库恢复模式(2种方法) 用T-SQL设置恢复模式 你可以使用"ALTER DATABASE"命令加"SET RECOVERY"语句来 ...

  5. SQL Server 2012笔记分享-49:理解数据库快照

    数据库快照是 SQL Server 数据库(源数据库)的只读静态视图. 自创建快照那刻起,数据库快照在事务上与源数据库一致. 数据库快照始终与其源数据库位于同一服务器实例上. 当源数据库更新时,数据库 ...

  6. SQL Server 2012笔记分享-6:理解内存管理

    内存管理 – SQL Server 2005/2008/2008r2 SQL Server 2012以前的版本(SQL 2005/2008/2008R2),有single page allocator ...

  7. Oracle 9i与MS SQL Server 2000之比较连载五.zz

    http://kb.cnblogs.com/a/1153156 Oracle 9i与MS SQL Server 2000之比较连载五 2008-04-14 18:13 四.Oracle中新的数据库对象 ...

  8. 如何使用损坏或删除SQL Server事务日志文件重建数据库

    This is the last article, but not the least one, in the SQL Server Transaction Log series. In this s ...

  9. sql server死锁_如何报告SQL Server死锁事件

    sql server死锁 介绍 (Introduction) In the previous article entitled "What are SQL Server deadlocks ...

最新文章

  1. 【opencv】(2) 图像处理:边界填充、图像融合、图像阈值、数值计算
  2. 复旦大学计算机专业直博,上海复旦大学计算机科学技术学院2016博士招生选拔办法...
  3. oracle如何查看表的字段是否存在,Oracle删除表、字段之前判断表、字段是否存在...
  4. python可以自学吗需要什么基础-python自学行吗?给编程初学者零基础入门的建议...
  5. delphi编程模拟发送QQ2008消息!
  6. 16 大常考算法知识点,你掌握了吗?
  7. 互联网日报 | 4月7日 星期三 | 雷军称小米首款汽车售价10至30万;携程通过港交所上市聆讯;深交所主板与中小板正式合并...
  8. IdentityServer(14)- 通过EntityFramework Core持久化配置和操作数据
  9. word2vec词向量建立
  10. 取得系统当前日期和时间
  11. 【转】7本免费的Java电子书和教程
  12. 迪艾姆python培训视频
  13. STM32F103C8T6开发环境的搭建
  14. windows服务器重装教程,Win10系统怎么重装?Win10系统重装教程
  15. Spring的Orderd接口以及@Order、@Primary、@Priority三个注解介绍
  16. 最小生成树 HDU 各种畅通工程的题,prim和kru的模板题
  17. couch base使用记录
  18. 整理springmvc+mybatis+velocity的整合一
  19. 文件实现输入三行hello,实现在每个hello后面换行
  20. 左移赋值运算符 (<<=)

热门文章

  1. 出第三方软件检测报告的测试机构有哪些,具备CMA、CNAS资质的测评公司推荐
  2. 在Excel中用VB批量生成二维码
  3. 建设工程项目全寿命周期管理是指_工程项目全寿命周期管理.ppt
  4. IP ID idle 扫描
  5. 数据库设计(一) 需求分析
  6. hihocoder01串
  7. css样式对IOS设备苹果手机不支持解决方法
  8. 罗克韦尔自动化收购工业自动化系统模拟与仿真的领先软件开发商Emulate3D
  9. 机器学习 python
  10. c语言中字符串的子式咋样输出,C语言常用代码