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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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恢复实录 ,欢迎扫码关注!

以上是关于TRUNCATE TABLE恢复系列一:深层剖析内部原理的主要内容,如果未能解决你的问题,请参考以下文章

[20180630]truncate table的另类恢复2.txt

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

Oracle数据库误truncate table的数据恢复案例

深度剖析 | JVM深层系列[HotSpotVM研究系列] JVM调优的"标准参数"的各种陷阱和坑点分析(攻克盲点及混淆点)「 1 」

深度剖析 | JVM深层系列[HotSpotVM研究系列] JVM调优的“标准参数“的各种陷阱和坑点分析(攻克盲点及混淆点)「 1 」

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