今天遇到一个群有,他说在oracle11g上利用exp导出的时候,发现原本数据库中有723张表,但是用exp导出的时候却只能导出304张出来,其实这个原因是oralce11g 中增加了一个新特性 "deferred_segment_creation" 含义是段延迟创建,默认是true。
具体解释:
如果这个参数设置为true,你新创建了一个table,并且没有向其中插入数据,那么这个表不会立即分配extend,也就是不占数据空间,即表不分配segment以节省空间,所以这些表也没能导出来。在系统表user_tables中也可以看到segment_treated的字段里是“NO”或者“YES”说明了某张表是否分配了segment。说白了是为了可以节省少量的空间。
下面给出解决办法:
对空表分配空间
select 'alter table ' ||table_name ||' allocate extent;' from user_tables where segment_created='NO';
上述代码可产生批量的修改表extent的SQL语句(有多少张空表就产生多少条),我们只需要将其生成的所有sql代码全部执行,就可以给每一张已经存在的表来分配 segment,然后就可以利用exp 导出了
网友评论