Oracle之数据库导出表出现缺表,少表问题

Oracle数据库导出表出现缺表,少表问题

oracle11g有个新特性,增加了一个新特性 "deferred_segment_creation" 含义是段延迟创建,默认是true。

   具体是什么意思呢?我们来解释下:

   如果这个参数设置为true,你新创建了一个Table,并且没有向其中插入数据,那么这个表不会立即分配extend,也就是不占数据空间,即表不分配segment以节省空间,所以这些表也没能导出来。在系统表user_tables中也可以看到segment_treated的字段里是“NO”或者“YES”说明了某张表是否分配了segment。说白了是为了可以节省少量的空间。

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

Select segment_created,table_name from user_tables where segment_created = 'NO';

解决办法:

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

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

  • 第二种
    设置deferred_segment_creation 参数:
    设置deferred_segment_creation 参数为FALSE来禁用"段推迟创建"(也就是直接创建segment),无论是空表还是非空表,都分配segment。
    在sqlplus中,执行如下命令:
SQL>alter system set deferred_segment_creation=false;

查看:

SQL>show parameter deferred_segment_creation;

注意:该值设置后只对后面新增的表产生作用,对之前建立的空表(已经存在的)不起作用,仍不能导出。
并且要重新启动数据库,让参数生效。

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

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

  >SQL:  select table_name from user_tables where num_rows='0'

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

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

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

再用exp命令进行导出即可。(例如:exp cass1/cass1@10.10.49.28:1521/DW file=D:\CASS1.dmp ) 末尾如果加上full=y,表示导出服务器上面的全部数据表,即所有表空间下面的表,也包括系统表。

posted @ 2021-12-22 09:15  King-DA  阅读(475)  评论(0)    收藏  举报