好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Oracle 11g不能导出空表的多种解决方法

查资料发现 Oracle 11g 中有个新特性 :新增了一个参数“ deferred_segment_creation ”含义是段延迟创建,默认是 true 。

具体是什么意思呢?

deferred_segment_creation ,即建立表的时候,这个表不会立即分配 extent ,也就是不占数据空间,即表也不分配 segment 以节省空间。直接在字典中记录了数据结构。而只有当真正有数据的时候才分配空间。这种方法对于象 SAP 这样大的系统需要部署成千上万张表是非常有效的。默认是开启的为 ture ,需要关闭 alter system set deferred_segment_creation=false;

在系统表 user_tables 中也可以看到 segment_treated 的字段里是“ NO ”或者“ YES ”说明了某张表是否分配了 segment 。

用下面的 SQL 语句查询,可以发现没有导出的表其 segment_created 字段值都是 ‘NO‘ 。

Select segment_created,table_name from user_tableswhere segment_created = ‘NO‘;

解决方案:

1 、最原始最笨的办法 ( 不推荐 ):insert 一行,再 rollback 或者删除就产生 segment 了。

该方法是在在空表中插入数据,再删除,则产生 segment 。导出时则可导出空表。

 

2 、设置 deferred_segment_creation 参数:

   设置 deferred_segment_creation 参数为 FALSE 来禁用 " 段推迟创建 "( 也就是直接创建 segment) ,无论是空表还是非空表,都分配 segment 。

   在 sqlplus 中,执行如下命令:

SQL>alter system setdeferred_segment_creation=false;

查看:

SQL>show parameterdeferred_segment_creation;

   注意 :该值设置后只对后面新增的表产生作用,对之前建立的空表 ( 已经存在的 ) 不起作用,仍不能导出。

   并且要重新启动数据库,让参数生效。

 

3 、使用 ALLOCATE EXTENT ,可以导出之前已经存在的空表。

使用 ALLOCATE EXTENT 可以为数据库对象的每一张表分配 Extent( 注意针对每一张表,就是说一张表需要一条 SQL 代码 ) ,但要是每一张表写一条语句的话太过麻烦,为了方便我们使用 SQL 命令拼写出每一张表的 alter 语句。

 

构建对空表分配空间的 SQL 命令。

查询当前用户下的所有空表(一个用户最好对应一个默认表空间)。命令如下:

   SQL>select table_name from user_tableswhere NUM_ROWS=0; 

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/DD/wKioL1VUo1rS93qYAACQR5Xqnt0116.jpg" title="2.png" alt="wKioL1VUo1rS93qYAACQR5Xqnt0116.jpg" />


根据上述查询,可以构建针对空表分配空间的命令语句,如下:

   SQL>Select ‘alter table ‘||table_name||‘allocate extent;‘ from user_tables where num_rows=0 or num_rows is null (注意:很多教程没有这里,这里是有可能为空的)

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/DD/wKioL1VUo3TjfiITAAHjt35pcRw120.jpg" title="3.png" alt="wKioL1VUo3TjfiITAAHjt35pcRw120.jpg" />

上述代码可产生批量的修改表 extent 的 SQL 语句 ( 有多少张空表就产生多少条 ) ,我们只需要将其生成的所有 sql 代码全部执行,就可以给每一张已经存在的表来分配 segment ,就 OK 了。  

4 、执行对空表分配空间的 SQL 命令。

alter table WJDCPERSON allocate extent;
alter table VERSION_NUMBER allocate extent;

5 、执行完以上命令,然后再用 exp 的方式去导出数据库,就可以完整的导出包括空表的数据库。


本文出自 “运维笔录 美玲” 博客,请务必保留此出处http://meiling.blog.51cto.com/6220221/1651395

Oracle 11g不能导出空表的多种解决方法

标签:oracle 11g不能导出空表的多种解决方法   oracle数据库不能导出空表   

查看更多关于Oracle 11g不能导出空表的多种解决方法的详细内容...

  阅读:21次