Datagrip으로 AWS RDS 에 접속해서 작업하다 보면 가끔 네트워크 불안정으로 안전하게 연결이 종료되지 않아서 테이블에 락이 걸리기도 한다.
그럴때 해결하는 방법이다.
-- 락걸린 테이블 확인
SELECT DO.OBJECT_NAME, DO.OWNER, DO.OBJECT_TYPE, DO.OWNER,
VO.XIDUSN, VO.SESSION_ID, VO.LOCKED_MODE
FROM V$LOCKED_OBJECT VO, DBA_OBJECTS DO
WHERE VO.OBJECT_ID = DO.OBJECT_ID;
-- 해당 테이블에 LOCK 이 걸렸는지.
SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME
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 IN ('TB_CONTENT');
-- 락발생 사용자와 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;
-- 현재 접속자의 SQL 분석
SELECT DISTINCT A.SID, A.SERIAL#,
A.MACHINE, A.TERMINAL, A.PROGRAM,
B.ADDRESS, B.PIECE, B.SQL_TEXT
FROM V$SESSION A, V$SQLTEXT B
WHERE A.SQL_ADDRESS = B.ADDRESS
ORDER BY A.SID, A.SERIAL#, B.ADDRESS, B.PIECE;
-- 락 세션 죽이기
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 A.MACHINE = 'itbuddys-MacBook-Pro.local'
AND C.OBJECT_NAME = 'TB_CONTENT';
-- RDS 는 아래 명령어가 권한이 없어 막힘
-- alter system kill session '645, 27160';
begin
rdsadmin.rdsadmin_util.kill(
sid => 645,
serial => 27160);
end;
안녕하세요! 비슷한 문제를 종종 겪는데, (datagrip -> table에서 쿼리문을 통하지 않고 직접 데이터를 update -> commit, rollback 버튼 비활성화, lock 현상) 원인을 잘 모르겠어서 헤매는 중입니다.
네트워크 불안정으로 안전하게 연결이 종료되지 않은 게 원인인 걸 어떻게 발견하셨나요?