oracle11g默认对空表不分配segment,故使用exp导出oracle11g数据库时,空表不会导出。
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_creation;
该值设置后只对后面新增的表产生作用,对之前建立的空表不起作用。
3、可以使用手工为空表分配extent的方式,来解决导出之前建立的空表的问题。说明如下:
3.1 使用allocate extent的说明
使用allocate extent可以为数据库对象分配extent。其语法如下:
-----------
allocate extent { size integer [k | m] | datafile 'filename' | instance integer }
-----------
可以针对数据表、索引、物化视图等手工分配extent。
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)
针对数据表操作的完整语法如下:
-----------
alter table [schema.]table_name allocate extent [({ size integer [k | m] | datafile 'filename' | instance integer})]
-----------
故,需要构建如下样子简单的sql命令:
-----------
alter table atabelname allocate extent
-----------
3.2 构建对空表分配空间的sql命令,,
查询当前用户下的所有空表(一个用户最好对应一个默认表空间)。命令如下:
-----------
sql>select table_name from user_tables where num_rows=0;
-----------
根据上述查询,可以构建针对空表分配空间的命令语句,如下:
-----------
sql>select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0
-----------
批量输出上述生成的sql语句,建立c:\createsql.sql,其内容如下:
-----------
set heading off;
set echo off;
set feedback off;
set termout on;
spool c:\allocate.sql;
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
spool off;
-----------
执行c:\createsql.sql,命令如下:
-----------
sql>@ c:\createsql.sql;
-----------
执行完毕后,得到c:\allocate.sql文件。
打开该文件会看到,已经得到对所有空表分配空间的命令sql语句。
3.4 执行sql命令,对空表分配空间:
执行c:\allocate.sql,命令如下:
-----------
sql>@ c:\allocate.sql;
-----------
执行完毕,表已更改。
3.4 此时执行exp命令,即可把包括空表在内的所有表,正常导出。
相关阅读:
linux平台下的oracle自动备份案例(使用exp工具)
exp/imp迁移数据库的时候注释乱码解决方法
linux下导出数据库dmp文件时exp-00091错误
浅谈oracle的exp备份问题
exp/imp迁移数据