ITPub博客

首页 > 数据库 > Oracle > Oracle11G不能导出空表的解决办法

Oracle11G不能导出空表的解决办法

Oracle 作者:黑夜不怕醉 时间:2012-11-07 18:15:00 0 删除 编辑

11G中有个新特性,当表无数据时,不分配segment,以节省空间

 

解决方法:

1、insert一行,再rollback就产生segment了。

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

2、设置deferred_segment_creation 参数

查看deferred_segment_creation 参数属性 show parameter deferred_segment_creation 
设置deferred_segment_creation 参数属性  alter system set deferred_segment_creation=false; 

该参数值默认是TRUE,当改为FALSE时,无论是空表还是非空表,都分配segment。

 

需注意的是:该值设置后对以前导入的空表不产生作用,仍不能导出,只能对后面新增的表产生作用。如需导出之前的空表,只能用第一种方法。

 

已经存在的空表可以通过进行一次修改,来分配segment

 

 

先查询一下当前用户下的所有空表

select table_name from user_tables where NUM_ROWS=0;  --这一句不一定能查询出所有空表

//如果在导入dmp文件的过程中报IMP-00003异常(找不到外键关联),那么就说明上面的语句不是很好用,具体为什么来不急研究了

//用下面的语句可以解决上面语句的问题

 

DECLARE

V_SQL VARCHAR2(2000);

V_TN VARCHAR2(100);

V_TNC NUMBER(10);

BEGIN

  FOR V_ST IN (SELECT U.TABLE_NAME FROM USER_TABLES U) LOOP

    V_SQL := 'SELECT COUNT(1) FROM ' || V_ST.TABLE_NAME;

    EXECUTE  IMMEDIATE V_SQL INTO V_TNC;

    IF (V_TNC = 0) THEN

       DBMS_OUTPUT.PUT_LINE('ALTER TABLE '||V_ST.TABLE_NAME||' ALLOCATE EXTENT;');  

    END IF;

  END LOOP;

END;

【注】:执行完后在PLSQL的Output窗口复制所有的打印语句在SQL窗口执行即可。

 

用以下这句查找空表

select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0

 

将空表的修改语句导出,重新执行。


【注】:allocate extent (分配程度)


------------------------------------------------------------------------------------------------------------------------------------------


IMP-00010的错误为从11G客户端导出的dmp文件不能导入到10G中。

解决办法:

用10G的客户端连接11G的服务器进行导出,然后再将导出的dmp文件导入到另一台10G的数据库中。

<!-- 正文结束 -->

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

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-05-01