我有这种情况:
- 一个巨大(数千张表)、复杂的 Oracle 8 生产数据库,
- 一个巨大的(上千张表),复杂的,Oracle 9 开发数据库,(与生产相同的结构)
- 在开发数据库中,修改了一些存储过程和包,并添加了新的。
- 开发数据库在某些模式中有新表
- Oracle 8
exp
和 Oracle 9imp
都没有 ROWS ONLY 选项
我们通常这样做,因为这是正确更新数据的唯一方法,因为导入ignore=yes
只会插入新数据,但不会更新具有相同 PK 但非 PK 列中的值不同的预先存在的行:
- 删除一个架构,然后再次创建用户以拥有一个空架构
- 从用户到用户导入到空模式
问题是:
- 如何使用来自生产导出的新数据更新开发数据库,而无需先删除模式,因为开发数据库中有新的存储过程/包以及修改过的存储过程/包?
- 在删除模式后重新创建仅修改过的或新的存储过程以从备份中取回它们的比较过程太容易出错。
- 有数千个(字面意思)表,所以我们不想编写一个存储过程来按特定顺序刷新数据等。这需要几个月的时间来编写和测试。
什么是基于导入的解决方案?
编辑:我没有提到 prod 是 Solaris 而 dev 是 RedHat。
我看到两个解决方案。我没有测试它们,但我希望它们有用。
与表模式导出相比,用户模式和表空间模式导出都处理表之间的依赖关系,以便以正确的顺序导入表。这两种方法都将生产表结构导入到 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
最终解决我的问题是: