以用户模式导出所有表:
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 Production
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不能导出空表的原因分析及解决方法