AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 49829
Accepted
Tulains Córdova
Tulains Córdova
Asked: 2013-09-14 04:45:33 +0800 CST2013-09-14 04:45:33 +0800 CST 2013-09-14 04:45:33 +0800 CST

导入 Oracle 模式数据而不丢失对存储过程的修改

  • 772

我有这种情况:

  1. 一个巨大(数千张表)、复杂的 Oracle 8 生产数据库,
  2. 一个巨大的(上千张表),复杂的,Oracle 9 开发数据库,​​(与生产相同的结构)
  3. 在开发数据库中,修改了一些存储过程和包,并添加了新的。
  4. 开发数据库在某些模式中有新表
  5. Oracle 8exp和 Oracle 9imp都没有 ROWS ONLY 选项

我们通常这样做,因为这是正确更新数据的唯一方法,因为导入ignore=yes只会插入新数据,但不会更新具有相同 PK 但非 PK 列中的值不同的预先存在的行:

  1. 删除一个架构,然后再次创建用户以拥有一个空架构
  2. 从用户到用户导入到空模式

问题是:

  1. 如何使用来自生产导出的新数据更新开发数据库,​​而无需先删除模式,因为开发数据库中有新的存储过程/包以及修改过的存储过程/包?
  2. 在删除模式后重新创建仅修改过的或新的存储过程以从备份中取回它们的比较过程太容易出错。
  3. 有数千个(字面意思)表,所以我们不想编写一个存储过程来按特定顺序刷新数据等。这需要几个月的时间来编写和测试。

什么是基于导入的解决方案?

编辑:我没有提到 prod 是 Solaris 而 dev 是 RedHat。

schema oracle-9i
  • 2 2 个回答
  • 4738 Views

2 个回答

  • Voted
  1. miracle173
    2013-09-14T09:42:17+08:002013-09-14T09:42:17+08:00

    我看到两个解决方案。我没有测试它们,但我希望它们有用。

    与表模式导出相比,用户模式和表空间模式导出都处理表之间的依赖关系,以便以正确的顺序导入表。这两种方法都将生产表结构导入到 dev。ORacle 8i 或 9i 中的表空间模式导出/导入只能在同一操作系统上的多个数据库系统中进行。On 可以通过使用用户模式导入将数据导入到与目标系统相同的操作系统上的中间模式或数据库来处理此限制。

    方法 1:使用TablespaceMode 导出/导入:
    1) 将 prod 的表空间设置为只读模式
    2) TablespaceMode - 从 prod 导出表空间和数据文件副本
    3) 将 prod 的表空间设置为读/写模式再次
    4) 删除 dev 中的表空间(离开过程、来自 dev 的视图)
    5) TablespaceMode - 导入 Target 中的表空间(包括表、触发器、索引、prod 的约束)
    6) 将 dev 的表空间放入 read/写模式

    也许您必须复制一些问题,包括表结构的更改、缺少授权或必须调整序列

    方法 2:用导出替换程序
    1) 产品模式的
    UserMod-Export 2) 开发模式的 UserMod-Export
    CONSTRAINTS=N
    GRANTS=N
    STATITICS=N
    TRIGGERS=N
    ROWS=N
    3) 删除开发模式
    4) 导入产品模式(到开发)
    5) 导入开发模式(开发)
    IGNORE=Y
    CONSTRAINTS=N*
    GRANTS=N*
    INDEXES=N
    ROWS=N*

    第二个导入应该用 dev 对象替换 prod 对象(过程、视图),但保留表和表相关对象。带 * 的参数已在导出期间设置。也许在导入期间不能设置它们。如果你设置IGNORE=N了,那么你会收到很多错误信息,但也许还有其他一些优点。如果您从 dev 导入不在 prod 中的表,就会发生这种情况。必须逐年处理对表结构的更改。

    我更喜欢一种在被 prod 模式替换之前从 dev 模式中提取过程的方法。诸如来自 Quest 的 Toad 之类的工具(正如 @rm 在评论中提到的那样)可以比较模式并创建脚本以实现差异可能会有所帮助。

    1) 从 prod 中导出 UserMode
    2) 从 dev 中提取程序到 sql-scripts
    3) 删除 dev 模式
    4) UserMode-Import 到 dev
    5) 在 dev 中删除程序
    6) 运行由提取过程创建的脚本
    7) 编译所有程序

    以下方法离开开发结构,仅从生产中导入数据。如果表的列已在 dev 中重命名或删除,则在导入数据期间将出现错误。在 dev 表中添加带有约束的列或在 dev 中更改约束也可能导致此表的数据导入失败。如果由于此错误而未导入某些表,则在 dev 中未更改的相关表在导入数据时也会出现问题。所以会出现很多复杂的问题。基本思想是:

    *) 从开发表中删除数据
    *) 禁用开发表上的约束、触发器和索引 *)
    仅将数据从 prod 表导入到开发表
    *) 启用开发表上的约束、触发器和索引
    *)将数据导入新的开发表并启用它们的约束、触发器和索引

    1) 用户模式导出没有触发器的开发模式
    ROWS=NO
    TRIGGERS=NO
    FILE=dev1.dmp
    2) 用户模式再次导出开发模式
    ROWS=NO
    TRIGGERS=NO
    FILE=dev1.dmp
    3) 表模式导出在产品上找不到的开发表
    TABLES=list_of_tables_in_right_order
    TRIGGERS=Y
    CONSTRAINTS=Y
    INDEXES=YES
    GRANTS=Y
    ROWS=Y
    STATISTICS=NO
    dev3.dmp
    4) 删除开发上的模式
    5) 再次在开发上创建空模式
    6) 导入没有触发器、约束和索引的空开发模式
    ROWS=NO
    CONSTRAINTS=N
    INDEXES=NO
    FILE=dev1.dmp
    7) 在脚本中导入索引
    INDEXES=YES
    ÌNDEXFILE=index.sql
    FILE=dev1.dmp
    8) 用户模式导出产品模式TRIGGERS=NO INDEXES=NO FILE=prod1.dmp TABLES=* 10) 使用 index.sql 创建索引sqlplus 11) 导入表约束和触发器 12) 导入你需要的开发表
    CONSTRAINTS=NO
    GRANTS=NO
    9) table import the prod table data

    IGNORE=Y
    CONSTRAINTS=N
    INDEXES=N
    GRANTS=N
    FILE=prod1.dmp


    TABLES=*
    CONSTRAINT=Y
    TRIGGERS=Y
    ROWS=N
    FILE=dev2.dmp

    TABLES=list_of_tables_in_right_order
    IGNORE=Y
    CONSTRAINT=Y
    GRANTS=Y
    INDEXES=Y

    • 2
  2. Best Answer
    Tulains Córdova
    2014-08-06T09:03:59+08:002014-08-06T09:03:59+08:00

    最终解决我的问题是:

    • 关闭存档模式
    • 禁止连接
    • 禁用触发器和约束
    • 截断所有表格
    • 执行导入(尝试创建现有对象失败但插入数据)
    • 重新启用触发器和约束
    • 重新打开存档模式
    • 允许连接回来
    • 1

相关问题

  • 将二进制图像数据直接存储在表中有哪些可能的注意事项和缺点?

  • PostgreSQL:分离表与单个表以保留磁盘空间?

  • PostgreSQL:表的创建日期

  • 有没有制作数据库设计和原型的好工具?[关闭]

  • 我的 Web 应用程序建模架构有多错误?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve