【博客文章2023】Hands-on:Oracle RAC数据库中的全局资源目录 Author: Bo Tang 1. Oracle RAC数据库中的全局资源目录: 在RAC的体系结构中,全局资源目录(Global Resource Directory简称GRD)是Oracle RAC数据库服务器中最重要的内存结构。它是一套哈希分布于各个实例间,由被称为“ges resource pools”、“gcs mastership buckets”、“gcs res hash bucket”和“gcs resources”等内存结构组成的的元数据集。这个哈希分布元数据集用以描述Oracle RAC数据库服务器中数据块的状态、属主信息以及数据块内部和数据块自身的锁信息。GRD分布在所有实例的共享池中,每个实例维护GRD的一部份。所有实例维护的GRD合起来形成哈希分布式的整体集。GRD内部包含“转换队列”和“写队列”,这两个队列被GCS(Global Cache Service)和GES(Global Enqueue Service)维护。所有维护信息通过内连网传输。以下实验在Oracle Database 12.2.0.1 RAC数据库上操作。 2. GES: GES(Global Enqueue Service)进程: GES(Global Enqueue Service)监控进程: 3. GCS: GCS(Global Cache Service)监控进程:
数据块的状态和属主等信息被存储成每128个块的信息一个master单元,即128个数据块的状态和属主等信息构成一个“gcs mastership bucket”。超过128个块的表的数据块可以被多个实例分布式地分段master。如果发生自动Remaster(Object Affinity and Dynamic Remastering引起)或手工Remaster(oradebug命令),整个对象将作为master单元而不进行多个实例分布式地分段master:即不管表多大,它的数据块都由同一个实例master。任何时候undo段整段必需由同一个实例master。 4. 一个数据块在多个实例上可能会有的多份拷贝(XI/PI/BI): 一个数据块在多个实例上可能会有的多份拷贝。某个实例的数据库缓冲区缓存中拥有该数据块拷贝的实例被称作该数据块的Owner实例。Owner实例的个数可以是0(最小)到集群节点总数(最大)中的任何数值。 如果该数据块内存拷贝在多个实例的数据库缓冲区缓存中同时被找到,也就是说该数据块有多个Owner实例,那么证明在近期有多个实例先后修改或访问过它。在所有这些该数据块的内存拷贝中,SCN最大的那个内存拷贝被称为Current Image(XI), 其他的那些内存拷贝就都被统统称为该数据块的 Past Image(PI)。PI的存在主要是为了在实例恢复过程中能被利用来减少实例交叉恢复的时间。如果由于检查点事件XI被写回硬盘,那么所有它所对应的PI都将被从内存中直接flush掉。还有一点值得注意的是:XI和PI都可以包含各自的new value和old value。通常old value在Oracle文档中又被称为Before Image即:BI。
5. 数据块的BL锁: 某个实例对数据库缓冲区缓存中的数据块的修改或访问都要先得到它的master实例的“Protected Read”授权,简称PR授权(锁状态为:KJUSERPR)。PR授权就是获得该数据块BL锁的过程。申请成功,并对该数据块在该实例的缓冲区缓存中的拷贝作了更改后,该拷贝就变成XI。某个数据块的BL锁申请的次数可以通过X$OBJECT_POLICY_STATISTICS查询XOPENS得到。 在某个实例上,对这个表做更新: 以sys用户查询X$OBJECT_POLICY_STATISTICS: 每一个XOPEN代表一次BL锁申请。具体的锁情况: 查询gv$ges_resource,看见TM锁:
查询gv$ges_enqueue,看见TM锁:
6. 拥有某个块XI的实例不一定是该块的master实例: 拥有某个块XI的实例不一定是该块的master实例,这就会产生跨实例的通信。进一步分析“gc [current/cr] [multiblock] request”、“gc [current/cr] [2/3]-way“、”gc [current/cr] block busy“、”gc [current/cr] grant 2-way“、”gc [current/cr] [block/grant] congested“和“gc [current/cr] [failure/retry]“等待事件中的current(new value)和cr(old value)分别对应的master实例有可能不是同一个。 下面这个查询语句能够查出master实例和owner实例(XI/PI/BI)不是同一个的数据块:
7. 手动Remaster减少节点间通信: 为了减少跨实例的通信。进一步减少“gc [current/cr] [multiblock] request”、“gc [current/cr] [2/3]-way“、”gc [current/cr] block busy“、”gc [current/cr] grant 2-way“、”gc [current/cr] [block/grant] congested“和“gc [current/cr] [failure/retry]“等待事件。我们来执行手动Remaster,以使数据块的XI就在它的master实例上:
在trace文件上看见对象93261发生了手动Remaster操作:
每做一次手动Remaster,上面的REMASTER_CNT会加1。PREVIOUS_MASTER为32767表示之前没有发生过Remaster,下面展示连接不同的实例后连续再执行两次Remaster后的结果:
|
GMT+8, 2023-4-12 21:50 , Processed in 0.034299 second(s), 21 queries .