# 요약
  ■ GRD(Global Resource Directory)
1. GCS(Global Cache Service)
2. GES(Global Enqueue Service)
3. CGS(Cluster Group Service)

ps -ef | grep racdb1

■ Cache Fusion
- Master Node
- Request Node
- Holder Node

from v$bh
from v$v$gc_element

시나리오 1. rac1 node에서 처음으로 블록을 select 요청(어느 노드에도 이 블록을 사용하지 않았을 경우)
시나리오 2. SELECT - SELECT
시나리오 3. SELECT - WRITE
시나리오 4. WRITE(DML) - READ(SELECT) : COMMIT을 하지 않은 상태
시나리오 5. WRITE(DML) - COMMIT - READ(SELECT)
시나리오 6. 같은 행에 대해서 WRITE - WRITE 

 


 

# SQL 프롬프트 표시 변경

--- instance 상태 확인
[oracle@rac1 ~]$ srvctl status instance -d racdb -i racdb1,racdb2
Instance racdb1 is running on node rac1
Instance racdb2 is running on node rac2

[oracle@rac1 ~]$ . oraenv
ORACLE_SID = [racdb1] ?
The Oracle base for ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 is /u01/app/oracle



[oracle@rac1 ~]$ cd $ORACLE_HOME/sqlplus/admin

[oracle@rac1 admin]$ ls
glogin.sql  help  libsqlplus.def  plustrce.sql  pupbld.sql


--- 프롬프트 표시 변경
[oracle@rac1 admin]$ vi glogin.sql

SET SQLPROMPT "&_USER'@'_CONNECT_IDENTIFIER> "

: 추가 후 저장


[oracle@rac1 ~]$ sqlplus / as sysdba

SYS@racdb1>



--- +ASM1
[oracle@rac1 ~]$ . oraenv
ORACLE_SID = [+ASM1] ?
The Oracle base for ORACLE_HOME=/u01/app/11.2.0/grid is /u01/app/oracle

[oracle@rac1 ~]$ cd /u01/app/11.2.0/grid

[oracle@rac1 grid]$ cd sqlplus/admin/

[oracle@rac1 admin]$ vi glogin.sql

SET SQLPROMPT "&_USER'@'_CONNECT_IDENTIFIER> "

: 추가 후 저장

> 관리하는 DB가 많다. 사용중인 인스턴스를 표시해놓고 사용하자.

 


 

■ GRD(Global Resource Directory)
- 어느 노드에 최신 데이터가 있는지에 대한 위치 정보와 락 정보를 Shared Pool에서 관리한다.


# GRD가 관리하는 서비스

1. GCS(Global Cache Service)

- 노드간의 데이터를 전송하는 서비스
- 데몬(프로세스) : LMS
- 오라클 권장값은 CPU 4개마다 1개 LMS 프로세스를 사용

--- racdb1
SYS@racdb1> show parameter gcs_server_processes

NAME                                 TYPE    VALUE
------------------------------------ ------- ------------------------------
gcs_server_processes                 integer 1


--- racdb2
SYS@racdb2> show parameter gcs_server_processes

NAME                                 TYPE    VALUE
------------------------------------ ------- ------------------------------
gcs_server_processes                 integer 1

2. GES(Global Enqueue Service)
- 노드간의 발생한 락을 관리하는 서비스
- 데몬(프로세스) : LMD, LCK

3. CGS(Cluster Group Service)
- 클러스터의 멤버십을 관리
- 클러스터를 모니터링하면서 노드의 가입이나 탈퇴에 따른 클러스터의 상태 관리
- 데몬(프로세스) : LMON


# 실행 중인 프로세스 확인
ps -ef | grep racdb1

