oracle11g无法导出空表问题原理方案

oracle 11g 新增了一个参数:deferred_segment_creation,含义是段延迟创建,默认是true。

解释如下:

    如果这个参数设置为true,你新建了一个表T1,并且没有向其中插入数据,那么这个表不会立即分配extent,也就是不占数据空间,只有当你insert数据后才分配空间。这样可以节省少量的空间。所以需要设置

deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment。

具体操作为在sqlplus中,执行如下命令:

SQL>alter system set deferred_segment_creation=false;

即可设置deferred_segment_creation值为false

执行以下语句可查看其状态:
SQL>show parameter deferred_segment_creation;


注 : 以上命令只对之后新增的表有效,对现有空表没有任何影响,因此还需要进一步对现有空表进行处理,

即执行如下操作:

首先执行以下sql语句,手工为空表分配Extent,构建针对空表分配空间的命令语句

SQL>Select ‘alter table ‘||table_name||‘ allocate extent;‘ from user_tables where num_rows=0

然后生成类似与如下格式的命令语句

alter DOM_PHOTO1 allocate extent
alter DOM_PHOTO2 allocate extent
alter DOM_PHOTO3 allocate extent
alter DOM_PHOTO4 allocate extent
alter DOM_PHOTO5 allocate extent
alter DOM_PHOTO6 allocate extent
alter DOM_PHOTO7 allocate extent

然后复制这些语句到sql窗口执行一下即可(注:生成的每条sql结尾并没有分号结尾,所以需要自己手动格式化一下sql再执行)

 

执行完上面生成的sql,再重新导出数据库,这样空表和有数据的表可以一并导出来了

ps:上面的方法大都是参照网上的解决方案进行的整理,本人只是按照自己的思路做了一下整理

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。