我想将 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
之后,我尝试了相同的导入命令,但使用了选项 stats=none。这导致了以下错误:
ORA-00959: tablespace 'A_TBLSPACE' does not exist
这应该如何完成?
注意:很多列都是 CLOB 类型。看来问题与此有关。
注2:oracle版本是9.2、10.1和10.1 XE的混合体。但我认为这与版本无关。
最佳答案
这里有几个问题。
首先,您使用的不同版本的 Oracle 是导致表统计错误的原因 - 当我们的一些 Oracle 10g 数据库升级到版本 2 和一些数据库时,我遇到了同样的问题仍处于版本 1,我正在它们之间交换 .DMP 文件。
对我有用的解决方案是使用相同版本的 exp
和imp
用于在不同数据库实例上进行导出和导入的工具。最简单的方法是使用同一台 PC(或 Oracle 服务器)发出所有导出和导入命令。
其次,我怀疑您得到的是 ORA-00959: tablespace 'A_TBLSPACE' does not exist
因为您正在尝试将 .DMP 文件从成熟的 Oracle 数据库导入到 10g Express Edition (XE) 数据库,默认情况下,该数据库会创建一个名为 USERS
的预定义表空间。为你。
如果是这种情况,那么您需要执行以下操作..
使用 .DMP 文件创建一个包含结构(表)的 SQL 文件:
imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y
在可以对整个文件进行查找和替换的文本编辑器中打开索引文件 (index.sql),然后按顺序发出以下查找和替换语句(忽略单引号..'):
Find: 'REM<space>' Replace: <nothing>
Find: '"<source_tablespace>"' Replace: '"USERS"'
Find: '...' Replace: 'REM ...'
Find: 'CONNECT' Replace: 'REM CONNECT'
保存索引文件,然后针对您的 Oracle Express Edition 帐户运行它(我发现最好创建一个新的空白 XE 用户帐户 - 或者如果要刷新,则删除并重新创建):
sqlplus <xe_username>/<password>@XE @index.sql
最后,针对同一帐户运行您创建索引文件时使用的同一个 .DMP 文件,以导入数据、存储过程、 View 等:
imp <xe_username>/<password>@XE file=<filename.dmp> fromuser=<original_username> touser=<xe_username> ignore=y
尝试创建某些对象(例如数据库作业)时,您可能会收到 Oracle 错误页面,因为 Oracle 将尝试使用相同的数据库标识符,这很可能会失败,因为您位于不同的数据库上。
关于oracle - 如何在不同的表空间中导入 oracle 转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61963/