SYS@racdb1> ! ps -ef | grep racdb1
oracle   18198     1  0 09:36 ?        00:00:00 ora_pmon_racdb1
oracle   18202     1  0 09:36 ?        00:00:02 ora_vktm_racdb1
oracle   18208     1  0 09:36 ?        00:00:00 ora_gen0_racdb1
oracle   18212     1  0 09:36 ?        00:00:01 ora_diag_racdb1
oracle   18216     1  0 09:36 ?        00:00:00 ora_dbrm_racdb1
oracle   18220     1  0 09:36 ?        00:00:00 ora_ping_racdb1
oracle   18224     1  0 09:36 ?        00:00:00 ora_psp0_racdb1
oracle   18228     1  0 09:36 ?        00:00:00 ora_acms_racdb1
oracle   18232     1  0 09:36 ?        00:00:07 ora_dia0_racdb1
oracle   18236     1  0 09:36 ?        00:00:03 ora_lmon_racdb1    -- LMON
oracle   18240     1  0 09:36 ?        00:00:02 ora_lmd0_racdb1    -- LMON
oracle   18244     1  0 09:36 ?        00:00:04 ora_lms0_racdb1    -- LMON
oracle   18250     1  0 09:36 ?        00:00:00 ora_rms0_racdb1
oracle   18254     1  0 09:36 ?        00:00:00 ora_lmhb_racdb1
oracle   18258     1  0 09:36 ?        00:00:00 ora_mman_racdb1
oracle   18262     1  0 09:36 ?        00:00:00 ora_dbw0_racdb1
oracle   18266     1  0 09:36 ?        00:00:00 ora_lgwr_racdb1
oracle   18270     1  0 09:36 ?        00:00:00 ora_ckpt_racdb1
oracle   18274     1  0 09:36 ?        00:00:00 ora_smon_racdb1
oracle   18278     1  0 09:36 ?        00:00:00 ora_reco_racdb1
oracle   18282     1  0 09:36 ?        00:00:00 ora_rbal_racdb1
oracle   18286     1  0 09:36 ?        00:00:00 ora_asmb_racdb1
oracle   18290     1  0 09:36 ?        00:00:00 ora_mmon_racdb1
oracle   18294     1  0 09:36 ?        00:00:00 oracle+ASM1_asmb_racdb1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle   18296     1  0 09:36 ?        00:00:00 ora_mmnl_racdb1
oracle   18302     1  0 09:36 ?        00:00:00 ora_d000_racdb1
oracle   18306     1  0 09:36 ?        00:00:00 ora_mark_racdb1
oracle   18310     1  0 09:36 ?        00:00:00 ora_s000_racdb1
oracle   18325     1  0 09:36 ?        00:00:01 ora_lck0_racdb1
oracle   18329     1  0 09:36 ?        00:00:00 ora_rsmn_racdb1
oracle   18440     1  0 09:37 ?        00:00:00 ora_arc0_racdb1
oracle   18447     1  0 09:37 ?        00:00:00 ora_arc1_racdb1
oracle   18451     1  0 09:37 ?        00:00:00 ora_arc2_racdb1
oracle   18455     1  0 09:37 ?        00:00:00 ora_arc3_racdb1
oracle   18646     1  0 09:37 ?        00:00:00 ora_gtx0_racdb1
oracle   18666     1  0 09:37 ?        00:00:00 ora_qmnc_racdb1
oracle   18676     1  0 09:37 ?        00:00:02 oracleracdb1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle   18705     1  0 09:37 ?        00:00:00 ora_q000_racdb1
oracle   18709     1  0 09:37 ?        00:00:00 ora_q001_racdb1
oracle   18737     1  0 09:38 ?        00:00:00 ora_cjq0_racdb1
oracle   18937     1  0 09:42 ?        00:00:00 ora_smco_racdb1
oracle   19398 19395  0 09:59 ?        00:00:00 oracleracdb1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle   19472     1  0 10:02 ?        00:00:00 ora_w000_racdb1
oracle   19553     1  0 10:07 ?        00:00:00 ora_pz99_racdb1
oracle   19587 19395  0 10:08 pts/1    00:00:00 /bin/bash -c  ps -ef | grep racdb1
oracle   19589 19587  0 10:08 pts/1    00:00:00 grep racdb1

 


 

■ Cache Fusion
- 인터커넥트를 통한 효율적인 글로벌 버퍼 동기화 매커니즘
- 디스크가 아닌 인터커넥트를 통한 블록 전송과 메모리 동기화가 캐시퓨전의 핵심이다.

- Master Node  : Block의 최신 정보를 관리하는 Node. Master Node의 GRD에 저장
- Request Node : Master Node에게 Block 전송을 요청하는 노드
- Holder Node  : 최신 Block Image를 가지고 있는 Node

 

