it-swarm.cn

如何在其他表空间中导入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:以下语句失败,并出现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的混合版本。但是我认为这与版本无关。

36
Michiel Overeem

您在这里遇到了几个问题。

首先,您使用的Oracle不同版本是表统计信息错误的原因-当我们的某些Oracle 10g数据库升级到第2版时,我遇到了同样的问题第1版,我在它们之间交换.DMP文件。

对我有用的解决方案是使用相同版本的expimp工具在不同的数据库实例上进行导出和导入。使用同一台PC(或Oracle Server)发出所有导出和导入命令最容易做到。

第二,我怀疑您收到ORA-00959: tablespace 'A_TBLSPACE' does not exist,因为您正试图将一个完整的Oracle数据库中的.DMP文件导入10g Express Edition(XE)数据库,该数据库默认情况下会为您创建一个名为USERS的预定义表空间。

如果是这种情况,那么您需要执行以下操作。

  1. 使用.DMP文件,创建一个包含结构(表)的SQL文件:

    imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y

  2. 在可以在整个文件中进行查找和替换的文本编辑器中打开索引文件(index.sql),并发出以下查找和替换语句IN ORDER(忽略单引号..'):

    Find: 'REM<space>' Replace: <nothing>

    Find: '"<source_tablespace>"' Replace: '"USERS"'

    Find: '...' Replace: 'REM ...'

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. 保存索引文件,然后对您的Oracle Express Edition帐户运行索引文件(我发现最好创建一个新的空白XE用户帐户-如果刷新,则删除并重新创建):

    sqlplus <xe_username>/<password>@XE @index.sql

  4. 最后,针对相同的帐户运行与创建索引文件相同的.DMP文件,以导入数据,存储过程,视图等:

    imp <xe_username>/<password>@XE file=<filename.dmp> fromuser=<original_username> touser=<xe_username> ignore=y

当您尝试创建某些对象(例如数据库作业)时,您可能会看到Oracle错误页面,因为Oracle会尝试使用相同的数据库标识符,因为您使用的是不同的数据库,这很可能会失败。

33
Andrew

如果您使用的是Oracle 10g和datapump,则可以使用REMAP_TABLESPACE子句。例:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
16
Neil Kodner

对我来说,这项工作还可以(Oracle数据库10g快捷版10.0.2.1.0版):

impdp B/B full=Y dumpfile=DUMP.dmp REMAP_TABLESPACE=OLD_TABLESPACE:USERS

但是对于新的还原,您需要新的表空间

附言也许有用 http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6
Grebets Kostyantyn

您正在使用哪个版本的Oracle?如果大于等于10克,则应考虑使用数据泵,而不要使用导入/导出。我不确定100%是否可以处理这种情况,但我希望可以。

数据泵 是10g及以上的exp/imp的替代品。它的工作方式与exp/imp非常相似,但其效果更好(据说,由于我卡在9i土地上,所以我不使用它)。

这里是数据泵文档

3
Matthew Watson

我想为两个用户同时在不同服务器(数据库)上的不同表空间中进行改进

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

。导入(服务器#2):

impdp directory=tempdump dumpfile=adump_table.dmp logfile=bdump_table.log
REMAP_TABLESPACE=old_tablespace:new_tablespace REMAP_SCHEMA=old_user:new_user
2
peter

我的解决方案是使用GSAR实用程序替换DUMP文件中的表空间名称。重复执行时,请通过添加空格确保转储文件的大小不变。例如。

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
1
Dmitry

问题与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

注意:由于其他错误,我仍然不需要统计信息= none。

有关数据泵的其他信息

从Oracle 10开始,改进了导入/导出:数据泵工具([ http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php] [1]

使用它将数据重新导入到新表空间中:

  1. 首先为临时转储创建一个目录:

    创建OR替换目录tempdump AS'/ temp/tempdump /';
    GRANT读,写在目录tempdump到a;

  2. 出口:

    expdp a/*模式=目录=临时转储dumpfile = adump.dmp日志文件= adump.log

  3. 进口:

    impdp b/*目录= tempdump dumpfile = adump.dmp日志文件= bdump.log REMAP_SCHEMA = a:b

注意:转储文件是从服务器磁盘而不是从本地(客户端)磁盘存储和读取的

1
Michiel Overeem

答案很困难,但可行:

情况是:用户[[〜#〜] a [〜#〜]和表空间[〜#〜] x [〜#〜]

  1. 将转储文件导入另一个数据库(仅在需要保留原始数据库副本的情况下才需要这样做)
  2. 重命名表空间

    alter tablespace [〜#〜] x [〜#〜]重命名为[〜#〜] y [〜#〜]

  3. 为expdp命令创建目录,并授予权限

  4. 使用expdp创建转储
  5. 删除旧用户和旧表空间([〜#〜] y [〜#〜]
  6. 创建新表空间([〜#〜] y [〜#〜]
  7. 创建新用户(使用新名称)-在这种情况下[〜#〜] b [〜#〜]-并授予权限(也授予使用步骤3创建的目录)
  8. 用impdp导入转储

    impdp B/B目录= DIR转储文件= DUMPFILE.dmp日志文件= LOGFILE.log REMAP_SCHEMA = [〜#〜] a [〜#〜][〜#〜] b [〜 #〜]

就是这样...

1
Michiel Overeem

因为我想import(到Oracle 12.1 | 2)是从本地开发数据库(18c xe)_exported的转储,所以我知道我的所有目标数据库都将具有可访问的表空间称为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对我的目标感到满意。

0
masterxilo