oracle 11g新增了一个参数:deferred_segment_creation,含义是段延迟创建,默认是true。当deferred_segment_creation=true时,新创建的表在未插入数据前,数据库不会立即为此表分配segment,也就是说不占用数据空间,只有在向此表中插入数据后才真正分配空间。
这样虽可以节省少量的空间,但也会造成其他问题。当使用exp命令进行数据库导出时,未分配空间的表是不会导出的,如此造成了数据库的不完整,给数据库的迁移带来麻烦。
解决未分配空间的表不导出的问题可采取如下方法:
修改deferred_segment_creation参数值为false
当deferred_segment_creation参数的值设为FALSE后,无论是空表还是非空表,都分配segment。
在sqlplus中执行如下命令:
SQL> alter system set deferred_segment_creation=false; |
SQL> show parameter deferred_segment_creation; |
使用ALLOCATE EXTENT命令手动为空表分配空间
使用ALLOCATE EXTENT可以为数据库对象分配Extent。其语法如下:
ALLOCATE EXTENT { SIZE integer [K | M] | DATAFILE 'filename' | INSTANCE integer } |
ALLOCATE EXTENT使用样例:
ALLOCATE EXTENT
ALLOCATE EXTENT(SIZE integer [K | M])
ALLOCATE EXTENT(DATAFILE 'filename')
ALLOCATE EXTENT(INSTANCE integer)
ALLOCATE EXTENT(SIZE integer [K | M] DATAFILE 'filename')
ALLOCATE EXTENT(SIZE integer [K | M] INSTANCE integer)
构建对空表分配空间的SQL命令
SQL> conn esb/esb
SQL> select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0; |
SQL> select 'alter table '||table_name||' allocate extent;' from all_tables where owner='ESB' and num_rows=0; |
SQL> select 'alter table '||table_name||' allocate extent;' from dba_tables where owner='ESB' and num_rows=0; |
SQL>alter table ESB_SVCVER_MIGRATSCHEMA allocate extent;
SQL>alter table ESB_REVERSAL allocate extent;
SQL>alter table ESB_REVERSAL_SUB allocate extent;
SQL>alter table ESB_STAT allocate extent;
SQL>alter table BPL_PROCESSDEFINITION allocate extent;
SQL>alter table ESB_FAMSGSCHEMA allocate extent; |