본문 바로가기
Oracle/운영

Oracle Lock 걸린 세션 확인 및 Lock관련 테이블

by 취미툰 2020. 9. 21.
반응형

 

오라클에서 Lock과 관련된 딕셔너리 뷰는 얼마나 될까요? 티베로와 비교해보는 것도 궁금했습니다. 지난번에는 티베로의 Lock 관련 딕셔너리 뷰를 포스팅했는데, 이번에는 오라클을 포스팅하도록 하겠습니다.

 

DB : Oracle 12.2.0.1 64bit

 

 

오라클은 Lock 관련테이블이 69개가 존재합니다. Synonym도 포함된 값이기때문에 줄어들 수는 있지만, 티베로와 비교하였을때는 많은 테이블의 수를 확인할 수 있습니다.

 

select * from dict where table_name like '%LOCK%'

TABLE_NAME                    COMMENTS 

----------------------------------------------------------------------------------------------------------- 
DBA_BLOCKERS                                                                                                
DBA_DDL_LOCKS                                                                                               
DBA_DML_LOCKS                                                                                               
DBA_HIST_CR_BLOCK_SERVER      Consistent Read Block Server Historical Statistics                            
DBA_HIST_CURRENT_BLOCK_SERVER Current Block Server Historical Statistics                                    
DBA_KGLLOCK                                                                                                 
DBA_LOCK                                                                                                    
DBA_LOCKDOWN_PROFILES         Describes all the rules of all the lockdown profiles                          
DBA_LOCK_INTERNAL                                                                                           
DBA_RECOVERABLE_SCRIPT_BLOCKS Details about the recoverable script blocks                                   
CDB_BLOCKERS                  in all containers                                                             
CDB_DDL_LOCKS                 in all containers                                                             
CDB_DML_LOCKS                 in all containers                                                             
CDB_HIST_CR_BLOCK_SERVER      Consistent Read Block Server Historical Statistics in all containers          
CDB_HIST_CURRENT_BLOCK_SERVER Current Block Server Historical Statistics in all containers                  
CDB_KGLLOCK                   in all containers                                                             
CDB_LOCK                      in all containers                                                             
CDB_LOCKDOWN_PROFILES         Describes all the rules of all the lockdown profiles in all containers        
CDB_LOCK_INTERNAL             in all containers                                                             
CDB_RECOVERABLE_SCRIPT_BLOCKS Details about the recoverable script blocks in all containers                 
DBMS_LOCK_ALLOCATED                                                                                         
DBA_LOCKS                     Synonym for DBA_LOCK                                                          
GV$BLOCKING_QUIESCE           Synonym for GV_$BLOCKING_QUIESCE                                              
GV$CACHE_LOCK                 Synonym for GV_$CACHE_LOCK                                                    
GV$CR_BLOCK_SERVER            Synonym for GV_$CR_BLOCK_SERVER                                               
GV$CURRENT_BLOCK_SERVER       Synonym for GV_$CURRENT_BLOCK_SERVER                                          
GV$DATABASE_BLOCK_CORRUPTION  Synonym for GV_$DATABASE_BLOCK_CORRUPTION                                     
GV$DLM_ALL_LOCKS              Synonym for GV_$DLM_ALL_LOCKS                                                 
GV$DLM_LOCKS                  Synonym for GV_$DLM_LOCKS                                                     
GV$ENQUEUE_LOCK               Synonym for GV_$ENQUEUE_LOCK                                                  
GV$GES_BLOCKING_ENQUEUE       Synonym for GV_$GES_BLOCKING_ENQUEUE                                          
GV$GES_DEADLOCKS              Synonym for GV_$GES_DEADLOCKS                                                 
GV$GES_DEADLOCK_SESSIONS      Synonym for GV_$GES_DEADLOCK_SESSIONS                                         
GV$GLOBAL_BLOCKED_LOCKS       Synonym for GV_$GLOBAL_BLOCKED_LOCKS                                          
GV$LIBCACHE_LOCKS             Synonym for GV_$LIBCACHE_LOCKS                                                
GV$LOCK                       Synonym for GV_$LOCK                                                          
GV$LOCKED_OBJECT              Synonym for GV_$LOCKED_OBJECT                                                 
GV$LOCKS_WITH_COLLISIONS      Synonym for GV_$LOCKS_WITH_COLLISIONS                                         
GV$LOCK_ACTIVITY              Synonym for GV_$LOCK_ACTIVITY                                                 
GV$LOCK_ELEMENT               Synonym for GV_$LOCK_ELEMENT                                                  
GV$LOCK_TYPE                  Synonym for GV_$LOCK_TYPE                                                     
GV$NFS_LOCKS                  Synonym for GV_$NFS_LOCKS                                                     
GV$NONLOGGED_BLOCK            Synonym for GV_$NONLOGGED_BLOCK                                               
GV$SESSION_BLOCKERS           Synonym for GV_$SESSION_BLOCKERS                                              
GV$_LOCK                      Synonym for GV_$_LOCK                                                         
V$BLOCKING_QUIESCE            Synonym for V_$BLOCKING_QUIESCE                                               
V$BLOCK_CHANGE_TRACKING       Synonym for V_$BLOCK_CHANGE_TRACKING                                          
V$CACHE_LOCK                  Synonym for V_$CACHE_LOCK                                                     
V$CR_BLOCK_SERVER             Synonym for V_$CR_BLOCK_SERVER                                                
V$CURRENT_BLOCK_SERVER        Synonym for V_$CURRENT_BLOCK_SERVER                                           
V$DATABASE_BLOCK_CORRUPTION   Synonym for V_$DATABASE_BLOCK_CORRUPTION                                      
V$DLM_ALL_LOCKS               Synonym for V_$DLM_ALL_LOCKS                                                  
V$DLM_LOCKS                   Synonym for V_$DLM_LOCKS                                                      
V$ENQUEUE_LOCK                Synonym for V_$ENQUEUE_LOCK                                                   
V$GES_BLOCKING_ENQUEUE        Synonym for V_$GES_BLOCKING_ENQUEUE                                           
V$GES_DEADLOCKS               Synonym for V_$GES_DEADLOCKS                                                  
V$GES_DEADLOCK_SESSIONS       Synonym for V_$GES_DEADLOCK_SESSIONS                                          
V$GLOBAL_BLOCKED_LOCKS        Synonym for V_$GLOBAL_BLOCKED_LOCKS                                           
V$LIBCACHE_LOCKS              Synonym for V_$LIBCACHE_LOCKS                                                 
V$LOCK                        Synonym for V_$LOCK                                                           
V$LOCKED_OBJECT               Synonym for V_$LOCKED_OBJECT                                                  
V$LOCKS_WITH_COLLISIONS       Synonym for V_$LOCKS_WITH_COLLISIONS                                          
V$LOCK_ACTIVITY               Synonym for V_$LOCK_ACTIVITY                                                  
V$LOCK_ELEMENT                Synonym for V_$LOCK_ELEMENT                                                   
V$LOCK_TYPE                   Synonym for V_$LOCK_TYPE                                                      
V$NFS_LOCKS                   Synonym for V_$NFS_LOCKS                                                      
V$NONLOGGED_BLOCK             Synonym for V_$NONLOGGED_BLOCK                                                
V$SESSION_BLOCKERS            Synonym for V_$SESSION_BLOCKERS                                               
V$_LOCK                       Synonym for V_$_LOCK                                                          
   
