ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle 11g deferred_segment_creation段延迟创建

oracle 11g deferred_segment_creation段延迟创建

原创 Linux操作系统 作者:听海★蓝心梦 时间:2011-07-13 11:13:41 0 删除 编辑
今天早上一大早,同事就说系统无法登录。查看报错信息居然是:ORA-00942: 表或视图不存在
因为昨晚给数据库做了双机dataguard,为了确保割接顺利进行,我把备库的数据库删了重新导入了,今天早上又把备库的数据恢复。难道是备库中少导入了表?
查看昨晚备库的导出日志,确实没有这部分表。同事说这些表他确实是建在备库上了。感觉非常奇怪,但是各种备份日志都查不到错误信息,而且备库的备份日志显示:“成功终止导出, 没有出现警告。”查看导出列表,确实没这些表。诡异的~~~
最后想到用的库是最新版本的ORACLE 11R2,怀疑是遇到BUG了。一查资料发现,原来是ORACLE 11R2新参数的问题。
ORACLE 11g 新增了一个参数:deferred_segment_creation,从字面理解含义是段延迟创建,该参数取值范围是true和false,默认是true。具体是如果deferred_segment_creation为true,当新建表并且没有向其中插入数据的时候,这个表不会立即分配extent,即不占数据空间,只有insert数据后才分配空间,这样做可以节省少量的空间。但是也给初接触oracle 11g的人带来了麻烦,我就是受害者之一!!!
如果deferred_segment_creation为false,那就和之前版本创建表一样,创建时即分配extent。
 
一、问题提出
如果deferred_segment_creation为默认值,当通过EXP命令来导出整个用户时,所有没有数据的表都导不出来。
二、问题分析
1、新建表没有分配extent,在user_segments视图中必然查不到,但是在user_tables中是可以查到的。这样就可以找出哪些表是没有创建extent的:
select * from user_tables
where table_name not in
(select segment_name from user_segments where segment_type = 'TABLE');
 
2、通过alter table xxx allocate extent 语句立即为其分配extent:
 
alter table t1 allocate extent (size 64k);
 
三、问题解决
 
1、批量处理所有“空表”:
select 'alter table '||table_name||' allocate extent(size 64k);' sql_text,table_name,tablespace_name
from user_tables
where table_name not in
(select segment_name from user_segments where segment_type = 'TABLE');
2、把sql_text列在sqlplus中执行一下就可以通过exp导出。
 
3、如果觉得每次导出都这样做太麻烦,完全可以将deferred_segment_creation参数调为false,这样调整后建的表都会立即分配空间,但是调整前的表都不会改变,因此还需要用1、2提到的办法解决。
--调整deferred_segment_creation为false:
SQL> alter system set deferred_segment_creation=false;
--调整deferred_segment_creation为默认值:
SQL> alter system reset deferred_segment_creation;
 
四、其他方法
 
1、现在网上提到的办法都是先往表中间insert一条数据,然后再rollback,使之分配空间。但是每次建表都这样做也是比较麻烦,不推荐。
2、通过move(alter table table_name move;)的办法也能得到相同的效果,因为move会使部分索引失效,所以也不推荐。
如果空间不是很紧张,还是建议把这个参数改成false。不过,如果你是用expdp代替exp的话,就不会出现这个问题。而且expdp比exp要快,只是exp先入为主,大家都比较习惯是用exp。oracle添加deferred_segment_creation这个参数的目的难到只是为了节省一点空间么?而且也只是在创建表时没分配extent,当插入数据的时候并不会节省空间,还是顺便推荐大家以后多使用expdp?

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

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

注册时间:2009-02-18

  • 博文量
    256
  • 访问量
    1202452