SYS@racdb1> select dbms_rowid.rowid_relative_fno(rowid) as file_no,
                   dbms_rowid.rowid_block_number(rowid) as block_no
            from hr.employees
            where employee_id = 100;

   FILE_NO   BLOCK_NO
---------- ----------
         5        207

> 보통 테이블 블럭 128개씩 노드간 분리하여 관리한다 = 라운드 로빈, 균형있게 관리 = 오라클이 분배

시나리오 1. rac1 node에서 처음으로 블록을 select 요청(어느 노드에도 이 블록을 사용하지 않았을 경우)
- Mater Node   : rac2 --- [5,207] block을 관리한다고 가정.
- Request Node : rac1

1) rac1 node 사용자가 [5,207] block의 읽기 요청을 한다.(Data Buffer Cache(메모리))
   rac1 node는 해당 블록에 N(Null)모드를 획득한다.
    
2) rac1 node 사용자가 [5,207] block의 master node인 rac2에 블록 전송을 요청한다.
   프로세스는 요청 후 응답이 올 때까지 gc cr request 이벤트가 발생
    > 디스크 읽기보다 메모리 읽기가 효율적이기 때문에 master node를 찾은 것이다.
    > master node는 데이터를 불러올 때 내려간 instance를 제외하고 오라클이 알아서 블록관리를 배정한다.
      요청자가 특정 테이블을 자주 사용한다면 해당 블럭관리를 요청자의 instance로 재배치한다.(관리를 넘긴다.)
    
3) rac2 node는 GRD를 통해 현재 어떤 인스턴스도 [5,207] block 이미지를 Data Buffer Cache에 가지고 있지 
   않다는 것을 확인한 후 rac2 node는 rac1 node에게 블록을 S(Shared,공유)모드로 읽기 권한을 부여한다.
    > master node로부터 쉐어 권한을 받을 때 이벤트가 발생
      gc cr / current grant 2-way (이중화) 또는 gc cr / current grant 2/3-way (다중화)

4) rac1 nodesms [5,207] block을 디스크에서 읽어 들이며 디스크 작업이 완료될 때까지 db file sequential read 
   이벤트를 대기한다.

5) rac2 node은 [5,207] block에 대해서 rac1 node가 S모드로 가지고있다는 정보를 master node GRD에 갱신

--- 데이터버퍼캐시 메모리에 올라온 정보 확인
SYS@racdb1> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

no rows selected


SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

no rows selected


--- select문 수행
SYS@racdb1> select salary from hr.employees where employee_id = 100;

    SALARY
----------
     24000


SYS@racdb1> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
643F86E0           scur                1          1


SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

no rows selected


- MODE_HELD
 0 : null
 1 : Shared(select)
 2 : Exclusive(DML)

- LOCAL
 1 : local
 0 : global

 

시나리오 2. SELECT - SELECT
- rac1 node에 [5,207] block이  Data Buffer Cacah에 있는 상태에서 rac2 node가 동일한 블록을 select하려고 한다.

1) rac2 node는 100번 사원의 데이터의 master node인 rac2 node에게 데이터 블록의 상태를 확인한다.
 
2) rac2 node의 요청을 받은 master node는 해당 블록이 rac1 node의 Data Buffer Cache에 있다는 것을 알고 
   rac1 node의 해당 블록을 rac2 node에게 보낼 것을 지시한다.
   응답 대기 중 gc cr request 이벤트 발생

3) 요청받은 rac1 node는 해당 블록을 interconnect를 통해 rac2 node에게 전송하게 되며 이 상황은 
   select(읽기) / select(읽기) Cache Fusion이라고 한다.
   gc cr / current grant 2-way 또는 gc cr / current grant 2/3-way 이벤트 발생

4) 원하는 블록을 전송받은 rac2 node는 master node에 정보를 GRD에 갱신

SYS@racdb1> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
643F86E0           scur                1          1


SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

no rows selected


--- select문 수행
SYS@racdb2> select salary from hr.employees where employee_id = 100;

    SALARY
----------
     24000


SYS@racdb1> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
643F86E0           scur                1          1    -- 기존 유지


SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
5CBF9B8C           scur                1          1

 

시나리오 3. SELECT - WRITE
- rac1 node, rac2 node에 100번 사원의 row가 있는 블록이 Data Buffer Cache에 있다.
- Master Node  : rac1 가정
- Request Node : rac2, X 모드
- Holder Node  : rac1, rac2 같이 S모드

1) rac2 node에서 100번 사원의 급여를 24000에서 30000으로 update하기 위해 master node에게 해당 블록을 변경할
   수 있는 X(eXclusive)모드를 요청한다.
    
2) X모드는 S모드와 동시에 사용될 수 없기 때문에 master node는 S모드를 가지고있는 rac1 node에게 S모드를 
   N모드로 다운그레이드하라고 지시한다.
   
3) rac1 node는 S모드를 N모드로 다운그레이드한 후 그 결과를 rac2 node에게 알려준다.
 
4) 응답받은 rac2 node는 자신의 모드를 X모드로 변경한 후 master node에게 rac1 node는 N모드로 다운그레이드되고
   rac2 node는 X모드로 변경되었다는 내용을 master node에게 통보(정보갱신)하고 값을 수정한다.
    > 통보와 수정은 동시에 이뤄진다.

--- 시나리오 1 > rac1 > select문 수행
SYS@racdb1> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
643F86E0           scur                1          1


--- 시나리오 2 > rac2 > select문 수행
SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
5CBF9B8C           scur                1          1


--- update문 수행
SYS@racdb2> update hr.employees set salary = 30000 where employee_id = 100;

1 row updated.


SYS@racdb1> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

no rows selected


SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
5CBF9B8C           xcur                2          1

 

시나리오 4. WRITE(DML) - READ(SELECT) : COMMIT을 하지 않은 상태
- Master Node  : rac1
- Request Node : rac1, S모드 -> N모드 : 대상 블록에 대해서 다른 node에서 X모드로 수행하고 있다
- Holder Node  : rac2, X모드

 1) rac1 node에서 100번 사원이 있는 블록을 조회하기 위해서 master node인 rac1 node에게 요청한다.
 
 2) master node는 대상 블록이 rac1 node에 있는 것을 확인한 후 rac1 node이 rac2 node에게 블록을 전송하도록
    요청한다.
    
 3) rac2 node는 해당하는 블록이 변경한 후 commit을 하지 않았기 때문에 CR 블록을 만들어서 N모드로 복사한 후
    rac1 node에 전송한다.
    
 4) N모드로 전송받은 CR 블록에 대해 이전값이 있는 UNDO에서 값을 찾아서 수정한다.(update하기 이전값으로 수정)
    CR 블록을 유저에세 전달한 후 CR 블록은 N모드로 있다.

SYS@racdb1> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

no rows selected


SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
5CBF9B8C           xcur                2          1


--- 시나리오 3 > rac2 > update문을 수행했다.


--- select문 수행
SYS@racdb2> select salary from hr.employees where employee_id = 100;

    SALARY
----------
     30000


SYS@racdb1> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

no rows selected


SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
5CBF9B8C           xcur                2          1

 

시나리오 5. WRITE(DML) - COMMIT - READ(SELECT)
- Master Node  : rac1
- Request Node : rac1, S모드
- Holder Node  : rac2, X모드(commit 상태)

 1) rac1 node에서 100번 사원의 급여 조회를 수행하기 위해서 master node에게 요청한다.
 
 2) master node는 해당 블록이 rac2 node에 X모드(commit 후 SCN정보를 가진) 정보를 확인한 후 rac2 node에게 
    X모드를 S모드로 다운그레이드 요청을 한다.
    
 3) 요청받은 rac2 node는 자신이 가지고 있는 블록을 rac1 node에게 블록을 전송한다.
 
 4) rac1 node는 전송받은 블록을 S모드로 수정한 후 그 내용을 master node에게 GRD 갱신을 요청한다.

--- 시나리오 3 > rac2 > update문 수행
--- 시나리오 4 > rac2 > select문 수행


--- commit 수행
SYS@racdb2> commit;

Commit complete.


SYS@racdb1> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

no rows selected


SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
5CBF9B8C           xcur                2          1


--- select문 수행
SYS@racdb1> select salary from hr.employees where employee_id = 100;

    SALARY
----------
     30000


SYS@racdb1> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
643F86E0           scur                1          0

> N모드의 잔재?때문인지 select문 3번정도 실행하니 rac1에서 S모드로 정상 출력.


SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
5CBF9B8C           scur                1          1

 

시나리오 6. 같은 행에 대해서 WRITE - WRITE 

--- rac1 > update문 수행
SYS@racdb1> update hr.employees set salary = 40000 where employee_id = 100;

1 row updated.


SYS@racdb1> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
643F86E0           xcur                2          0


SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
643F86E0           pi                  0          0

- rac2 node 블록은 N모드로 다운그레이드 되어 PI(Past Image, 과거이미지) 블록이 되며,
  이 블록을 전송하기 전에 블록의 내용을 리두 로그에 기록한다.(flush)
- pi모드는 잠깐 나왔다 사라지며 이후 N모드가 나온다.

--- pi모드 -> N모드로 바뀌었다
SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

no rows selected


--- rac1 > update문 수행한 상태에서 rac2 > update문 수행 > wait...
SYS@racdb2> update hr.employees set salary = 3500 where employee_id = 100;

... waiting


--- 세션 이벤트 정보 확인
SYS@racdb1> select inst_id, sid, serial#, event, blocking_instance, blocking_session 
            from gv$session where event like 'enq: TX%';

   INST_ID     SID    SERIAL# EVENT                               BLOCKING_INSTANCE BLOCKING_SESSION
---------- ------- ---------- ----------------------------------- ----------------- ----------------
         2     147         21 enq: TX - row lock contention                       1               26


SYS@racdb1> select inst_id, sid, serial#, event, blocking_instance, blocking_session 
            from gv$session where sid in (147,26);

   INST_ID     SID    SERIAL# EVENT                               BLOCKING_INSTANCE BLOCKING_SESSION
---------- ------- ---------- ----------------------------------- ----------------- ----------------
         1      26         42 PX Deq: Execute Reply
         2      26          2 Streams AQ: waiting for time manage
                              ment or cleanup tasks
         2     147         21 enq: TX - row lock contention                       1               26

> SID 147 : rac1
> SID 26  : rac2 - waiting



--- New Session : node 아무거나

--- waiting을 발생하게 만든 rac1을 Kill 'SID, SERIAL#, INST_ID'
SYS@racdb2> alter system kill session '26,42,@1';



--- 기존 session

SYS@racdb2> ... waiting
↓
1 row updated.


SYS@racdb2> select b.lock_element_addr, b.status, e.mode_held, e.local
            from v$bh b, v$gc_element e
            where b.lock_element_addr = e.gc_element_addr
            and b.file# = 5 and b.block# = 207;

LOCK_ELEMENT_ADDR  STATUS      MODE_HELD      LOCAL
------------------ ---------- ---------- ----------
5CBF9B8C           xcur                2          0



SYS@racdb2> rollback;

Rollback complete.

 


 

# 언두는 노드별로 구성되어있다.

SYS@racdb1> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1


SYS@racdb2> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS2

 


 

# HR 계정 암호생성 및 잠금해제

SYS@racdb1> select username,account_status from dba_users where username = 'HR';

USERNAME                       ACCOUNT_STATUS
------------------------------ --------------------------------
HR                             EXPIRED & LOCKED


SYS@racdb1> alter user hr identified by hr account unlock;

User altered.


SYS@racdb1> select username,account_status from dba_users where username='HR';

USERNAME                       ACCOUNT_STATUS
------------------------------ --------------------------------
HR                             OPEN

 

'Oracle 11g > RAC' 카테고리의 다른 글

100 RAC  (1) 2024.03.08
98 RAC RAC STAT, srvctl, OCR, Vote Disk, LOAD BALANCING, CTF, TAF  (3) 2024.03.06
97-3 Oracle S/W, ASM Disk Group, RAC용 DB 설치  (0) 2024.03.05
96-2 그리드 삭제 후 설치 시  (0) 2024.03.04
96-1 Grid 11g 설치  (3) 2024.03.04