代码之家  ›  专栏  ›  技术社区  ›  CrashCodes

Oracle-将数据导入具有不同名称的表中?

  •  4
  • CrashCodes  · 技术社区  · 16 年前

    我有一个从Oracle表导出的大型(多GB)数据文件。我要将此数据导入另一个Oracle实例, 但是我想让桌子的名字不同 从原始表。这有可能吗?怎么用?

    导入和导出系统都是Oracle11g。如果这有任何区别,则该表包含一个blob列。

    谢谢!

    更新 :

    这里的想法是更新一个表,同时将使用该表的系统的停机时间降到最低。解决方案(基于 Vincent Malgrat 的答案和 APC “更新”是:

    1. 假设我们的表名是 A
    2. 创建临时架构 TEMP_SCHEMA
    3. 将数据导入 TEMP_SCHEMA.A
    4. CREATE REAL_SCHEMA.B AS SELECT * FROM TEMP_SCHEMA.A
    5. DROP TABLE REAL_SCHEMA.A 重命名 REAL_SCHEMA.A 到 REAL_SCHEMA.A_OLD
    6. 重命名 REAL_SCHEMA.B 到 RealyStudio.A
    7. DROP REAL_SCHEMA.A_OLD

    这样,停机时间仅在步骤4和5期间,两者都应该独立于数据大小。如果这不起作用,我会在这里发布一个更新:—)

    5 回复  |  直到 12 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    我想您希望在已经使用了该名称的模式中导入该表。我认为您不能在导入期间更改表名。但是,您可以使用 FROMUSER 和 TOUSER 选择权。这将允许您在另一个(临时)模式中导入表。

    完成后,使用 CREATE TABLE AS SELECT . 与导入相比,复制表所需的时间可以忽略不计,因此不会浪费太多时间。但在操作过程中,您需要两倍的磁盘空间。

    更新

    正如建议的那样 Gary 一个更聪明的方法是在引用目标模式中新表的临时模式中创建一个视图或同义词。导入后不需要复制数据,因为数据将直接传递到目标表。

        2
  •  5
  •   APC    16 年前

    如果使用的是旧的exp和imp实用程序,则无法执行此操作。唯一的选择是导入到同名的表中(尽管您可以更改拥有该表的架构)。

    但是,你说你现在是11g。为什么不使用10g中引入的datapump实用程序,它取代了导入和导出。因为在11g中,该实用程序提供了remap_表选项,可以完全满足您的需要。

    编辑

    在我写这篇文章的时候,在阅读了这篇评论之后,我认为remap_表选项在他们的案例中不起作用。它只重命名新对象。如果目标架构中存在具有原始名称的表,则导入将失败,原因是ORA-39151。对不起的。

    编辑双

    根据OP最终选择的解决方案(删除现有表,替换为新表),有一个带有数据泵的解决方案,即使用 TABLE_EXISTS_ACTION={TRUNCATE | REPLACE} 条款。选择 REPLACE 放下桌子, TRUNCATE 只是,呃,截断它。无论哪种情况,我们都必须担心引用完整性约束,但这也是所选解决方案的一个问题。

    我发布这个附录不是为了操作,而是为了将来某个时候找到这个页面的其他搜索者的利益。

        3
  •  2
  •   Sakthi    12 年前

    使用选项remap_table=existing_table_name:new_table_name in impdp。这在11GR2中有效。

        4
  •  1
  •   Gandalf    16 年前

    只需将其导入同名的表中,然后重命名该表。

        5
  •  1
  •   David Aldridge    16 年前

    创建视图为 select * from ... 要导入的表,视图与导出中表的名称匹配。忽略导入时的错误。