如何在其他表空间中导入Oracle转储

如何在其他表空间中导入Oracle转储

Howto import an oracle dump in an different tablespace

我想将一个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

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

ORA-00959: tablespace 'A_TBLSPACE' does not exist

应该怎么做?

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

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


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

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

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

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

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

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

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

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

    Find: 'REM' Replace:

    Find: '""' Replace: '"USERS"'

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

    Find: 'CONNECT' Replace: 'REM CONNECT'

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

    sqlplus /@XE @index.sql

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

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

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


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

    1
    REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE


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

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

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

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


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

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

    这是数据泵文档


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

    1。
    首先为两个服务器(数据库)的临时转储创建目录:

    服务器#1:

    1
    2
    CREATE OR REPLACE DIRECTORY tempdump AS '/temp/old_datapump/';
    GRANT READ, WRITE ON DIRECTORY tempdump TO old_user;

    服务器2:

    1
    2
    CREATE OR REPLACE DIRECTORY tempdump AS '/temp/new_datapump/';
    GRANT READ, WRITE ON DIRECTORY tempdump TO new_user;

    2。
    导出(服务器1):

    1
    expdp tables=old_user.table directory=tempdump dumpfile=adump.dmp logfile=adump.log

    3。
    导入(服务器2):

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

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

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

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

    CREATE OR REPLACE 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

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


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

    1
    2
    3
    4
    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

    答案很困难,但可行:

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

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

    将表空间X更改为Y

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

  • 使用expdp创建转储
  • 删除旧用户和旧表空间(Y)
  • 创建新表空间(是)
  • 创建新用户(使用新名称)(在这种情况下为B)并授予权限(也授予使用步骤3创建的目录)
  • 用impdp导入转储

    impdp B / B目录= DIR转储文件= DUMPFILE.dmp日志文件= LOGFILE.log REMAP_SCHEMA = A:B

  • 就是这样...


    因为我想imp ort(到Oracle 12.1 | 2)是从本地开发数据库(18c xe)排序的exp的转储,所以我知道我的所有目标数据库都将具有一个名为DATABASE_TABLESPACE的可访问表空间。 ,我只是创建了架构/用户以使用具有该名称的新表空间,而不使用默认的USERS(我无法访问目标数据库):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    -- 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对我的目标满意。


    ---创建新表空间:

    创建表空间表空间名称数据文件
    'D: ORACL ORADATA XE TABLESPACEFILENAME.DBF'大小350M自动扩展上一个下一个2500M最大大小不受限制
    记录
    常驻
    范围管理本地自动分配
    区块大小8K
    分部空间管理手册
    闪回

    ---然后使用以下命令导入

    通过值'bvuser'创建的用户BVUSER缺省表空间表空间名称

    -其中D: ORACL是Oracle安装路径


    推荐阅读

      远程命令连接linux?

      远程命令连接linux?,系统,密码,名称,图片,网络,软件,百度,地址,服务,电脑,Lin

      linux命令中添加用户?

      linux命令中添加用户?,系统,密码,软件,用户,命令,信息,目录,用户名,账号,文

      linux命令更改用户?

      linux命令更改用户?,系统,密码,管理,用户,命令,环境,工作,地址,电脑,文件,lin

      linux命令连接光驱?

      linux命令连接光驱?,系统,位置,设备,数据,电脑,服务,资料,盘中,智能,管理,Lin

      linux跳板机连接命令?

      linux跳板机连接命令?,地址,服务,密码,工具,中国,网络,位置,系统,电脑,在线,

      linux命令查看连接数?

      linux命令查看连接数?,数字,对比,网络,系统,数据,地址,状态,通讯,信息,命令,l

      linux命令行拨号连接?

      linux命令行拨号连接?,系统,网络,软件,手机,服务,密码,地址,名称,电话号码,

      linux命令给用户授权?

      linux命令给用户授权?,系统,数字,管理,权限,命令,密码,工具,时间,软件,信息,l

      linux命令创建用户组?

      linux命令创建用户组?,系统,代码,密码,用户组,用户,命令,信息,名称,新增,管

      linux命令连接光驱?

      linux命令连接光驱?,系统,位置,设备,数据,电脑,服务,资料,盘中,智能,管理,Lin

      linux命令逻辑连接符?

      linux命令逻辑连接符?,系统,网络,名字,环境,信息,名称,设备,发行,位置,较大,L

      linux跳板机连接命令?

      linux跳板机连接命令?,地址,服务,密码,工具,中国,网络,位置,系统,电脑,在线,

      查看linux用户命令行?

      查看linux用户命令行?,信息,系统,时间,名称,密码,用户,命令,地址,状态,设备,L

      linux所有用户命令行?

      linux所有用户命令行?,系统,信息,地址,工作,密码,命令,用户,时间,电脑,管理,L

      linux用户下的命令是?

      linux用户下的命令是?,系统,工作,管理,地址,命令,密码,基础,信息,目录,新增,L

      linux用户登录的命令?

      linux用户登录的命令?,系统,信息,工作,地址,时间,密码,名称,命令,电脑,软件,l

      linux连接外网命令?

      linux连接外网命令?,网络,系统,工具,情况,软件,信息,地址,代理,地方,数据,请

      linux关机用户命令?

      linux关机用户命令?,系统,工作,信息,状态,管理,命令,基础,目录,用户,功能,lin

      linux看用户信息命令?

      linux看用户信息命令?,系统,密码,信息,状态,软件,情况,命令,用户,网络,时间,l

      linux命令连接ip?

      linux命令连接ip?,地址,系统,网络,工作,信息,命令,密码,名称,设备,服务,linux