暂无图片
Oracle RAC SCN传播方式(Broadcast-On-Commit)
我来答
分享
郎啊狼
2019-08-21
Oracle RAC SCN传播方式(Broadcast-On-Commit)

环境:Oracle 12.2.0 RAC三节点,运行在VMware ESX虚拟平台,三个节点分别在三个物理机上

问题:开发有一个session循环插入差不多15万数据,每执行一条都提交,另外还有一个Daemon session不断检查插入的记录数,当检查完成时通知另外一个节点的session处理一个insert select语句,查询循环插入的那张表,会出现最后几条丢失的现象。

问题分析:研究RAC Commit的过程中发现下面这个BOC机制的介绍:

从Oracle 10gR2开始默认使用immediate commit propagation (BOC),即一个节点上的commit SCN 立刻同步/传播到所有节点(受隐含参数_immediate_commit_propagation控制,默认为true)。

immediate commit propagation (BOC)的原理如下:

1. user session 执行提交(commit),user session会通知LGWR进程将redo buffer中的信息写入到redo log file。

2. LGWR进程收到user session通知后,将redo buffer中的信息写入redo log file,同时LGWR进程 将COMMIT SCN 同步/传播给远程的数据库实例的LMS进程。

3. 远程数据库实例的LMS将commit SCN同步到本地SCN,然后通知commit实例的LMS进程,表示SCN 同步已经完成。

4. 当commit 实例的LMS进程接收到所有远程数据库实例的LMS进程的通知后,commit 实例的LMS进程再通知本地的LGWR 所有节点SCN同步已经完成。

5. LGWR进程在完成了IO 操作和LMS进程通知后,LGWR进程通知user session commit 成功。user session在没有收到LGWR进程通知前,一直处于等待log file sync。

首先想确认一下这个过程是否正确?假设正确的话,那么在第1步执行完毕后数据已经提交,如果第3步commit实例的LMS进程没有收到远程数据库实例的LMS进程通知,这中间是不是有一个时间差,导致在commit实例查询出来的数据和远程实例查出来的不一致呢?

谢谢解惑!

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
郎啊狼

情况补充:RAC三节点的private interconnect、VIP、public IP走的都是物理机的同一个物理网线(两个万兆网卡Bind),不知道对私网通信有没有影响?

暂无图片 评论
暂无图片 有用 0
范计杰

有几个疑问
1、查询循环插入的那张表,会出现最后几条丢失的现象
这个丢失是怎么确定的呢?

2、另外还有一个Daemon session不断检查插入的记录数,当检查完成时通知另外一个节点的session处理一个insert select语句
这个是怎么通知的呢?

insert select 这个sql怎么写的?
为什么节点1上的session检查记录数,再通知另一个节点的session做insert select,这么做的原因是什么呢?

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