oracle11G中有个新特性,当表无数据时,不分配segment,以节省空间所以就不能被导出。
这在我们日常备份数据库、搭建测试环境,年底新年度初始化时将产生影响。
解决方法:
方法1、此方法可永久解决,但需要修改数据库deferred_segment_creation参数。
参数修改前:
**SQL> show parameter deferred_segment_creation
NAME TYPE VALUE
—————————————————— —————- ———————————————
deferred_segment_creation boolean TRUE **
执行下列语句:
SQL> alter system set deferred_segment_creation=false;
参数修改后:**SQL> show parameter deferred_segment_creation
NAME TYPE VALUE
—————————————————— —————- ———————————————
**
该参数值默认是TRUE,当改为FALSE时,无论是空表还是非空表,都分配segment。
需注意的是:该值设置后对以前导入的空表不产生作用,仍不能导出,只能对后面新增的表产生作用。
如需导出之前的空表,只能用第二种方法。
方法2、此方法只对当前用户有效,每个用户要想全部导出都需要做此操作。
连接对应数据库,执行下面语句后即可全部导出所有表:
DECLARE
BEGIN
FOR V_ST IN (SELECT U.TABLE_NAME FROM USER_TABLES U where u.NUM_ROWS=0 and u.tablespace_name is not null)
LOOP
EXECUTE IMMEDIATE ‘ALTER TABLE ‘||V_ST.TABLE_NAME||’ ALLOCATE EXTENT’;
END LOOP;
END;/
-注意:如果在SQL windows执行,不需要加“/”,如果在command window执行则需要加“/”。