如何在其他表空间中导入Oracle转储
我想将一个oracle转储导入另一个表空间。
我有一个供用户A使用的表空间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: following statement failed with ORACLE error 20001: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: ORACLE error 20001 encountered ORA-20001: Invalid or inconsistent input values
之后,我尝试了相同的导入命令,但选项statistics = none。这导致以下错误:
ORA-00959: tablespace 'A_TBLSPACE' does not exist
应该怎么做?
注意:很多列都是CLOB类型。看来问题与此有关。
注意2:oracle版本是9.2、10.1和10.1 XE的混合版本。但是我认为这与版本无关。
解决方案
回答
问题与CLOB列有关。似乎imp工具无法重写create语句以使用另一个表空间。
来源:http://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :::: P11_QUESTION_ID:66890284723848
解决方案是:
在正确的表空间中手动创建模式。如果没有用于创建模式的脚本,则可以使用imp工具的indexfile =来创建它。
我们必须禁用自己的所有约束,oracle imp工具不会禁用它们。
之后,我们可以使用以下命令导入数据:
imp b/*** file=oracledump.dmp log=import.log fromuser=a touser=b statistics=none ignore=y
注意:由于其他错误,我仍然不需要statistics = none。
有关数据泵的额外信息
从Oracle 10开始,对导入/导出进行了改进:数据泵工具([http://www.oracle-base.com/articles/10g/OracleDataPump10g.php][1])
使用它将数据重新导入到新表空间中:
- 首先为临时转储创建一个目录:
CREATE OR REPLACE DIRECTORY tempdump AS '/temp/tempdump/'; GRANT READ, WRITE ON DIRECTORY tempdump TO a;
- 出口:
expdp a/* schemas=a directory=tempdump dumpfile=adump.dmp logfile=adump.log
- 进口:
impdp b/* directory=tempdump dumpfile=adump.dmp logfile=bdump.log REMAP_SCHEMA=a:b
注意:转储文件是从服务器磁盘而不是从本地(客户端)磁盘存储和读取的
回答
我们正在使用哪个版本的Oracle?如果大于或者等于10克,则应考虑使用数据泵,而不要使用导入/导出。我不确定100%是否可以处理这种情况,但我希望可以。
数据泵可替代10g及以上的exp / imp。它的工作方式与exp / imp非常相似,但其效果更好(据说,由于我卡在9i土地上,所以我不使用它)。
这是数据泵文档
回答
如果我们使用的是Oracle 10g和datapump,则可以使用REMAP_TABLESPACE子句。例子:
REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
回答
我们在这里遇到了几个问题。
首先,我们使用的Oracle版本不同是表统计错误的原因,当我们的某些Oracle 10g数据库升级到版本2时,我遇到了同样的问题,而有些仍在版本1上,而我正在交换.DMP他们之间的文件。
对我有用的解决方案是使用相同版本的exp
和imp
工具在不同的数据库实例上进行导出和导入。使用同一台PC(或者Oracle Server)发出所有导出和导入命令最容易做到。
其次,我怀疑我们收到的是" ORA-00959:表空间'A_TBLSPACE'不存在",因为我们正试图将功能齐全的Oracle数据库中的.DMP文件导入10g Express Edition(XE)数据库,默认情况下,它将为我们创建一个名为" USERS"的预定义表空间。
如果是这种情况,那么我们需要执行以下操作。
- 使用.DMP文件,创建一个包含以下结构(表)的SQL文件:
imp <xe_username> / <密码> @XE file = <filename.dmp> indexfile = index.sql full = y
- 在文本编辑器中打开索引文件(index.sql),该文本编辑器可以在整个文件中进行查找和替换,并在ORDER中发出以下查找和替换语句(忽略单引号。。):
查找:'REM <space >'替换:<nothing>``查找:'" <source_tablespace>"'替换:'" USERS"'``查找:'...'替换:'REM ...'``查找:'CONNECT'替换:'REM CONNECT'
- 保存索引文件,然后对Oracle Express Edition帐户运行它(我发现最好创建一个新的空白XE用户帐户-如果刷新,则删除并重新创建):
sqlplus <xe_username> / <password> @XE @ index.sql
- 最后,使用相同的帐户运行与创建索引文件相同的.DMP文件,以导入数据,存储过程,视图等:
imp <xe_username> / <password> @XE file = <filename.dmp> fromuser = <原始用户名> touser = <xe_username> ignore = y
当我们尝试创建某些对象(例如数据库作业)时,我们可能会看到Oracle错误页面,因为Oracle会尝试使用相同的数据库标识符,因为我们使用的是不同的数据库,这很可能会失败。
回答
答案很困难,但可行:
情况是:用户A和表空间X
- 将转储文件导入到其他数据库中(仅在需要保留原始数据库副本的情况下才需要这样做)
- 重命名表空间alter tablespace X重命名为Y
- 为expdp命令创建目录,并授予权限
- 用expdp创建转储
- 删除旧用户和旧表空间(Y)
- 创建新表空间(是)
- 创建新用户(使用新名称)(在这种情况下为B)并授予权限(也授予使用步骤3创建的目录)
- 使用impdp impdp B / B目录= DIR dumpfile = DUMPFILE.dmp日志文件= LOGFILE.log REMAP_SCHEMA = A:B导入转储
就这样...
回答
对我来说,这项工作还可以(Oracle数据库10g快捷版10.0.2.1.0版):
impdp B/B full=Y dumpfile=DUMP.dmp REMAP_TABLESPACE=OLD_TABLESPACE:USERS
但是对于新的还原,我们需要新的表空间
P.S.可能有用的http://www.oracle-base.com/articles/10g/OracleDataPump10g.php