TRUNCATE TABLE恢复系列一:深层剖析内部原理

叮叮铛~今天我们推出Oracle异常恢复的第一个系列:“TRUNCATE TABLE恢复系列”,这个系列主要围绕truncate table实现的内部原理和几种恢复方式来展开。

深层剖析内部原理

众所周知,truncate table是一种快速清空表内数据的一种方式,与delete方式不同,truncate只产生非常少的redo和undo,就实现了清空表数据并降低表HWM的功能。我们通过10046和redo dump来分析truncate的整个操作过程,其中10046用于观察truncate对于字典基表的操作、redo dump用于观察truncate对于segment header以及L1、L2位图块的操作。

首先构造测试环境:OS: redhat 6.5,db:11.2.0.4,基于assm。

通过10046和redo dump去观察truncate操作:

从10046trace里搜出对基表的dml操作:

对基表的修改主要是:

修改obj$,tab$的dataobj#
修改seg$的对应信息如(extents,blocks,hwmincr等等)
删除tab_stats$对应对象的统计信息
对于segment header以及L1、L2位图块的操作,只能通过redo dump去观察,因为在logminer中只会记录数据块的变更,而对于segment header和L1、L2位图块的操作在logminer里只记录操作类型为internal或者unsupported,没有什么有价值的信息。

通过对redo dump的分析,发现truncate 操作只对segment header,L2位图块,第一个L1位图块和HWM block所属的L1位图块进行了修改。

对于segment header:

修改块的dataobj#
修改LHWM和HHWM
修改extent map、aux map以及extents个数
对于L2位图块:

删除L1 ranges
修改L2块的dataobj#
对于第一个L1位图块:

修改第一个L1块的dataobj#
set hwm为ext#为0的第3+1个块(即段头块+1)
对于HWM block所属的L1位图块:

clear HWM flag
总结:truncate的实质是在不修改数据块的情况下,通过修改segment header的data_object_id,hwm,extent map,aux map等信息来实现清空表的目的,其中还涉及数据字典基表以及L1、L2位图块的修改,所以说truncate操作只是存储数据的数据块没有产生任何redo和undo,但是segment header,位图块,数据字典基表还是会产生redo和undo。

下一期,我们将推出?TRUNCATE TABLE恢复系列二:如何使用bbed进行恢复,敬请期待!

ps:我们的文章会同步更新到 微信公众号:Oracle恢复实录 ,欢迎扫码关注!

原文地址:https://blog.51cto.com/14669918/2472433

时间: 2024-11-06 11:58:21

TRUNCATE TABLE恢复系列一:深层剖析内部原理的相关文章

深入理解javascript作用域系列第一篇——内部原理

× 目录 [1]编译 [2]执行 [3]查询[4]嵌套[5]异常[6]原理 前面的话 javascript拥有一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量,这套规则被称为作用域.作用域貌似简单,实则复杂,由于作用域与this机制非常容易混淆,使得理解作用域的原理更为重要.本文是深入理解javascript作用域系列的第一篇——内部原理 内部原理分成编译.执行.查询.嵌套和异常五个部分进行介绍,最后以一个实例过程对原理进行完整说明 编译 以var a = 2;为例,说明javasc

Oracle数据库truncate table后恢复原来数据的方法,留着万一用得到呢

概述:北京某国企客户 Oracle 11g R2 数据库误truncate table CM_CHECK_ITEM_HIS,表数据丢失,业务查询到该表时报错,此时发现数据库的备份不能用,表数据无法查询. 客户Oracle 11g R2 数据库误truncate table CM_CHECK_ITEM_HIS,表数据丢失,业务查询到该表时报错,此时发现数据库的备份不能用,表数据无法查询.Truncate数据的机理是,ORACLE会在数据字典和Segment?Header中更新表的Data?Obje

WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核心)

一. 摘要 首先圣殿骑士非常高兴这个系列能得到大家的关注和支持.这个系列从七月份開始到如今才第七篇,上一篇公布是在8月2日,掐指一算有二十多天没有继续更新了,最主要原因一来是想把它写好,二来是由于近期几个月在筹备"云计算之旅"系列,所以一再推迟了公布进度. 之前一直都没有想过要录制视频.基本的原因还是怕自己知识有限,从而误导他人,所曾经几次浪曦和51CTO邀请录制视频,我都以工作忙.公司内部培训须要时间和自己有待提高等理由委婉的拒绝了,说实在的.自己也知道自己还有非常多地方有待提高.还

truncate table语句和delete table语句的区别

truncate table 表名 ; delete from 表名; 都是用来删除表中所有的记录,前者删除数据后表的标识列会重新开始编号,它比delete语句使用的系统资源和事务日志资源更少,但是表的结构,列,约束,索引等不会被改动,同时不能用于有外键约束引用的表,在实际工作中,不建议使用truncate ,因为使用它删除的数据不能恢复还原,而使用delete的话就可以恢复

truncate table 和delete

delete table 和 truncate table 使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where<search_condition>] 将XS表中的所有行数据删除 delete XS 执行完后,发现XS表中的数据都删除了,但是表的结构什么都还在. truncate truncate table语句将删除指定表中所有数据,因此也称其为清除表数据语句,一般格式如下 truncate table name

delete table 和 truncate table

转载:http://www.cnblogs.com/herbert/archive/2010/07/06/1772135.html 使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where<search_condition>] 将XS表中的所有行数据删除 delete XS 执行完后,发现XS表中的数据都删除了,但是表的结构什么都还在. truncate truncate table语句将删除指定表中所有数据,因此也称

MySQL DELETE语句和TRUNCATE TABLE语句的区别

MySQL DELETE语句和TRUNCATE TABLE语句的区别 2010-10-08 16:05 佚名 互联网 字号:T | T 在MySQL数据库中,DELETE语句和TRUNCATE TABLE语句都可以用来删除数据,但是这两种语句还是有着其区别的,下文就为您介绍这二者的差别所在. AD:干货来了,不要等!WOT2015 北京站演讲PPT开放下载! MySQL DELETE语句和TRUNCATE TABLE语句功能相似,但是二者究竟有何区别呢?下文就将为您分析MySQL DELETE语

MYSQL truncate table

准备: 要说truncate table 就要先说一下delete 它们两个都可以用来从表中删除数据行!表面上看是delete 删除的慢一些,truncate table 快一些. delete : 它是老老实实的一行一行的删除数据.写日志.它删除的数据是可以通过日志恢复的. trunate table : 它就不这样做了,它只要把数据页标记为空页面(里面没有数据行),这样记录的日志也要小不少. 然. 它也不是‘银弹’被它删除的数据是不太可能通过日志恢复的.因为它只记下了自己标志了哪几个页. 而

Truncate table、Delete与Drop table的区别

Truncate table.Delete与Drop table的区别 TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少. DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项.TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放. TRUNCATE TABLE 删除表中的所有行