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;

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

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了。

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

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

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

时间: 2024-10-12 11:31:05

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

解决 Oracle 11g 不能导出空表的问题

--解决 Oracle 11g 不能导出空表的问题 --执行下面语句,查询数据库中的空表,同时产生分配空间.把生成的结果复制出来并执行. select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 --如果以上方法不行,可改用下面方法 select 'alter table '||table_name||' allocate extent(size 64k);' from tab

oracle 11g不能导出空表的解决方法

在oracle 11g r2中,发现传统的exp居然不能导出空的表,然后查询一下, 发现需要如下的步骤去搞,笔记之. oracle 11g 新增了一个参数:deferred_segment_creation,含义是段延迟创建,默认是true.具体是什么意思呢? 如果这个参数设置为true,你新建了一个表T1,并且没有向其中插入数据,那么这个表不会立即分配extent,也就是不占数据空间,只有当你insert数据后才分配空间.这样可以节省少量的空间. 解决办法 1 设置deferred_segme

oracle exp 无法导出空表

oracle exp 无法导出空表   select 'alter table '|| a.table_name ||' allocate extent;' from user_tables a where a.table_name not in (select segment_name from user_segments where segment_type = 'TABLE'); 执行查出的sql语句,再导出dmp,就能导出空表了. Oracle 11g无法导出空表的处理方法 在SQL窗口

ORACLE EXP不能导出空表的原因分析及解决方法

一.不能导出空表的原因 1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment. 在sqlplus中,执行如下命令: SQL>alter system set deferred_segment_creation=false; 查看: SQL>show parameter deferred_segment_creat

Oracle11g在使用exp导出时不导出空表问题的解决办法

11G中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法: 1.insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segment.导出时则可导出空表. 2.设置deferred_segment_creation 参数 show parameter deferred_segment_creation NAME                                 TYPE        VALUE --------

解决Oracle数据库不能导出空表的问题

标题的描述不太确切,应该是没有插入过数据的表(即:插入过数据,之后删除的行数为0的表是可以导出的) 解决办法: 1. 执行SQL: select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0; 2. 将sql结果(结果为拼接的sql语句),复制出来在数据库中执行 3.正常导出(这时那些空表都可以导出了)

oracle 11g exp默认空表不导出 原因及解决方法

在oracle11g中,每张表在起初创建时,默认是不分配区段给此对象. 当首次插入数据时,会分配对应的区段. 对应控制参数为 deferred_segment_creation=true 如果要保持跟低版本保持一致的属性,可以设定此参数值为flase alter system set deferred_segment_creation=false scope=both; 在后续创建的新表中,会默认分配区段. 如果参数值设定为true,即使在创建表时指定具体的存储参数来获取初始区段大小,也不会分配

解决11g无法导出空表的问题

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

RequiredFieldValidator控件验证不能为空时报错多种解决方法以及问题分析

最近在学asp.net,在使用RequiredFieldValidator控件进行验证时,发现报错,界面控件如下图: 点击完确定之后按理来说是要报不能为空的提示的但是却报错如下图: 经过一番研究发现,也看了其他人的解决方案,总结如下: .net 4.5 ~(vs2012~)控件默认都Enable了 ,Unobtrusive ValidationMode的属性(和jquery的引用相关),但并未对其进行赋值, 必须手动对其进行设置.在进行数据验证时使用的各种validator需要在前端调用jque