我想将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的混合体。但我不认为它与版本有关。
答案 0 :(得分:32)
你在这里遇到了几个问题。
首先,您使用的不同版本的Oracle是表统计信息错误的原因 - 当我们的某些Oracle 10g数据库升级到第2版时,我遇到了同样的问题仍然在第1版,我在他们之间交换.DMP文件。
对我有用的解决方案是使用相同版本的exp
和imp
工具在不同的数据库实例上进行导出和导入。通过使用相同的PC(或Oracle Server)发出所有导出和导入命令,这是最容易做到的。
其次,我怀疑你收到了ORA-00959: tablespace 'A_TBLSPACE' does not exist
,因为你试图将一个完整的Oracle数据库中的.DMP文件导入到10g Express Edition(XE)中数据库,默认情况下,为您创建一个名为USERS
的预定义表空间。
如果是这种情况,那么您需要执行以下操作..
使用.DMP文件,创建一个包含结构(表)的SQL文件:
imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y
在文本编辑器中打开索引文件(index.sql),该编辑器可以查找并替换整个文件,并在IN ORDER中发出以下查找和替换语句(忽略单引号..'):< / p>
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文件,以导入数据,存储过程,视图等:
imp <xe_username>/<password>@XE file=<filename.dmp> fromuser=<original_username> touser=<xe_username> ignore=y
在尝试创建某些对象(例如数据库作业)时,您可能会收到Oracle错误页面,因为Oracle会尝试使用相同的数据库标识符,当您使用不同的数据库时,这很可能会失败。
答案 1 :(得分:16)
如果您使用的是Oracle 10g和datapump,则可以使用REMAP_TABLESPACE子句。例如:
REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
答案 2 :(得分:6)
对我来说这项工作没问题(Oracle数据库10g快捷版10.2.0.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
答案 3 :(得分:3)
您使用的是哪个版本的Oracle?如果它是10g或更高,你应该看看使用Data Pump而不是导入/导出。我不是100%确定它是否可以处理这种情况,但我希望它可以。
Data Pump是10g及以上的exp / imp的替代品。它与exp / imp非常相似,除了它(据说,我不使用它,因为我被困在9i的土地上)更好。
答案 4 :(得分:1)
问题与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])
使用它将数据重新导入新的表空间:
首先为临时转储创建一个目录:
创建或替换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
注意:转储文件是从服务器磁盘存储和读取的,而不是从本地(客户端)磁盘
中读取答案 5 :(得分:1)
答案很难,但可行:
情况是:用户 A 和表空间 X
重命名表空间
将表格空间 X 重命名为 Y
为expdp命令和授予权限
使用impdp导入转储
impdp B / B目录= DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA = A : B
就是这样......
答案 6 :(得分:1)
我的解决方案是使用GSAR实用程序替换DUMP文件中的表空间名称。执行replce时,请确保通过添加空格来更改转储文件的大小。 E.g。
gsar -f -s"TSDAT_OV101" -r"USERS " rm_schema.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS """ ENABLE STORAGE IN ROW CHUNK 8192 RETENTION" -r" " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS """ LOGGING" -r" " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS """ " -r" " rm_schema.n.dump rm_schema.n1.dump
答案 7 :(得分:1)
我想在不同服务器(数据库)的不同表空间中为两个用户进行改进
<强> 1。 首先为两个服务器(数据库)创建临时转储目录:
服务器#1:
CREATE OR REPLACE DIRECTORY tempdump AS '/temp/old_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO old_user;
服务器#2:
CREATE OR REPLACE DIRECTORY tempdump AS '/temp/new_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO new_user;
<强> 2。 导出(服务器#1):
expdp tables=old_user.table directory=tempdump dumpfile=adump.dmp logfile=adump.log
第3。 导入(服务器#2):
impdp directory=tempdump dumpfile=adump_table.dmp logfile=bdump_table.log
REMAP_TABLESPACE=old_tablespace:new_tablespace REMAP_SCHEMA=old_user:new_user
答案 8 :(得分:0)
因为我想imp
(对于Oracle 12.1 | 2)进行一个exp
从本地开发数据库(18c xe)排序的转储,所以我知道我的所有目标数据库都将具有一个名为DATABASE_TABLESPACE
的可访问表空间,我刚刚创建了架构/用户以使用具有该名称的新表空间,而不是使用默认的USERS
(对目标数据库没有访问权限):
-- don't care about the details
CREATE TABLESPACE DATABASE_TABLESPACE
DATAFILE 'DATABASE_TABLESPACE.dat'
SIZE 10M
REUSE
AUTOEXTEND ON NEXT 10M MAXSIZE 200M;
ALTER DATABASE DEFAULT TABLESPACE DATABASE_TABLESPACE;
CREATE USER username
IDENTIFIED BY userpassword
CONTAINER=all;
GRANT create session TO username;
GRANT create table TO username;
GRANT create view TO username;
GRANT create any trigger TO username;
GRANT create any procedure TO username;
GRANT create sequence TO username;
GRANT create synonym TO username;
GRANT create synonym TO username;
GRANT UNLIMITED TABLESPACE TO username;
以此为基础创建的exp
使imp
对我的目标感到满意。
答案 9 :(得分:-2)
---创建新的表空间:
创建TABLESPACE TABLESPACENAME DATAFILE 'D:\ ORACL \ ORADATA \ XE \ TABLESPACEFILENAME.DBF'尺寸350M AUTOEXTEND ON NEXT 2500M MAXSIZE UNLIMITED 测井 常驻 EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K 分段空间管理手册 FLASHBACK ON;
---然后使用以下命令导入
创建由VALUES'bvuser'DEFAULT TABLESPACE TABLESPACENAME
识别的用户BVUSER- 其中D:\ ORACL是oracle安装的路径