ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle9i, 10g RAC中管理SCN算法不同导致的数据问题

Oracle9i, 10g RAC中管理SCN算法不同导致的数据问题

原创 Linux操作系统 作者:tolywang 时间:2011-03-14 09:23:50 0 删除 编辑

SCN概念

SCN 是Oracle 用来跟踪数据库内部变化发生的先后顺序的机制,可以把它想象成一
个高精度的时钟,每个Redo日志条目,Undo Data Block,Data Block 都会有SCN
号。 Oracle的Consistent-Read, Current-Read, Multiversion-Block都是依赖
SCN 实现。SCN是顺序递增的一个数字,它的最大值是0xffff.ffffffff 。


对SCN的管理,可以分为单实例和RAC : 

单节点的instance中,SCN值存在SGA区,由system commit number latch保护。
任何进程想要得到当前的SCN值,都要先得到这个latch。

RAC环境中,Oracle通过排队机制(Enqueue)实现SCN在各并行节点之间的顺序增长。
具体有两种方法:

Lamport算法: 在所有节点间的通信内容中都携带SCN, 每个节点把接收到的SCN和本
机的SCN对比,如果本机的SCN 小,则调整本机的SCN和接收的一致,如果节点间通信
不多,还会主动地定期相互通报。 故即使节点处于Idle 状态,还是会有一些Redo
log 产生。Oracle9i及10.1 RAC默认采用这种方式。

Commit广播(Broadcast)算法: 在每个Commit操作之后,节点要向其他节点广播SCN,
虽然这种方式会对系统造成一定的负载,但是确保每个节点在Commit之后都能立即查
看到SCN. Oracle10g r2 RAC默认采用这种方式。


上述两种算法可以通过调整初始化参数max_commit_propagation_delay来切换。在
Oracle9iRAC中 , 该参数的默认值都是700厘秒(centisecond),采用Lamport算法。
如果该值小于100厘秒,Oracle就采用广播算法,并且记录在alert.log文件中,
Oracle10g R2 RAC默认为 0,采用commit广播算法,10g R2 RAC的alert log 类似:

Sun Nov  7 02:07:56 2010
ALTER DATABASE OPEN
This instance was first to open
Picked broadcast on commit scheme to generate SCNs
Sun Nov  7 02:08:01 2010
LGWR: STARTING ARCH PROCESSES

这两种算法各有优缺点,Lamport算法虽然负载小,但是节点间会有延迟(提交了但
是还没有传递给其他节点),commit广播算法虽然有负载,但是没有延迟。 Oracle
10g R2 RAC 缺省选用的是BroadCast算法。

 

网络资料:
http://www.oraclefans.cn/forum/showtopic_tree.jsp?rootid=8579&showid=8579
--------------------------------------------------------------------

这几天我有一个客户的数据库出现了这样的情况,在一个3节点的RAC上,其中一
个节点上修改的数据,马上在另外一个节点上查,发现有千分之5左右的数据没有
更新,要过一会才能查到正确的结果。这造成了应用软件的业务逻辑错误。

通过分析,发现是SCN的传播机制导致。由于Oracle 9i缺省的传播模式是lamport
算法,SCN在实例间传递是通过GCS MESSAGE来传递的,因此就会造成一定的延时。
LAMPORT算法可以减少实例间同步SCN所造成的性能问题,但是在变更十分频繁的系
统中,可能出现上述的问题。因此在这种情况下,客户首先把这个应用全部部署
在一个节点上,以避免业务逻辑的问题。如果无法通过应用调整来解决,那么就
必须调整MAX_COMMIT_PROPAGATION_DELAY来改变传播算法了。

一般来说这个参数在9i和10.1的缺省值是700(TRU64除外)也就是7秒钟,实际上
这是一个上限了,因为lck每隔3秒钟会有一个例行的信息包交换,一般情况下,
3秒钟肯定会完成一次scn传播。这个参数,如果设置为0-99,那么数据库会选择
Broadcast-On-Commit算法,由LGWR来传播SCN。一般来说我们可以设置为0-99或
者保留原有的值不懂,没有十分可靠的分析证据的情况下,建议不要设置100-700
之间的值。

10.2开始,lgwr传播SCN的算法有了很大的改进,因此10.2缺省使用
Broadcast-On-Commit,这个参数的缺省值也变为0.
-------------------------------------------------------------------- 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-689333/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 深入了解SCN和CKPT
请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13476024