Oracle streams双库同步的冲突处理方法
2018-03-23顾鹏程
顾鹏程
摘 要Oracle Streams是Oracle官方提供的一种免费、灵活的数据库同步机制,只需通过配置官方的存储过程即可部署。由冲突事务导致的稳定性不足,是Streams部署中最难以处理的问题。Oracle建议的常规的冲突处理方法需要按表綁定存储过程,不利于处理新表冲突,其提供的自定义冲突处理存储过程功能较为简单,适用性低。本文针对Streams双向同步中常见的冲突,提出一种不需要绑定表且具有一般适用性的冲突处理部署方法,能够自动化处理错误事务,实验证明该方法具备一定的可靠性。
【关键词】Oracle Streams 冲突处理 错误事务
Oracle Streams 是 Oracle提供的流复制技术,可以实现数据容灾和数据共享。其基本思想来源于 Oracle 高级队列,是其应用的延伸,它还可以传递消息队列,具有免费、灵活的优势。其缺点是稳定性差。在生产实践中,主要发现有两种冲突影响Streams同步,分别为删除冲突和更新冲突,均由被修改行在目标数据库找不到对应记录导致。
对于删除冲突,一般Oracle建议采取对目标行标记的方法,但这会导致两个数据库不一致。对于更新冲突,Oracle提供了预置的自动存储过程来作简单的处理。该存储过程需要指定参数表名、方法名等,配置繁琐。此外,Oracle还提供自定义存储过程来配置删除或更新冲突。该方法需要指定表名以及对应的存储过程,需要对每张表进行设定,这不利于对新增表的维护。对于这些问题,本文提出一种结合Oracle定时任务和不需要绑定表的自定义存储过程的方法,让Oracle自动修正冲突,以确保两个数据库的一致性。
1 定制处理冲突的存储过程
处理冲突的存储过程本质上是根据发生streams同步错误的事务号,找到对应冲事务LCR,结合错误类型,调整LCR中的事务内容,使其正确执行。
1.1 处理删除冲突的存储过程
有两种方式处理这种冲突:
(1)可以选择不使用事务在物理上删除行,而是更新一个“删除”列,将行表标记为“已删除”,这样不会发生删除冲突,但可能引发更新冲突,需要另置存储过程处理。
(2)可以简单的舍弃掉删除失败的事务,并移除错误,使后续同步继续。本文以第二种方法为例实现存储过程。
首先通过DBMS_APPLY_ADM.GET_ERROR_MESSAGE存储过程获得错误事务的LCR,然后用GET_COMMAND_TYPE函数可以获得该操作的增、删、改类型。
舍弃该删除操作其实就意味着直接移除事务,执行DBMS_APPLY_ADM.DELETE_ERROR,最后让同步重新启动:DBMS_APPLY_ADM.START_APPLY。
1.2 处理更新冲突的存储过程
考虑在生产环境中,一个更新冲突往往意味着目标数据库缺失对应记录,因此,本文采用将更新事务的LCR修改为插入事务的方式。同时为了避免插入事务在双向同步中反同步到源数据库,将为Oracle会话增加一个标记,使同步忽略来自标记事务。
获取错误事务LCR以及事务类型的方式与上一节相同。下面假设错误事务已被判别为DML操作中的UPDATE类型。
首先调用DBMS_STREAMS_ADM.SET_TAG存储过程为该会话加一个标记,本文采取十六进制0作为标记。这样存储过程中的事务将不会被复制到另一个数据库。
由于更新语句可能只包含部分字段值,所有需要获得所有字段值,以插入完整记录。假设已获取LCR。用GET_VALUES('OLD') 获取未被更新的旧值。为了将UPDATE类型的LCR完整的转变为INSERT类型,需要用SET_VALUES将旧值设为NEW。然后将修改后的LCR用EXECUTE(TRUE)执行。
最后用和上一节相同的语句移除错误事务并开启同步即可。
为了使存储过程的调用变得简洁,将可上述两种存储过程合为一个。
2 处理流程
首先定义一个存储过程,定时查询DBA_APPLY_ERROR表,一旦发现错误事务,就调用冲突处理存储过程。定时触发采用DBMS_JOB.SUBMIT程实现,每3分钟查询一次。
实际应用中主存储过程的调用频率可根据需要调整。一般情况,冲突并非配置了双向Streams同步的数据库所应当出现的,因而可认为是低概率事件,配置几分钟一次的检查即可。
3 模拟测试
在实验中,模拟连续100个删除冲突,按本文方法部署的冲突处理能够在20分钟内全部处理完毕,并使同步复原。模拟连续1000个更新冲突,本文方法用大约4小时10分钟修复完毕。从量级上来说,显然比人工处理节约人力与时间。此外,一般若生产环境中的数据库使用得当,不会一次性有这么多冲突,本文方法对大量的同步冲突有一定的适应性。
4 结论
本文针对Oracle双向streams同步中的冲突问题,指出常规方法的局限性:需要绑定表以及人工处理。为了解决这两种不足,首先定义了一个具有广泛适用性的冲突事务处理存储过程,能够将错误事务的LCR修正并执行,以使同步继续。然后定义了一个查询冲突事务的存储过程,配合Oracle定时任务,实现冲突事务的自动化处理。经过冲突事务的模拟实验,该方法对平台没有依赖性。对于频率较低的冲突事务,具有较好的处理时效;对于大量冲突事务,亦具备一定的承载能力。在生产环境中,按本文部署冲突处理策略,能够在节省人力和时间同时加强streams双向同步的稳定性。
参考文献
[1]蔡小祥,李晓华.Oracle STREAMS数据同步复制技术应用[J].医学信息学杂志,2015,36(02):38-40+60.
[2]肖述.Oracle流复制技术在省级数据中心中的应用[J].无线互联科技,2016(04):136-137.
[3]成雅.基于Oracle Streams的数据库实时备份与恢复技术研究[D].南京航空航天大学,2012.
作者单位
南京国电南自电网自动化有限公司研发中心 江苏省南京市 211100