[16] X$BH, X$LE, X$KJBL을 이용한 마스터 노드 확인 방법

현재 RAC GRD (Global Resource Directory)에 대해서 연구중입니다. GRD의 동작원리를 파악하기 위해서는 리소스 마스터 노드 및 사용 노드에 대한 분석이 필수적이며 이를 위해 주로 3개의 X$ 테이블을 이용합니다.

  • X$BH   (버퍼 헤더 구조 파악)  : V$BH의 베이스 테이블
  • X$LE   (락 엘리먼트 구조 파악) : V$LOCK_ELEMENT의 베이스 테이블
  • X$KJBL (BL 락 구조 파악)     : V$GES_ENQUEUE의 베이스 테이블

V$를 이용하지 못하는 이유는 V$에는 각 뷰간의 조인에 필요한 연결고리 칼럼이 제공되지 않기 때문입니다. 따라서 부득이하게 X$를 이용합니다. X$ 간의 연결고리 칼럼은 다음과 같습니다.

  • X$BH.LE_ADDR = X$LE.LE_ADDR
  • X$LE.LE_KJBL = X$KJBL.KJBLLOCKP

그런데 X$를 이용하면 불편한 점이 몇 가지 있습니다. SYS 유저로만 조회가 가능하다는 점과 GV$ 뷰와 같이 모든 노드의 X$ 정보를 한번에 확인할 수 있는 방법이 없다는 점입니다. 이러한 불편함을 해소하기 위해 다음과 같이 별도의 뷰(X_$)를 생성한 후 해당 뷰에 권한을 부여하고, DB Link를 이용해서 RAC 모든 노드의 X_$ 뷰를 한번에 조회할 수 있는 GX$ 뷰를 생성합니다. 그리고 GX$ 뷰를 이용해서 오브젝트 및 블록의 마스터 노드 및 사용 노드 정보를 확인할 수 있는 스크립트를 생성합니다. (시노님과 DB Link를 public으로 설정한 점은 단순히 편의성 때문이므로 보안을 요하는 경우에는 private로 설정하시면 됩니다)

[수정사항. 2016.08.02]

테스트를 진행하다보니 스크립트가 꽤 많이 필요합니다. 따라서, 구글 사이트를 이용해서 스크립트를 관리하기로 했습니다. https://sites.google.com/site/siyeon70/sql-scripts 따라서, 아래의 스크립트는 사용하지 않습니다.

테스트 환경 : RAC 3 Node: 12.1.0.2 64bit

1) 1번 노드에서 SYS 유저로 X_$ 뷰 생성 및 시노님 생성

sqlplus / as sysdba
create or replace view x_$bh_1   as select 'OOW1' inst_name, a.* from x$bh   a; 
create or replace view x_$le_1   as select 'OOW1' inst_name, a.* from x$le   a;
create or replace view x_$kjbl_1 as select 'OOW1' inst_name, a.* from x$kjbl a;

create public synonym x_$bh_1   for x_$bh_1;
create public synonym x_$le_1   for x_$le_1;
create public synonym x_$kjbl_1 for x_$kjbl_1;

grant all on x_$bh_1   to public;
grant all on x_$le_1   to public;
grant all on x_$kjbl_1 to public;

2) 2번 노드에서 SYS 유저로 X_$ 뷰 생성 및 시노님 생성

sqlplus / as sysdba
create or replace view x_$bh_2   as select 'OOW2' inst_name, a.* from x$bh   a;
create or replace view x_$le_2   as select 'OOW2' inst_name, a.* from x$le   a;
create or replace view x_$kjbl_2 as select 'OOW2' inst_name, a.* from x$kjbl a;

create public synonym x_$bh_2   for x_$bh_2;
create public synonym x_$le_2   for x_$le_2;
create public synonym x_$kjbl_2 for x_$kjbl_2;

grant all on x_$bh_2   to public;
grant all on x_$le_2   to public;
grant all on x_$kjbl_2 to public;

3) 3번 노드에서 SYS 유저로 X_$ 뷰 생성 및 시노님 생성

sqlplus / as sysdba
create or replace view x_$bh_3   as select 'OOW3' inst_name, a.* from x$bh   a;
create or replace view x_$le_3   as select 'OOW3' inst_name, a.* from x$le   a;
create or replace view x_$kjbl_3 as select 'OOW3' inst_name, a.* from x$kjbl a;

create public synonym x_$bh_3   for x_$bh_3;
create public synonym x_$le_3   for x_$le_3;
create public synonym x_$kjbl_3 for x_$kjbl_3;

