Truncate
1.truncate到底干了什么
首先了解两个概念:
object_id: 是对每个数据库中数据对象的唯一标识
data_object_id: 用来表示object的物理存储段的实际位置.只有表,索引,undo这些有实际物理存储位置的对象才有data_object_id,而像一些函数,存储过程,以及view等等是没有data_object_id的
注:一般在数据库中两者是相等的只有在表发生move或truncate时两者才会不等
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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29014732/viewspace-777440/