69 rows selected. 

 

 

마찬가지로 테스트를 통해 어떤 뷰에 어떤 값들이 보여지는지 확인해보도록 하겠습니다.

 

세션1

TEST@ysbae> update emp set salary=1111 where employee_id=200;

1 row updated.

 

세션2 (Lock이 걸린 상태)

TEST@ysbae> update emp set salary=9999 where employee_id=200;

 

 

세션3

 

V$LOCK

v$lock에서 Type인 TX를 기준으로 값을 추출했을 때 두개의 행이 나오며 LMODE와 REQUEST를 통해 어느 세션이 Lock을 잡고있고, 어느 세션이 Lock을 요청했는지 알 수 있습니다. LMODE=6인 59번세션에서는 Lock을 Exclusive 모드로 잡고 있는 세션이며, REQUEST가 6인 1번 세션이 exclusive을 요청하고 대기하고 있는 세션임을 알 수 있습니다.

 

*참고

LMODE/REQUEST 번호에 따른 값의 의미

Lock mode in which the session holds the lock:

  • 0 - none

  • 1 - null (NULL)

  • 2 - row-S (SS)

  • 3 - row-X (SX)

  • 4 - share (S)

  • 5 - S/Row-X (SSX)

  • 6 - exclusive (X)

 

select * from v$lock where type='TX'

