摘自:http://space.itpub.net/751371/viewspace-702058
ORACLE 11g 新增了一个参数:deferred_segment_creation,从字面理解含义是段延迟创建,该参数取值范围是true和false,默认是true。具体是如果deferred_segment_creation为true,当新建表并且没有向其中插入数据的时候,这个表不会立即分配extent,即不占数据空间,只有insert数据后才分配空间,这样做可以节省少量的空间。如果deferred_segment_creation为false,那就和之前版本创建表一样,创建时即分配extent。
一、问题提出
如果deferred_segment_creation为默认值,当通过EXP命令来导出整个用户时,所有没有数据的表都导不出来。
二、问题分析
1、新建表没有分配extent,在user_segments视图中必然查不到,但是在user_tables中是可以查到的。这样就可以找出哪些表是没有创建extent的:
select * from user_tables where table_name not in (select segment_name from user_segments where segment_type = 'TABLE');
2、通过alter table xxx allocate extent 语句立即为其分配extent:
alter table t1 allocate extent (size 64k);
三、问题解决
1、批量处理所有“空表”:
select 'alter table '||table_name||' allocate extent(size 64k);' sql_text,table_name,tablespace_name
from user_tables where table_name not in (select segment_name from user_segments where segment_type = 'TABLE');
2、把sql_text列在sqlplus中执行一下就可以通过exp导出。
3、如果觉得每次导出都这样做太麻烦,完全可以将deferred_segment_creation参数调为false,这样调整后建的表都会立即分配空间,但是调整前的表都不会改变,因此还需要用1、2提到的办法解决。
--调整deferred_segment_creation为false:
SQL> alter system set deferred_segment_creation=false;
--调整deferred_segment_creation为默认值:
SQL> alter system reset deferred_segment_creation;
四、其他方法
1、现在网上提到的办法都是先往表中间insert一条数据,然后再rollback,使之分配空间。但是每次建表都这样做也是比较麻烦,不推荐。
2、通过move(alter table table_name move;)的办法也能得到相同的效果,因为move会使部分索引失效,所以也不推荐。
如果空间不是很紧张,还是建议把这个参数改成false。不过,如果你是用expdp代替exp的话,就不会出现这个问题。而且expdp比exp要快,只是exp先入为主,大家都比较习惯是用exp。oracle添加deferred_segment_creation这个参数的目的难到只是为了节省一点空间么?而且也只是在创建表时没分配extent,当插入数据的时候并不会节省空间,还是顺便推荐大家以后多使用expdp?
分享到:
相关推荐
这个问题通常与 Oracle 11gR2 引入的一个新特性—— Deferred Segment Creation(延迟段创建)有关。这个特性旨在提升数据库对象创建的效率,它会延迟对那些在创建时没有数据、不需要立即分配 Segment 的对象的 ...
Oracle 11g R2 中 exp 无法导出空表的解决方法有四种:insert 一行再 rollback、设置 deferred_segment_creation 参数、使用 expdp 命令、使用 alter 语句。每种方法都有其优缺,选择哪种方法取决于具体情况。
通过设置`deferred_segment_creation`为`FALSE`,无论新创建的表是否为空,都会为其分配存储空间。需要注意的是,这个设置只会影响新创建的表,对于之前已经存在的空表不起作用。 #### 解决方案二:为已有的空表...
deferred_segment_creation 参数是 Oracle 11g 中的一个新特性,它控制着表的 segment 创建时机。当这个参数的值为 TRUE 时,Oracle 会在表中有数据时才创建 segment,以节省空间。而当这个参数的值为 FALSE 时,...
在 Oracle 11g R2 版本中,可能会出现空表无法导出的问题,这是由于deferred_segment_creation 参数的原因。解决这个问题可以使用三种方法:insert 一行再 rollback、设置 deferred_segment_creation 参数、强行修改...
Oracle 11g 中的 deferred_segment_creation 参数是指延迟段创建的参数,该参数的默认值为 TRUE。在这个参数设置为 TRUE 的情况下,当我们创建一个新的表时,如果没有插入数据,那么这个表不会立即分配 extent,也...
然而,在使用 exp 命令导出 Oracle 11g 数据库时,空表会出现错误,这是因为 Oracle 11g 默认对空表不分配 segment。为了解决这个问题,我们可以使用以下几种方法。 方法 1: 修改 deferred_segment_creation 参数 ...
--Oracle11g中Exp空表的问题:禁用插入数据时才分配空间功能 show parameter deferred_segment_creation alter system set deferred_segment_creation=false; -- 查找空表: select 'alter table '||table_name||'...
Oracle 11G 导入导出(imp 和 exp)少表解决方法 Oracle 11G 是一个功能强大且复杂的数据库管理系统,它提供了多种方式来导入和导出数据。然而,在使用 Oracle 11G 时,用户可能会遇到一些问题,例如无法导出空表...
Oracle11g为提高性能和节省空间,默认情况下对空表不分配segment(即数据段),这就导致了在使用exp工具进行数据导出时,空表无法被导出。这个行为是受deferred_segment_creation参数控制的,当其设置为TRUE时,默认...
在Oracle 11g数据库系统中,用户可能会遇到无法导出空表的问题,这主要与Oracle 11g引入的一个新特性有关,即deferred_segment_creation参数。这个参数默认为true,它的作用在于延迟段的创建。当这个参数启用时,...
这一问题的出现通常与Oracle数据库中的`deferred_segment_creation`参数有关。 #### 解决方案一:调整`deferred_segment_creation`参数 ##### 步骤一:查询参数状态 首先,需要确定`deferred_segment_creation`...
在Oracle 11gR2版本中,Oracle数据库引入了一个新的特性——延迟段创建(Deferred Segment Creation)。这个特性主要是为了优化空间管理,特别是在处理大量空表时,可以有效地避免不必要的磁盘空间占用。延迟段创建...
一、不能导出空表的原因1、Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出。 2、设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment。 在...
Oracle 11G 的导入导出工具 exp 和 imp 是数据库管理员进行数据迁移、备份和恢复的重要工具。然而,在11G R2 版本中,由于一个新特性,空表在没有数据的情况下不会分配 segment,导致无法通过 exp 导出。这个问题...
1、Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出。 2、设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment。 在sqlplus中,执行如下命令: ...
1. **数据库参数`deferred_segment_creation`**: 这个参数被设置为默认值`true`,意味着在创建新表时并不会立即为其分配存储空间(段),而是在向表中插入第一条记录时才分配。这在某些情况下可以节省空间,但在导入...
SQL>show parameter deferred_segment_creation; 如果为TRUE,则将该参数改为FALSE; 在sqlplus中,执行如下命令: SQL>alter system set deferred_segment_creation=false; 然后: 可以针对数据表、索引、物化...