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




oracle中文 (8)

我想将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的混合。 但我不认为它与版本有关。


Answer #1

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

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE

Answer #2

---创建新的表空间:

CREATE TABLESPACE TABLESPACENAME DATAFILE'D:\ ORACL \ ORADATA \ XE \ TABLESPACEFILENAME.DBF'尺寸350M AUTOEXTEND ON NEXT 2500M MAXSIZE无限制记录永久扩展管理本地自动安装块大小8K段空间管理手册闪回;

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

由VALUES'bvuser'DEFAULT TABLESPACE TABLESPACENAME识别创建用户BVUSER

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


Answer #3

我的解决方案是使用GSAR实用程序替换DUMP文件中的表空间名称。 执行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

Answer #4

您使用的是哪个版本的Oracle? 如果它是10g或更高,你应该看看使用Data Pump而不是导入/导出。 我不是100%肯定它是否可以处理这种情况,但我希望它可以。

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

这是Data Pump文档



Answer #6

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

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

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

其次 ,我怀疑你得到了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. 在文本编辑器中打开indexfile(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将尝试使用相同的数据库标识符,这很可能会因为您位于不同的数据库而失败。


Answer #7

答案很难,但可行:

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

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

    alter tablespace X重命名为Y.

  3. 为expdp命令和grant权限创建一个目录

  4. 使用expdp创建转储
  5. 删除旧用户和旧表空间( Y
  6. 创建新的表空间( Y
  7. 创建新用户(使用新名称) - 在本例中为B - 并授予权限(也包括使用步骤3创建的目录)
  8. 用impdp导入转储

    impdp B / B目录= DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA = AB

就是这样......


Answer #8

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

资料来源: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:66890284723848http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:66890284723848 :11:0 http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:66890284723848http://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 http://www.oracle-base.com/articles/10g/OracleDataPump10g.php][1]

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

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

    创建或替换DIRECTORY tempdump AS'/ temp / tempdump /';
    授予阅读权,写入目录tempdump to a;

  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

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





oracle