ITPub博客

首页 > 应用开发 > IT综合 > OBJECT_ID、DATA_OBJECT_ID与truncate的本质

OBJECT_ID、DATA_OBJECT_ID与truncate的本质

原创 IT综合 作者:xiaokadba 时间:2011-09-13 15:19:37 0 删除 编辑

OBJECT_ID和DATA_OBJECT_ID可以这样区别:OBJECT_ID可以看做是对象的一个逻辑ID,在对象创建时分配,一经分配即不再改变;而DATA_OBJECT_ID则是一个物理ID,在对象存储发生变化时可能会发生改变。在sql.bsq文件中,我们可以看到一段注释说明(OBJ是DBA_OBJECTS的底层数据表),OBJ$表的DATAOBJ#为DateLayer的对象号,ORACLE提示不要在该字段上创建索引,因为该标识会在truncate时发生改变。

这个注释道出了truncate操作的本质,我们知道truncate操作可以很快速地清除表数据,也可以降低hwm并释放存储空间,同事也知道这是一个极其危险的操作,如果发生误操作一般要通过备份来恢复,如果没有备份,恢复将变得相当困难。

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

一下我们可以通过简单的测试来验证一下truncate操作的实现,首先创建一个测试表,可以看到初始的OBJECT_ID和DATA_OBJECT_ID是相同的:

1、新建表

create table test as select * from dba_users;

2、查看OBJECT_ID、DATA_OBJECT_ID号(结果为74840,74840)

select object_name,object_id,data_object_id from dba_objects where object_name='TEST';

3、清空表

truncate table test;

4、查看OBJECT_ID、DATA_OBJECT_ID号(结果为74840,74841)

select object_name,object_id,data_object_id from dba_objects where object_name='TEST';

根据上面的操作可以发现查看OBJECT_ID没有发生变化,而DATA_OBJECT_ID发生了变化。

[@more@]

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

上一篇: SCN是什么
下一篇: LOGMNR
请登录后发表评论 登录
全部评论
  • 博文量
    14
  • 访问量
    11169