最近因为业务需求,需要在两个数据库之间做双向实时同步,遂实践了一把Oracle的流复制,遇到了很多疑难问题,最终也貌似成功,现记录如下。
我是使用OEM来实现流复制的。
10.进行流复制的两个数据库的实例名不一样,于是我把其中一个数据库实例重装了,哭~~~
20.两个数据库都需要打开归档模式。
30.进行流复制配置前两台数据库需要同步的数据最好一模一样。否则在同步过程中可能会操作一些本库中不存在的数据从而导致同步错误。
40.使用sys用户登录,在数据移动->设置中创建流管理员用户,两个库都要创建。
50.使用流管理员用户登录,进入数据移动->设置。选择同步的方式。我这里选的是按方案同步。选择特定方案后,需填写目标服务器相关参数。然后在下一步中点开高级选项,勾选双向复制,然后下一步,再下一步即可。
55.当提交后,OEM生成了一个调度去做同步的准备工作。在我的电脑上运行了将近五分钟。在运行过程中可能会报错,这时正确的做法是回到数据移动->设置,按照上面的提示进行回滚或继续操作。如果直接删除相关调度或别的资源,可能会导致无法再次配置流复制。我后来只好通过闪回数据库的方式才实现操作回滚。
60.创建成功后,进入数据移动->管理复制中,可看观察捕获,传播,应用三个图表来获取当前同步信息。其中捕获是通过分析当前日志来获取数据结构与数据内容的变化。传播是将变化同步到目标机器上。应用是将获取的变化应用到本库中。
我在配置流复制时遇到了好几个错误,其中大部分是提示找不到目标服务器或对象。后来我通过在/etc/host里直接指定ip与机器名的对应关系,又试了几次后,居然成功了。其次,在OEM提示配置成功的同时,仍然报了好几个别的错,后来我试了试在两边分别操作数据,发现都能同步成功,索性就不管了。
在实际使用中,还发现了以下问题
10.在实际使用中发现流复制无法同步序列值的变化,后来采取了间隔步长来规避这个问题。
oracle stream不会同步sequence值的变化如何解决
Oracle Streams Conflict Resolution
20. ORA-26786错误。在报错的服务器上执行下面的脚本来覆盖冲突。例如
DECLARE
cols DBMS_UTILITY.NAME_ARRAY;
BEGIN
cols(1) := 'DQHJMC';
DBMS_APPLY_ADM.SET_UPDATE_CONFLICT_HANDLER(
object_name => 'LandSystem.LS_CASE_BWA',
method_name => 'OVERWRITE',
resolution_column => 'DQHJMC',
column_list => cols);
END;
其中cols表示需要执行的列,object_name表示表名,method_name表示解决策略,resolution_column表示判断依据列。
解决冲突后,把method_name设为null再执行一次删除这个策略。
Managing Oracle Streams Conflict Detection and Resolution
DBMS_APPLY_ADM.SET_UPDATE_CONFLICT_HANDLER (P)
streams双向复制冲突规则(SET_UPDATE_CONFLICT_HANDLER)
参考