TRUNCATE TABLE原理解析

众所周知,truncate table是一种快速清空表内数据的一种方式,与delete方式不同,truncate只产生非常少的redo和undo,就实现了清空表数据并降低表HWM的功能。本文主要围绕truncate table的实现原理和truncate table的恢复来展开。

首先构造测试环境,并通过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操作

从10046 trace里搜出对基表的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。

此条目发表在Oracle, Oracle Recover分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注