什么是在Oracle数据库中执行选择性记录复制的最佳方法

时间:2012-04-10 13:23:07

标签: oracle replication

假设以下场景: 我有一个包含大量数据的主数据库,在这个数据库中我有一个密钥表,我将在本例中调用DataOwners,DataOwners表有4条记录,数据库中每个其他表的每条记录“属于“直接或间接属于DataOwners的记录,属于我的意思是用外键链接到它。 我还有其他2个从属数据库,它们与我的主数据库具有完全相同的结构,只能通过主数据库的复制进行更新,但SlaveDatabase1应该只有DataOwner 2的记录,SlaveDatabase2应该只有DataOwners 1和3的记录,而MasterDatabase有DataOwners 1,2,3和4的记录。

是否有任何Oracle工具允许我进行这种选择性记录复制? 如果没有,有没有办法改进我的复制方法?这是:

  • 向每个表添加一个触发器,用于在一组复制表中插入记录更改
  • 在选定的从属服务器上执行复制表的命令

2 个答案:

答案 0 :(得分:2)

最简单的选择是在各种从属数据库中定义物化视图,这些数据库只复制您想要的数据。因此,例如,如果master数据库中有一个表A,那么在slave数据库1中,你将创建一个物化视图

CREATE MATERIALIZED VIEW a
  <<refresh criteria>>
AS
SELECT a.*
  FROM a@to_master a,
       dataOwners@to_master dm
 WHERE a.dataOwnerID = dm.dataOwnerID
   AND dm.some_column = <<some criteria that selects DataOwner2>>

而slave数据库2具有非常相似的物化视图

CREATE MATERIALIZED VIEW a
  <<refresh criteria>>
AS
SELECT a.*
  FROM a@to_master a,
       dataOwners@to_master dm
 WHERE a.dataOwnerID = dm.dataOwnerID
   AND dm.some_column = <<some criteria that selects DataOwner1 & 3>>

当然,如果dataOwnerID可以进行硬编码,则可以简化操作并避免进行连接。但我猜测,DataOwners表中有一些列标识了应该将特定所有者复制到哪个从属。

假设您只想复制增量更改,则需要在master数据库的基表上创建一些物化视图日志。您可能希望在从属数据库上配置refresh groups,以便所有物化视图可以同时刷新,并且在事务上彼此一致。

答案 1 :(得分:1)

Oracle Golden Gate软件可以完成所有这些任务。插入/更新/删除与主数据库的顺序相同,因此可以避免外键和其他约束问题。

MasterDatabase Extract生成一个跟踪文件,然后将数据拆分为DB 1,2,3和4。

它还可以进行多种方式的复制,即DB 1将数据发送回主DB。

除金门外,触发器可能是您的另一种选择。但它需要一些编程。