ADDR     KADDR      SID       TYPE     ID1       ID2       LMODE      REQUEST        CTIME      BLOCK      CON_ID       
-------- ---------- --------- -------- --------- --------- ---------- -------------- ---------- ---------- ------------ 
000000006E954180 000000006E954200         1 TX          131088      1747          0              6        137          0            0
000000006A2BFEE8 000000006A2BFF70        59 TX          131088      1747          6              0     226837          1            0

 

DBA_DML_LOCKS

dml으로 인한 lock을 보여주는 dba_dml_locks 테이블에서도 1번세션과 59번 세션을 확인할 수 있습니다. 하지만 이 뷰에서는 어느 세션이 lock을 잡고 있는지는 나오지 않고 있습니다. 59번 세션이 Blocking을 하고 있음에도 불구하고 BLOCKING_OTHERS에서는 Not Blocking으로 나오고 있음을 확인할 수 있습니다. 즉, DML과 관련되어 Lock이 걸려있는 모든 세션을 보여줄때 확인할 수 있는 테이블이라고 확인할 수 있을것 같습니다.

 

select * from dba_dml_locks

SESSION_ID           OWNER     NAME   MODE_HELD          MODE_REQUESTED  LAST_CONVERT             BLOCKING_OTHERS   
-------------------- --------- ------ ------------------ --------------- ------------------------ ------------------
                   1 TEST      EMP    Row-X (SX)         None                                 274 Not Blocking      
                  59 TEST      EMP    Row-X (SX)         None                              227435 Not Blocking    

 

 

 

DBA_LOCKS

DBA_LOCKS 테이블에서 LOCK_TYPE을 Transaction으로 조회한 결과 두개의 행이 나오게 되며 MODE_HELD와 MODE_REQUESTED의 값을 통해서 누가 LOCK을 잡고 있는지 알 수 있습니다. MODE_HELD에서 Exclusive값을 보이는 59번 세션이 현재 Lock을 잡고 있는것을 확인할 수 있습니다. 또한 BLOCKING_OTHERS 컬럼에서 Blocking의 값을 확인해도 알 수 있습니다. Lock에 대해 보기 편하게 잘 나타나있는 뷰라고 할 수 있습니다.

 

 

select * from dba_locks  where LOCK_TYPE='Transaction'

 

SESSION_ID           LOCK_TYPE                  MODE_HELD   MODE_REQUESTED    LOCK_ID1   LOCK_ID2  LAST_CONVERT             BLOCKING_OTHERS  CON_ID       
-------------------- -------------------------- ----------- ----------------- ---------- --------- ------------------------ ---------------- ------------ 
                   1 Transaction                None        Exclusive         131088     1747                           664 Not Blocking                0
                  59 Transaction                Exclusive   None              131088     1747                        227364 Blocking                    0

 

 

DBA_BLOCKERS

 

현재 LOCK을 잡고있는 세션만 확인하고 싶을 경우 간편하게 확인할 수 있는 뷰입니다. 59번 세션이 잡고 있는것을 확인할 수 있습니다.

 

select * from dba_blockers

