如何在不同的表空间中导入oracle转储

如何在不同的表空间中导入oracle转储,oracle,oracle-dump,Oracle,Oracle Dump,我想将oracle转储导入另一个表空间 我有一个由用户a使用的表空间a。我已经撤销了这个用户的DBA,并给了他连接和资源的授权。然后我把所有的东西都交给了司令部 exp a/***owner=a file=oracledump.DMP log=log.log compress=y 现在,我想将转储导入到用户B使用的表空间B中。因此,我给了他connect和resource(无DBA)的授权。然后我执行了以下导入: imp b/***file=oracledump.DMP log=import.l

我想将oracle转储导入另一个表空间

我有一个由用户a使用的表空间a。我已经撤销了这个用户的DBA,并给了他连接和资源的授权。然后我把所有的东西都交给了司令部

exp a/***owner=a file=oracledump.DMP log=log.log compress=y

现在,我想将转储导入到用户B使用的表空间B中。因此,我给了他connect和resource(无DBA)的授权。然后我执行了以下导入:

imp b/***file=oracledump.DMP log=import.log fromuser=a touser=b

结果是一个包含大量错误的日志:

IMP-00017:以下语句失败,出现ORACLE错误20001:“BEGIN DBMS\u STATS.SET\u TABLE\u STATS IMP-00003:遇到ORACLE错误20001 ORA-20001:输入值无效或不一致

之后,我尝试了相同的导入命令,但选择了statistics=none。这导致了以下错误:

ORA-00959:表空间“A_TBLSPACE”不存在

如何做到这一点

注意:很多列都是CLOB类型的。看起来问题与此有关


注2:oracle版本是9.2、10.1和10.1 XE的混合。但我认为这与版本无关。

问题与CLOB列有关。imp工具似乎无法重写create语句以使用另一个表空间

资料来源:

解决办法是: 在正确的表空间中手动创建架构。如果没有创建架构的脚本,可以使用imp工具的indexfile=来创建它

您必须自行禁用所有约束,oracle imp工具不会禁用它们

之后,可以使用以下命令导入数据:

imp b/***file=oracledump.dmp log=import.log fromuser=a touser=b statistics=none ignore=y

注意:由于其他错误,我仍然需要statistics=none

有关数据泵的额外信息

从Oracle 10开始,导入/导出得到了改进:数据泵工具([)

使用此选项将数据重新导入新表空间:

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

    将目录tempdump创建或替换为“/temp/tempdump/”;
    将目录tempdump上的读、写权限授予一个

  • 出口:

    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?如果是10g或更高版本,您应该考虑使用数据泵,而不是导入/导出。我不确定它是否能够处理这种情况,但我希望它能够处理

    是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”不存在
    ,因为您试图将.DMP文件从一个成熟的Oracle数据库导入10g Express Edition(XE)数据库,该数据库默认情况下为您创建一个名为
    USERS
    的预定义表空间

    如果是这样,那么您需要执行以下操作

  • 使用.DMP文件,创建包含以下结构(表)的SQL文件:

    imp/@XE file=indexfile=index.sql full=y

  • 在可以对整个文件执行查找和替换的文本编辑器中打开indexfile(index.sql),然后依次发出以下find和replace语句(忽略单引号…):

    Find:'REM'替换:

    Find:“”“”Replace:““USERS””

    Find:“…”替换为:“REM…”

    查找:“连接”替换为:“REM连接”

  • 保存indexfile,然后对您的Oracle Express Edition帐户运行它(我发现最好创建一个新的空白XE用户帐户,或者在刷新时删除并重新创建):

    sqlplus/@XE@index.sql

  • 最后,针对同一帐户运行创建indexfile时使用的相同.DMP文件,以导入数据、存储过程、视图等:

    imp/@XE file=fromuser=touser=ignore=y


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

    答案很难,但可行:

    情况是:用户A和表空间X

  • 将转储文件导入其他数据库(仅当需要保留原始数据库的副本时才需要)
  • 重命名表空间

    将表空间X重命名为Y

  • 为expdp命令创建一个目录以授予权限

  • 使用expdp创建转储
  • 删除旧用户和旧表空间(Y
  • 创建th
    impdp B/B full=Y dumpfile=DUMP.dmp REMAP_TABLESPACE=OLD_TABLESPACE:USERS
    
    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
    
    CREATE OR REPLACE DIRECTORY tempdump AS '/temp/old_datapump/';
    GRANT READ, WRITE ON DIRECTORY tempdump TO old_user;
    
    CREATE OR REPLACE DIRECTORY tempdump AS '/temp/new_datapump/';
    GRANT READ, WRITE ON DIRECTORY tempdump TO new_user;
    
    expdp tables=old_user.table directory=tempdump dumpfile=adump.dmp logfile=adump.log
    
    impdp directory=tempdump dumpfile=adump_table.dmp logfile=bdump_table.log
    REMAP_TABLESPACE=old_tablespace:new_tablespace REMAP_SCHEMA=old_user:new_user
    
    -- 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;