ITPub博客

首页 > Linux操作系统 > Linux操作系统 > truncate 研究

truncate 研究

原创 Linux操作系统 作者:Power08 时间:2013-11-24 16:15:21 0 删除 编辑

Truncate

1.truncate到底干了什么

首先了解两个概念:

object_id: 是对每个数据库中数据对象的唯一标识

data_object_id: 用来表示object的物理存储段的实际位置.只有表,索引,undo这些有实际物理存储位置的对象才有data_object_id,而像一些函数,存储过程,以及view等等是没有data_object_id

注:一般在数据库中两者是相等的只有在表发生movetruncate时两者才会不等

 

truncate的本质实质上就是通过为对象重新映射一段存储空间,修改对象的data_object_id指向,从而完成了快速的数据清除,而在根本上,数据库仅仅是将数据文件上的空间标记为可用,并未真正清除数据,不过如果未来释放的空间被其他对象使用,则数据将被真正覆盖。所以如果真的发生了误操作truncate了数据表,并且没有备份,那么最好的办法就是尽快将相关文件备份出来,然后通过各种方法和工具,将文件上的数据抽取出来,完成数据恢复。

(如果表刚创建并未存数据,即只有一个extent时,truncate表不会改变data_object_id

------------------------------实验-----------------------------------

SQL> create table test (id int);

Table created

SQL> alter table test allocate extent; ---分配一个extent给表test

Table altered

select object_id,data_object_id,object_name from dba_objects where object_name='TEST' and owner='TEST'

OBJECT_ID

DATA_OBJECT_ID

OBJECT_NAME

10702

10702

TEST

SQL> truncate table test;

Table truncated


select object_id,data_object_id,object_name from dba_objects where object_name='TEST' and owner='TEST'

OBJECT_ID

DATA_OBJECT_ID

OBJECT_NAME

10702

10703

TEST

------------------------------实验-----------------------------------

 

2.Truncate的几个选项

Truncate table table_name drop storage

-data : 数据部分所在的extent 空间会被释放(释放回收到刚建表时的值),腾出来的空间可以供其它segment 使用 。

-index : 表的index数据部分删除,剩下第一个extent

-hwm : 会将HWM重新设置到第一个Block的位置(hwm会改变)

 

Truncate table table_name reuse storage

-data : 数据部分所在的extent 空间不会被回收(仅仅数据会被删除),数据删除之后的freespace 空间只能供本表使用,不可以供其它 segment 使用

-index : 表index的数据会删除,但是保留extent 部分

-hwm : 会将HWM重新设置到第一个Block的位置(hwm会改变)

-----------------------------实验------------------------------------

SQL> create user test identified by test default tablespace test;

User created

SQL> grant connect,resource to test;

Grant succeeded

SQL> conn test/test

Connected to Oracle Database10gEnterpriseEdition Release10.2.0.1.0

Connected as test@ORCL


SQL> create table test (id int);

Table created

select owner,segment_name,extent_id,block_id,blocks from dba_extents where segment_name='TEST'

OWNER

SEGMENT_NAME

EXTENT_ID

BLOCK_ID

BLOCKS

TEST

TEST

0

9

128


SQL> alter table test allocate extent; ------分配extent

Table altered

SQL> alter table test allocate extent;

Table altered

select owner,segment_name,extent_id,block_id,blocks from dba_extents where segment_name='TEST'

OWNER

SEGMENT_NAME

EXTENT_ID

BLOCK_ID

BLOCKS

TEST

TEST

0

9

128

TEST

TEST

1

137

128

TEST

TEST

2

265

128

 

SQL> truncate table test.test drop storage;

Table truncated

select owner,segment_name,extent_id,block_id,blocks from dba_extents where segment_name='TEST'

OWNER

SEGMENT_NAME

EXTENT_ID

BLOCK_ID

BLOCKS

TEST

TEST

0

9

128




SQL> alter table test allocate extent;

Table altered

SQL> alter table test allocate extent;

Table altered

SQL> alter table test allocate extent;

Table altered

select owner,segment_name,extent_id,block_id,blocks from dba_extents where segment_name='TEST'

 

OWNER

SEGMENT_NAME

EXTENT_ID

BLOCK_ID

BLOCKS

TEST

TEST

0

9

128

TEST

TEST

1

137

128

TEST

TEST

2

265

128

TEST

TEST

3

393

128

SQL> truncate table test.test reuse storage;

Table truncated


select owner,segment_name,extent_id,block_id,blocks from dba_extents where segment_name='TEST'

OWNER

SEGMENT_NAME

EXTENT_ID

BLOCK_ID

BLOCKS

TEST

TEST

0

9

128

TEST

TEST

1

137

128

TEST

TEST

2

265

128

TEST

TEST

3

393

128

-----------------------------实验------------------------------------

oracle11.2.0.2中新增了drop all storage选项,可以彻底删除segment,即包括建表时分配的第一个extent

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29014732/viewspace-777440/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-07-01

  • 博文量
    17
  • 访问量
    44498