grant all on x_$bh_3   to public;
grant all on x_$le_3   to public;
grant all on x_$kjbl_3 to public;

4) 1번 노드에서 SYS 유저로 DB Link 생성

OOW1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = racnode01h-vip)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = OOW1)
    )
  )
OOW2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = racnode02h-vip)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = OOW2)
    )
  )
OOW3 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = racnode03h-vip)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = OOW3)
    )
  )

sqlplus / as sysdba

create public database link OOW1 using 'OOW1';
create public database link OOW2 using 'OOW2';
create public database link OOW3 using 'OOW3';

5) 1번 노드에서 SCOTT 유저로 GX$ 뷰 생성

create or replace view gx$bh as 
select * from sys.x_$bh_1 
union all
select * from sys.x_$bh_2@oow2
union all
select * from sys.x_$bh_3@oow3;

create or replace view gx$le as 
select * from sys.x_$le_1 
union all
select * from sys.x_$le_2@oow2
union all
select * from sys.x_$le_3@oow3;

create or replace view gx$kjbl as 
select * from sys.x_$kjbl_1 
union all
select * from sys.x_$kjbl_2@oow2
union all
select * from sys.x_$kjbl_3@oow3;

6) 스크립트 생성
——————————————————————-
— 파일명 : fnd_obj_master.sql
— 목적  : 입력된 오브젝트명을 이용해서 해당 블록들의 마스터 노드 및 사용 노드 확인
— 사용법 : @fnd_obj_master <오브젝트명>
——————————————————————-

set  verify off linesize 1000  pages 1000
define __OBJECT_NAME=&1

select /*+ leading (a b c) */
       a.inst_name,
       a.class,
       a.dbablk,
       c.kjblname,
       c.kjblgrant,
       c.kjblrequest,
       c.kjblmaster,
       c.kjblowner
from   gx$bh   a,
       gx$le   b,
       gx$kjbl c
where  a.obj     = (select object_id from user_objects where object_name=&__OBJECT_NAME)
and    a.state  <> 3 -- exclude CR block
and    a.le_addr   = b.le_addr
and    b.le_kjbl   = c.kjbllockp
and    a.inst_name = b.inst_name
and    b.inst_name = c.inst_name
order by 1,3;

sselect /*+ leading (a b c) */
       a.inst_name,
       c.kjblmaster,
       c.kjblowner,
       count(*) cnt
from   gx$bh   a,
       gx$le   b,
       gx$kjbl c
where  a.obj     = (select object_id from user_objects where object_name=&__OBJECT_NAME)
and    a.state  <> 3 -- exclude CR block
and    a.le_addr   = b.le_addr
and    b.le_kjbl   = c.kjbllockp
and    a.inst_name = b.inst_name
and    b.inst_name = c.inst_name
group by a.inst_name, c.kjblmaster, c.kjblowner
order by 1;

——————————————————————-
— 파일명 : fnd_blk_master.sql
— 목적  : 특정 블록 1개의 마스터 노드 및 사용 노드 확인
— 사용법 : @fnd_blk_master <오브젝트명> <블록번호>
——————————————————————-

set  verify off linesize 1000  pages 1000
define __OBJECT_NAME=&1
define __BLOCK_NO=&2

select /*+ leading (a b c) */
       a.inst_name,
       a.class,
       a.dbablk,
       c.kjblname,
       c.kjblname2,
       c.kjblgrant,
       c.kjblrequest,
       c.kjblmaster,
       c.kjblowner
from   gx$bh   a,
       gx$le   b,
       gx$kjbl c
where  a.obj     = (select object_id from user_objects where object_name='&__OBJECT_NAME')
and    a.dbablk  = &__BLOCK_NO            
and    a.state  <> 3 -- exclude CR block
and    a.le_addr   = b.le_addr
and    b.le_kjbl   = c.kjbllockp
and    a.inst_name = b.inst_name
and    b.inst_name = c.inst_name
order by 1,3;

제 경우, 연구의 편의성을 위해서 GX$ 뷰를 생성한 것이므로, GX$ 뷰 생성이 여의치 않은 경우에는 X$ 테이블을 이용해서 스크립트를 작성하셔도 됩니다. 단, 그럴 경우 모든 노드에서 각각 수행해야 하는 불편함이 있습니다. 앞으로 진행되는 연구에서는 위의 2개의 스크립트를 이용할 예정입니다.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s