하나의 DB 장비에 여러 사람 또는 여러 장비에서 쿼리를 수행하다보면 Table Lock 이 발생하여 더 이상 쿼리를 수행하지 못하는 경우가 있습니다.
너무 무거운 쿼리가 수행되어 일정시간이 지난 후 lock 풀리거나 하면 다행이지만 deadlock 처럼 무한 대기하는 경우는 별도의 처리가 필요합니다.
oracle DB 에서 Session 정보를 어떻게 확인하고 lock 이 발생한 Session 을 어떻게 kill 하는지에 대해서 정리해 보았습니다.
Session 확인하기
Oracle 의 Session 정보는 v$session 테이블을 조회하여 확인할 수 있습니다.
select *
from v$session;
|
특정 계정의 Session 을 확인하고자 한다면?
select *
from v$session
where username = ‘계정명’;
|
현재 Active 한 Session 을 확인하려면?
select *
from v$session
where status = ‘ACTIVE’;
|
v$session 테이블에 있는 적절한 컬럼을 이용하여 조건절을 구성하면 좀 더 상세히 조회할 수 있습니다.
컬럼들의 상세 정보를 확인하고자 하신다면 아래 oracle 페이지를 참고하시면 됩니다.
Active 한 Session 이 아니라 Lock 발생하고 있는 Session 을 찾아 내려면 몇 가지 테이블을 더 확인해야 합니다.
v$lock 테이블을 활용하면 현재 Lock 발생하는 Session 을 찾아 낼 수 있습니다.
어떤 테이블에서 Lock 이 발생하는지 확인하려면 아래와 같이 확인 할 수 있습니다.
select *
from v$session a, v$lock b, dba_objects c
where a.sid = b.sid
and b.id1 = c.object_id
and b.type = 'TM'
and c.object_name=‘Lock 걸린 테이블명';
|
Session Kill 하기
Session 을 Kill 하기 위해서는 v$session 테이블의 sid 와 serail# 정보가 필요합니다.
select a.sid, a.serial#
from v$session a, v$lock b, dba_objects c
where a.sid = b.sid
and b.id1 = c.object_id
and b.type = 'TM'
and c.object_name=‘Lock 걸린 테이블명';
|
|| sid || serial# ||
| 1234 | 5678 |
|
alter system kill session ‘1234,5678';
|
sid값,serial#값 으로 session 을 kill 할 수 있습니다.
P.S Lock session 을 무조건 Kill 하기 보다는 왜 Lock 발생했는지 먼저 확인하여 원인을 해결하는 작업이 선행되어야 할 것입니다.
참고
'DB > Oracle' 카테고리의 다른 글
Oracle에서 여러 Row를 하나의 컬럼으로 합치기 (0) | 2017.07.07 |
---|---|
ORA-03111 break received on communication channel (0) | 2016.07.15 |
ORA-01722: 수치가 부적합합니다 (0) | 2016.07.01 |
Partition Range Iterator VS Partition Range ALL (0) | 2016.02.10 |
ORA-01861:literal does not match format string (0) | 2015.12.31 |