代码之家  ›  专栏  ›  技术社区  ›  Michiel Overeem

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

  •  33
  • Michiel Overeem  · 技术社区  · 17 年前

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

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

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

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

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

    IMP-00003:遇到ORACLE错误20001

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

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

    如何做到这一点?

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

    10 回复  |  直到 5 年前
        1
  •  34
  •   jitbit    15 年前

    这里有几个问题。

    首先 ,您正在使用的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

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

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

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

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

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

      Find: 'CONNECT' Replace: 'REM CONNECT'

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

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

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

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

        2
  •  16
  •   Neil Kodner Neil Kodner    17 年前

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

    REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
    
        3
  •  6
  •   Grebets Kostyantyn    15 年前

    对我来说,这项工作还可以(Oracle Database 10g Express Edition 10.2.0.1.0版):

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

    但对于新的恢复,您需要新的表空间

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

        4
  •  3
  •   Matthew Watson    17 年前

    您使用的是什么版本的Oracle?如果是10g或更高,您应该考虑使用数据泵,而不是导入/导出。我不能100%确定它是否能够处理这种情况,但我希望它能够。

    Data Pump 是10g及以上的exp/imp的替代品。它的工作原理与exp/imp非常相似,只是它(据说,我不使用它,因为我被困在9i土地上)更好。

    Here is the Data Pump docs

        5
  •  2
  •   Michiel Overeem    17 年前

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

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

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

    2. expdp a/*schemas=a directory=tempdump dumpfile=adump.dmp logfile=adump.log

    3. impdp b/*directory=tempdump dumpfile=adump.dmp logfile=bdump.log REMAP_SCHEMA=a:b

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

        6
  •  2
  •   Dmitry    14 年前

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

    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
  •  2
  •   Stephan    13 年前

    1.

    服务器#1:

    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;
    

    2. 导出(服务器1):

    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
    
        8
  •  1
  •   Michiel Overeem    17 年前

    答案很难,但可行:

    情况是:用户 A. 十、

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

      表空间 改名为 Y

    3. 使用expdp创建转储
    4. 删除旧用户和旧表空间( Y )
    5. )
    6. 创建新用户(使用新名称)-在本例中 B
    7. 使用impdp导入转储

      impdp B/B directory=DIR dumpfile=dumpfile.dmp logfile=logfile.log REMAP_SCHEMA= A. :

        9
  •  0
  •   masterxilo    7 年前

    因为我想 imp ort(对于Oracle 12.1 | 2)是一个 exp orted来自本地开发数据库(18c xe),我知道我的所有目标数据库都将有一个名为 DATABASE_TABLESPACE ,我刚刚创建了schema/user,以使用该名称的新表空间,而不是默认的表空间 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;
    
    

    由此创建使 接口信息处理器 我的目标实现了。

        10
  •  -2
  •   Ahmad Shakil    12 年前

    ---创建新表空间:

    创建表空间TABLESPACENAME数据文件 'D:\ORACL\ORADATA\XE\TABLESPACEFILENAME.DBF'大小350M在下一个2500M上自动扩展MAXSIZE UNLIMITED 永久的 数据块管理本地自动分配 块大小8K 段空间管理手册

    ---然后使用下面的命令导入

    --其中D:\ORACL是oracle安装的路径