오라클에서 UPDATE 문을 실행하면 COMMIT, ROLLBACK 문을 실행하기 전에는 로우 락이 걸립니다.
로우 락이 걸리면 다른 사용자는 해당 데이터를 수정 할 수 없게 됩니다.
종종 토드(TOAD) 등의 툴에서 DB 작업을 하다보면 커밋 또는 롤백 하기 전에 프로그램이 갑자기 죽어버려서 세션이 끊기지 않은 상태로 되어 로우 락이 걸리는 경우가 있습니다.
아래에 참조 쿼리를 나열해 봤습니다.
실제 락을 푸는 쿼리는 마지막 쿼리를 봐주세요.
아래의 쿼리를 실행하고 락을 풀기 위해서는 관리자 DBA 권한이 있어야 합니다.
- 락 걸린 테이블 확인하는 쿼리
SELECT
dbo.object_name
,dbo.owner
,dbo.object_type
,vlo.xidusn
,vlo.session_id
,vlo.locked_mode
FROM V$LOCKED_OBJECT vlo, DBA_OBJECTS dbo
WHERE vlo.object_id = dbo.object_id;
- 특정 테이블이 락 걸렸는지 확인하는 쿼리
SELECT
vs.sid
,vs.serial#
,vl.type
,dbo.object_name
FROM V$SESSION vs, V$LOCK vl, DBA_OBJECTS dbo
WHERE vs.sid = vl.sid
AND vl.id1 = dbo.object_id
AND vl.type = 'TM'
AND dbo.object_name IN ('테이블명');
락을 발생한 사용자와 실행 SQL, OBJECT 조회
SELECT DISTINCT
x.session_id
,a.serial#
,d.object_name
,a.machine
,a.terminal
,a.program,
,b.address
,b.piece
,b.sql_text
FROM V$LOCKED_OBJECT x, V$SESSION a, V$SQLTEXT b, DBA_OBJECTS d
WHERE x.session_id = a.sid
AND x.object_id = d.object_id
AND a.sql_address = b.address
ORDER BY b.address, b.piece;
- 락 걸린 사용자 제거(kill) 실행문 추출 쿼리
SELECT DISTINCT
'ALTER SYSTEM KILL SESSION ''' || a.sid ||', ' || a.serial# || ''';'
FROM gv$locked_object x, gv$session a, dba_objects d
WHERE x.session_id = a.sid and x.object_id = d.object_id
;
바로 위의 이 쿼리로 세션 킬하는 쿼리문을 추출하여 다음과 같은 형식의 쿼리를 실행하여 락을 해제하면 됩니다.
ALTER SYSTEM KILL SESSION '26, 6044';
'IT만들기 > Database' 카테고리의 다른 글
오라클 스케줄러(SCHEDULER), 잡(JOB)으로 일정 시간마다 또는 매일 자동 실행 등록하는 방법입니다. (0) | 2021.07.08 |
---|---|
오라클 sqlplus 에서 실행한 쿼리 조회 결과 스풀(spool) 기능으로 캡처하여 텍스트 저장하기 (0) | 2021.07.08 |
오라클 공인교재용 샘플 DB 생성 스크립트 및 DB 삭제 (0) | 2020.03.07 |
오라클 함수, 프로시저 또는 트리거에서 내용 찾기를 해봅시다. (0) | 2018.10.12 |
데이터베이스 정규화 (0) | 2017.06.28 |
오라클 암복호화 패키지 설치 방법 (0) | 2011.12.05 |
오라클 공인교재용 SQL 샘플 DB 삭제 스크립트 (0) | 2009.01.07 |
오라클 에러 메세지 (0) | 2009.01.07 |
댓글