DataBase > Oracle/Tibero

락(lock)걸린 테이블 확인 및 해결

#lock#oracle#tibero

락(Lock) 걸린 테이블 정보 확인

1. 락걸린 테이블의 갯수확인

select
      count(1) 
from 
      v$locked_object vo
    , dba_objects do
 where vo.object_id = do.object_id;

[한줄표시] select count(1) from v$locked_object vo, dba_objects do where vo.object_id = do.object_id; 

2. 락걸린 테이블 유무확인

  ※ 지정된 계정에 대해 검색시 접속계정명도 조건에 추가

select * from v$locked_object 
 where  oracle_username = '{접속계정명}';

3. 락걸린 섹션을 확인하기

select
      vs.sid
    , vs.serial# 
from 
      v$session vs
    , v$lock vl
    , dba_objects do
 where vs.sid = vl.sid and vl.id1=do.object_id and vl.type='TM';
>>> 락걸린 테이블명을 알고 있으면 아래 조건을 추가하면 된다.
    and do.object_name = '{table name}'

[한줄표시] select vs.sid,vs.serial# from v$session vs,v$lock vl, dba_objects do where vs.sid = vl.sid and vl.id1=do.object_id and vl.type='TM';

4. 장기실행 또는 락걸린 SQL 확인

   ※ 실제 락이 걸려 있는거 외 장기적으로 실행중인 쿼리일 가능성 포함

select 
     distinct vo.session_id
    ,vss.serial#
    ,do.object_name
    ,vss.machine
    ,vss.terminal
    ,vss.program
    ,vsql.address
    ,vsql.piece
    ,vsql.sql_text
from 
     v$locked_object vo
    ,v$session vss
    ,v$sqltext vsql
    ,dba_objects do
where 
        1=1
    and vo.session_id   = vss.sid
    and vo.object_id    = do.object_id
    and vss.sql_address = vsql.address
order by vsql.address, vsql.piece;

[한줄표시] select distinct vo.session_id,vss.serial#,do.object_name,vss.machine,vss.terminal,vss.program,vsql.address,vsql.piece,vsql.sql_text from v$locked_object vo,v$session vss,v$sqltext vsql,dba_objects do where 1=1 and vo.session_id = vss.sid and vo.object_id = do.object_id and vss.sql_address = vsql.address order by vsql.address, vsql.piece;

락걸린 센션(프로세스) 해제하기

1. 락걸린 테이블 세션 KILL

alter system kill session 'sid, serial#';
alter system kill session '1954, 63611';

 

ERROR at line 1:
ORA-00031: session marked for kill

2. 위 와같이 실행 후 에러가 나올경우

   ※ 오래지나면 사라지나 바로 해제하고 싶으면

select vs.sid,vs.username,vs.osuser,vs.process fg_pid,vp.spid bg_pid from v$session vs,v$process vp where vs.paddr=vp.addr;

   ※ 위와 같이 쿼리실행해 나온 PID 를 KILL 한다. (종류 후 실행)

# KILL -9 {PID}