oracle查看master节点,【転】Oracle RAC的DRM(Dynamic Resource Mastering)
大概描述和定义了DRM,这篇文章中将进行深入的了解,了解DRM的工作机制。ORACLE中所有的数据都是以块的方式存储的,那么在RAC环境下,一个块就会存在被多个节点读写的情况。这个时候如果有一个节点需要对这个块进行读 写,那么首先可能就需要知道这个块的信息,比如这个块是否在内存中、是否是脏块、是否需要构造一致性读、块上是否有其他人对其中某行进行了锁定等等,那么 这些块的信息就需要而且只能由一个节点
大概描述和定义了DRM,这篇文章中将进行深入的了解,了解DRM的工作机制。ORACLE中所有的数据都是以块的方式存储的,那么在RAC环境下,一个块就会存在被多个节点读写的情况。这个时候如果有一个节点需要对这个块进行读 写,那么首先可能就需要知道这个块的信息,比如这个块是否在内存中、是否是脏块、是否需要构造一致性读、块上是否有其他人对其中某行进行了锁定等等,那么 这些块的信息就需要而且只能由一个节点来进行管理,其他节点需要知道这个块的信息的时候,就去查询GRD(Global Resource Directory),GRD告知你谁是这个块的MASTER,然后你就可以去MASTER那里请求对资源的访问。假如这个资源是MASTER在节点1, 而节点2需要频繁的访问这个块,那么就需要非常多的请求MASTER的过程,这个过程要通过心跳网络来完成,速度比直接访问内存慢N多倍,所以效率就会有 问题。那么ORACLE就会把这个块的MASTER权限从节点1交给节点2来提高效率。DRM是10G才出现的功能,并且在10.1和10.2中实现的精 度是不一样的。10.1是以FILE为单位的,10.2是以SEGMENT为单位的。跟BUFFER CACHE的访问机制类似,ORACLE会使用HASH的方式来决定每个BLOCK的MASTER是哪个节点,默认情况下HASH的BUCKET是128,也就是说ORACLE按照连续128个BLOCK在一个节点,然后接下来的128个BLOCK在另外一个节点这样的机制来进行平均分配块的MASTER。这个BUCKET可以通过隐含参数_lm_contiguous_res_count来进行修改。每个BLOCK是被哪个节点MASTER的,可以通过X$KJBR.KJBRNAME来查看,这个字段的记录不那么直观,那么可以通过下面两个函数来进行转换,得到MASTER的是哪个文件的哪个块。CREATE OR REPLACE FUNCTION GET_FILE_NUMBER(P_RESOURCE_NAME VARCHAR2)RETURN INTEGER ISPOS1 INTEGER := INSTR(P_RESOURCE_NAME, 'x', 1, 2);POS2 INTEGER := INSTR(P_RESOURCE_NAME, ']', 1, 2);S VARCHAR2(30) := SUBSTR(P_RESOURCE_NAME, POS1 + 1, POS2 - POS1 - 1);BEGINRETURN TO_NUMBER(S, 'XXXXXXXX') / 65536;END;/CREATE OR REPLACE FUNCTION GET_BLOCK_NUMBER(P_RESOURCE_NAME VARCHAR2)RETURN INTEGER ISPOS1 INTEGER := INSTR(P_RESOURCE_NAME, 'x', 1, 1);POS2 INTEGER := INSTR(P_RESOURCE_NAME, ']', 1, 1);S VARCHAR2(30) := SUBSTR(P_RESOURCE_NAME, POS1 + 1, POS2 - POS1 - 1);BEGINRETURN TO_NUMBER(S, 'XXXXXXXX');END;/然后使用SELECT GET_FILE_NUMBER(KJBRNAME), GET_BLOCK_NUMBER(KJBRNAME) FROM X$KJBR;到每个节点查询,从返回结果就可以知道这个节点MASTER了哪些BLOCK。如果想手工的把一个SEGMENT的所有块都MASTER到一个节点,首先要知道这个SEGMENT所对应的OBJECT的DATA_OBJECT_ID,然后使用:oradebug lkdebug -m pkey DATA_OBJECT_ID如果想使得所有块的MASTER回到初始的根据HASH分配的状态,那么使用:oradebug lkdebug -m dpkey DATA_OBJECT_IDGV$GCSPFMASTER_INFO视图记录了REMASTER的结果,其中FILE_ID表示是哪个文件,OBJECT_ID表示是哪个对象,CURRENT_MASTER表示当前的MASTER,PREVIOUS_MASTER表示之前这个资源是MASTER在哪个节点上的,REMASTER_CNT表示REMASTER的次数(不过这个数字好像不那么靠谱)。其中如果PREVIOUS_MASTER为32767,表示这个资源一上来就MASTER在这个节点上的,没经过REMASTER的。另外三个视图也记录了REMASTER的相关信息:X$KJDRMREQ:Dynamic Remastering RequestsX$KJDRMAFNSTATS:File Remastering StatisticsX$KJDRMHVSTATS:Hash Value StatisticsLMD进程负责完成DRM的过程,所以DRM的TRACE会写在LMD进程的TRACE文件中。DRM提高效率的同时也带来一堆问题,在整个10.2.0.2版本之前,DRM都不那么稳定,ORACLE也不推荐使用(但这又是缺省在使用的功能)严重的会导致系统HANG住。可以通过下面两个隐含参数来禁止DRM的发生:_gc_undo_affinity=FALSE_gc_affinity_time=0
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)