HOLDING_SESSION                CON_ID       
------------------------------ ------------ 
                            59            0

 

 

V$SESSION

 

가장 먼저 확인할 수 있고, 가장 많은 정보를 볼 수 있는 테이블입니다. 보통 이 뷰만 사용해서라도 Lock걸린 테이블을 찾아낼 수 있습니다.

SID가 1번인 세션의 BLOCKING SESSION을 확인해보면 59번세션이 BLOCKING하고 있는것을 확인할 수 있으며 그에 따라 enq:TX -row lock contention 이벤트가 발생하고 있는것을 확인할 수있습니다. 뿐만아니라 어떤 프로그램을 사용해서 접속하여 세션이 작업하고 있는지 상세하게 확인할 수 있습니다.

 

select sid,serial#,username,status,machine,program,module,blocking_session_status,blocking_instance,blocking_session,event from v$session where type <> 'BACKGROUND'

SID       SERIAL#        USERNAME   STATUS       MACHINE           PROGRAM                    MODULE                                             BLOCKING_SESSION_STATUS  BLOCKING_INSTANCE    BLOCKING_SESSION    EVENT                         
--------- -------------- ---------- ------------ ----------------- -------------------------- -------------------------------------------------- ------------------------ -------------------- ------------------- ------------------------------
        1          57694 TEST       ACTIVE       ysbae             sqlplus@ysbae (TNS V1-V3)  SQL*Plus                                           VALID                                       1                  59 enq: TX - row lock contention 
       24          24830 SYS        INACTIVE     ysbae             sqlplus@ysbae (TNS V1-V3)  sqlplus@ysbae (TNS V1-V3)                          NO HOLDER                                                         SQL*Net message from client   
       25          64616 SYS        ACTIVE       ysbae             oracle@ysbae (J000)        DBMS_SCHEDULER                                     NOT IN WAIT                                                       PGA memory operation          
       48          30931 SYS        ACTIVE       ysbae             oracle@ysbae (J001)        DBMS_SCHEDULER                                     NO HOLDER                                                         PL/SQL lock timer             
       59          41976 TEST       INACTIVE     ysbae             sqlplus@ysbae (TNS V1-V3)  SQL*Plus                                           NO HOLDER                                                         SQL*Net message from client   
       62          57475 SYS        INACTIVE     WORKGROUP\YSBAE   OrangeMainU.exe            Orange for ORACLE (Unicode) DBA - Session Monitor  NO HOLDER                                                         SQL*Net message from client   
       63          53219 SYS        ACTIVE       WORKGROUP\YSBAE   OrangeMainU.exe            Orange for ORACLE (Unicode) DBA                    NOT IN WAIT                                                       SQL*Net message to client     
       69          51582            ACTIVE       ysbae             oracle@ysbae (J002)                                                           NO HOLDER                                                         jobq slave wait               

8 rows selected.			

 

해당 세션을 확인해서 BLOCKING 하고 있는 세션을 강제로 킬 하던지, 세션 사용중인 담당자에서 트랜잭션의 완료(commit or rollback)을 하라고 요청해야 합니다.

 

세션을 킬하는 명령어는 아래와 같습니다.

alter system kill session 'SID,SERIAL#'

 

alter system kill session '59,41976' ;

명령어 후 V$SESSION을 한번더 조회하면 STATUS에 KILLED라고 바뀐것을 확인할 수 있습니다.

 

 

LOCK과 관련된 뷰는 오라클이 다양하게 많이 있고 각 뷰마다 디테일하게 조회할 수 있습니다.

 

 

반응형

'Oracle > 운영' 카테고리의 다른 글

LOB(Large Object) Type 데이터  (0) 2020.09.28
Delete와 Truncate  (0) 2020.09.24
BINARY_FLOAT,BINARY_DOUBLE  (0) 2020.09.11
Checkpoint와 Checkpoint not complete  (0) 2020.09.09
Temp Tablespace  (0) 2020.09.08

댓글