Oracle 11gR2 使用exp,imp命令导入与导出

一.相同环境下的导入与导出

以用户模式导出所有表:

C:\Users\Administrator>exp wlwddc/wlwddc owner=wlwddc rows=y indexes=n compress=n buffer=65536 feedback=100000 file=E:\exp.dmp log=E:\exp.log

以用户模式导入表:

C:\Users\Administrator>imp wlwddc/wlwddc fromuser=wlwddc touser=wlwddc rows=y indexes=n file=D:\EXPDAT.DMP log=imp.log;

在导入后发现exp导出的仅仅是有数据的表,没有空表。这是因为Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出。解决方法:

1. insert一行,再rollback就产生segment了,这种方法有些麻烦。

 该方法是在在空表中插入数据,再删除,则产生segment。导出时则可导出空表。

2. 设置deferred_segment_creation 参数

 该参数值默认是TRUE,当改为FALSE时,无论是空表还是非空表,都分配segment。

    SQL>alter system set  deferred_segment_creation=false; 

    这样显然增加了数据库存储负担。

3. 先查询一下需要导出的表哪些是空的,然后分配segment,这里我们采用第三种方法解决此问题:
   SQL>select table_name from user_tables where NUM_ROWS=0; 


注意:在某些情况下虽然表是空的,但是执行上述语句时返回结果为空,这是因为Oracle没有做过表分析

SQL>analyze table tablename compute statistics;

表分析的结果被Oracle用于基于成本的优化生成更好的查询计划,其中dba_tables/user_tables 有个字段num_rows表示表的行数。

上述是分析特定的表,获取所有用户下所有的表的SQL语句的SQL语句如下:

SQL> select 'analyze table ' || table_name  || ' compute statistics;' from user_tables;

会得出每一个表分析的sql语句:analyze table table_name compute statistics;

然后再执行这些SQL语句:

SQL>analyze table table_name compute statistics;

也可以将这些语句使用spool命令输出到sql脚本:

SQL> spool E:\analyze.sql;

SQL> select 'analyze table ' || table_name  || ' compute statistics;' from user_tables;

SQL> spool off;

然后删除脚本里多余行后执行:

SQL> @E:\analyze.sql;

就对每一个表做表分析 了。

  
2.通过上述表分析后,下面我们通过select 来生成修改语句,给空表分配segment: 
SQL>select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 

同样在获取SQL语句后,执行SQL语句给空表分配segment了。

3. 给所有的表分配segment之后,再exp就会导出所有的表了。

C:\Users\Administrator>exp wlwddc/wlwddc owner=wlwddc rows=y indexes=n compress=n buffer=65536 feedback=100000 file=E:\exp.dmp log=E:\exp.log

Export: Release 11.2.0.1.0 - Production on 星期五 7月 3 11:43:44 2015

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Productio
n
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已导出 AL32UTF8 字符集和 AL16UTF16 NCHAR 字符
注: 将不导出表的索
. 正在导出 pre-schema 过程对象和操
. 正在导出用户 WLWDDC 的外部函数库
. 导出 PUBLIC 类型同义
. 正在导出专用类型同义
. 正在导出用户 WLWDDC 的对象类型定
即将导出 WLWDDC 的对象...
. 正在导出数据库链
. 正在导出序号
. 正在导出簇定
. 即将导出 WLWDDC 的表通过常规路径..

.正在导出表

. 正在导出同义
. 正在导出视图
. 正在导出存储过程
. 正在导出运算
. 正在导出引用完整性约束条
. 正在导出触发
. 正在导出索引类型
. 正在导出后期表活
. 正在导出实体化视
. 正在导出快照日志
. 正在导出作业队列
. 正在导出刷新组和子组
. 正在导出
. 正在导出 post-schema 过程对象和操作
. 正在导出统计信息
成功终止导出, 没有出现警告。


可以看到所有的表都导出了,在执行imp后查询显示所有的表都导入了。


补充:

exp如果不指定file的话,默认路径是CMD的当前路径

参考:

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




你可能感兴趣的:(Oracle)