"락 처리 절차"의 두 판 사이의 차이
DB CAFE
1번째 줄: | 1번째 줄: | ||
1. lock 확인 | 1. lock 확인 | ||
− | |||
-- lock 걸린 SERIAL_NO,SESSION_ID, OBJECT | -- lock 걸린 SERIAL_NO,SESSION_ID, OBJECT | ||
+ | <source lang=sql> | ||
SELECT DISTINCT t1.session_id AS session_id | SELECT DISTINCT t1.session_id AS session_id | ||
,t2.serial# AS serial_no | ,t2.serial# AS serial_no | ||
16번째 줄: | 16번째 줄: | ||
,'UNKNOWN' | ,'UNKNOWN' | ||
) lock_mode | ) lock_mode | ||
− | FROM v$locked_object t1, v$session t2, dba_objects t3 | + | FROM v$locked_object t1 |
+ | , v$session t2 | ||
+ | , dba_objects t3 | ||
WHERE t1.session_id = t2.SID | WHERE t1.session_id = t2.SID | ||
AND t1.object_id = t3.object_id; | AND t1.object_id = t3.object_id; | ||
− | + | </source> | |
+ | |||
2. session_id를 *SESSION_ID*에 넣어 락 sql 찾기 | 2. session_id를 *SESSION_ID*에 넣어 락 sql 찾기 | ||
-- lock 걸린 sql | -- lock 걸린 sql | ||
+ | <source lang=sql> | ||
SELECT b.username username | SELECT b.username username | ||
,c.SID AS session_id | ,c.SID AS session_id | ||
30번째 줄: | 34번째 줄: | ||
,a.sql_text SQL | ,a.sql_text SQL | ||
,piece | ,piece | ||
− | FROM v$sqltext a, v$session b, v$access c | + | FROM v$sqltext a |
+ | , v$session b | ||
+ | , v$access c | ||
WHERE a.address = b.sql_address | WHERE a.address = b.sql_address | ||
AND a.hash_value = b.sql_hash_value | AND a.hash_value = b.sql_hash_value | ||
AND b.SID = c.SID | AND b.SID = c.SID | ||
AND c.owner != 'SYS' | AND c.owner != 'SYS' | ||
− | and c.SID = ' | + | and c.SID = '&SESSION_ID' |
ORDER BY b.username, c.SID, c.owner, c.OBJECT, piece; | ORDER BY b.username, c.SID, c.owner, c.OBJECT, piece; | ||
+ | </source> | ||
3. 아래 쿼리 *SESSION_ID*,*SERIAL_NO* 부분에 위 1번 쿼리에서 확인한 session_id,serial_no을 사용하여 lock 걸린 session을 kill 한다. | 3. 아래 쿼리 *SESSION_ID*,*SERIAL_NO* 부분에 위 1번 쿼리에서 확인한 session_id,serial_no을 사용하여 lock 걸린 session을 kill 한다. | ||
-- lock 걸린 SESSION kill | -- lock 걸린 SESSION kill | ||
+ | <source lang=sql> | ||
alter system kill session 'SESSION_ID ,SERIAL_NO' ; | alter system kill session 'SESSION_ID ,SERIAL_NO' ; | ||
+ | </source> | ||
4. 3번의 alter system kill session을 사용하여도 죽지 않는 경우 아래 쿼리를 사용하여 PROCESS ID를 확인하여 unix에서 직접 PROCESS를 kill한다. | 4. 3번의 alter system kill session을 사용하여도 죽지 않는 경우 아래 쿼리를 사용하여 PROCESS ID를 확인하여 unix에서 직접 PROCESS를 kill한다. | ||
47번째 줄: | 56번째 줄: | ||
-- lock 걸린 PROCESS ID 찾기 | -- lock 걸린 PROCESS ID 찾기 | ||
+ | <source lang=sql> | ||
SELECT DISTINCT s.username "ORACLE USER" | SELECT DISTINCT s.username "ORACLE USER" | ||
,p.pid "PROCESS ID" | ,p.pid "PROCESS ID" | ||
59번째 줄: | 69번째 줄: | ||
AND p.addr = s.paddr | AND p.addr = s.paddr | ||
AND s.username != 'SYS' | AND s.username != 'SYS' | ||
− | + | </source> | |
-- unix에 로그인 하여 process kill | -- unix에 로그인 하여 process kill | ||
kill -9 프로세스아이디 | kill -9 프로세스아이디 |
2019년 1월 22일 (화) 10:56 판
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
1. lock 확인
-- lock 걸린 SERIAL_NO,SESSION_ID, OBJECT
SELECT DISTINCT t1.session_id AS session_id
,t2.serial# AS serial_no
,t1.os_user_name AS os_user_name
,t1.oracle_username AS oracle_username
,t2.status AS status
,t3.object_name
,DECODE( locked_mode
,2, 'ROW SHARE'
,3, 'ROW EXCLUSIVE'
,4, 'SHARE'
,5, 'SHARE ROW EXCLUSIVE'
,6, 'EXCLUSIVE'
,'UNKNOWN'
) lock_mode
FROM v$locked_object t1
, v$session t2
, dba_objects t3
WHERE t1.session_id = t2.SID
AND t1.object_id = t3.object_id;
2. session_id를 *SESSION_ID*에 넣어 락 sql 찾기
-- lock 걸린 sql
SELECT b.username username
,c.SID AS session_id
,c.owner object_owner
,c.OBJECT OBJECT
,b.lockwait
,a.sql_text SQL
,piece
FROM v$sqltext a
, v$session b
, v$access c
WHERE a.address = b.sql_address
AND a.hash_value = b.sql_hash_value
AND b.SID = c.SID
AND c.owner != 'SYS'
and c.SID = '&SESSION_ID'
ORDER BY b.username, c.SID, c.owner, c.OBJECT, piece;
3. 아래 쿼리 *SESSION_ID*,*SERIAL_NO* 부분에 위 1번 쿼리에서 확인한 session_id,serial_no을 사용하여 lock 걸린 session을 kill 한다.
-- lock 걸린 SESSION kill
alter system kill session 'SESSION_ID ,SERIAL_NO' ;
4. 3번의 alter system kill session을 사용하여도 죽지 않는 경우 아래 쿼리를 사용하여 PROCESS ID를 확인하여 unix에서 직접 PROCESS를 kill한다.
* 주의!!! 실수하기 쉽고 위험한 방법으로 lock걸린 내용을 정확히 알지 못할 경우 kill하지 말것!!!
-- lock 걸린 PROCESS ID 찾기
SELECT DISTINCT s.username "ORACLE USER"
,p.pid "PROCESS ID"
,s.SID "SESSION ID"
,s.serial#
,osuser "OS USER"
,p.spid "PROC SPID"
,s.process "SESS SPID"
,s.lockwait "LOCK WAIT"
FROM v$process p, v$session s, v$access a
WHERE a.SID = s.SID
AND p.addr = s.paddr
AND s.username != 'SYS'
-- unix에 로그인 하여 process kill
kill -9 프로세스아이디