我想将oracle转储导入另一个表空间.
我有一个用户A使用的表空间.我已经撤销了这个用户的DBA并给了他补助连接和资源.然后我用命令抛弃了所有东西
exp a/***owner = a file = oracledump.dmp log = log.log compress = y
现在我想将转储导入用户B使用的表空间B.所以我给了他关于连接和资源的授权(没有DBA).然后我执行了以下导入:
imp b/***file = oracledump.dmp log = import.log fromuser = a touser = b
结果是一个包含大量错误的日志:
IMP-00017:以下语句因ORACLE错误20001失败:"BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003:ORACLE错误20001遇到ORA-20001:输入值无效或不一致
之后我尝试了相同的导入命令,但选项statistics = none.这导致以下错误:
ORA-00959:表空间'A_TBLSPACE'不存在
该怎么做?
注意:很多列都是CLOB类型.看起来问题与此有关.
注2:oracle版本是9.2,10.1和10.1 XE的混合.但我不认为它与版本有关.
你在这里遇到了几个问题.
首先,您正在使用的Oracle的不同版本是表统计信息错误的原因 - 当我们的一些Oracle 10g数据库升级到版本2时,我遇到了同样的问题,而且有些版本仍在版本1上,而且我正在交换.它们之间的DMP文件.
对我有用的解决方案是使用相同版本的工具exp
和imp
工具在不同的数据库实例上进行导出和导入.通过使用相同的PC(或Oracle Server)发出所有导出和导入命令,这是最容易做到的.
其次,我怀疑你是ORA-00959: tablespace 'A_TBLSPACE' does not exist
因为你正试图将一个.DMP文件从一个完整的Oracle数据库导入到10g Express Edition(XE)数据库中,默认情况下,该数据库会创建一个预定义的表空间USERS
.您.
如果是这种情况,那么你需要做以下事情..
使用.DMP文件,创建包含结构(表)的SQL文件:
imp
在文本编辑器中打开indexfile(index.sql),该编辑器可以查找并替换整个文件,并在IN ORDER中发出以下查找和替换语句(忽略单引号..'):
Find: 'REM
Find: '"
Find: '...' Replace: 'REM ...'
Find: 'CONNECT' Replace: 'REM CONNECT'
保存索引文件,然后针对您的Oracle Express Edition帐户运行它(我发现最好创建一个新的空白XE用户帐户 - 或者如果我正在刷新则删除并重新创建):
sqlplus
最后运行相同的.DMP文件,您使用相同的帐户创建索引文件,以导入数据,存储过程,视图等:
imp
在尝试创建某些对象(例如数据库作业)时,您可能会收到Oracle错误页面,因为Oracle将尝试使用相同的数据库标识符,这很可能会因为您位于不同的数据库而失败.
如果您使用的是Oracle 10g和datapump,则可以使用REMAP_TABLESPACE子句.例:
REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
对我来说这项工作没问题(Oracle数据库10g快捷版10.2.0.1.0版):
impdp B/B full=Y dumpfile=DUMP.dmp REMAP_TABLESPACE=OLD_TABLESPACE:USERS
但是对于新的恢复,您需要新的表空间
PS也许有用http://www.oracle-base.com/articles/10g/OracleDataPump10g.php