오라클 성능 트러블슈팅의 기초 (2012년)
데드락 검출 0 0 19,320

by 구루비스터디 DEADLOCK 데드락 [2023.09.06]


데드락 검출

  1. 싱글 인스턴스에서 Enqueue 에 의한 데드락
  2. 싱글 인스턴스에 Library Cache Lock 에 의한 데드락
  3. 멀티 인스턴스(RAC)에서의 데드락


일반 데드락


SQL> create table t1(c1 number, c2 number);

테이블이 생성되었습니다.

SQL> insert into t1 values(1 , 1);

1 개의 행이 만들어졌습니다.

SQL> insert into t1 values(2 , 2);

1 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

-- 각 세션에 테이블 권한 주기
SQL> grant select, insert, update, delete on t1 to testuser;

권한이 부여되었습니다.

SQL> grant select, insert, update, delete on t1 to scott;

권한이 부여되었습니다.


-- 세션#1
SQL> create synonym t1 for sys.t1;

동의어가 생성되었습니다.

SQL> update t1 set c2 = 2 where c1 = 1;

1 행이 갱신되었습니다.

-- 세션#2
SQL> create synonym t1 for sys.t1;

동의어가 생성되었습니다.

SQL> update t1 set c2 = 2 where c1 = 2;

1 행이 갱신되었습니다.

-- 세션#1
SQL> update t1 set c2 = 2 where c1 = 2;
...(대기 중)...

-- 세션#2
SQL> update t1 set c2 = 2 where c1 = 1;
...(대기 중)...


  • 세션 #1 은 대기상태(정확하게 말하면 enq: TX - row lock contention 이벤트를 대기)에 있다가 주기적으로 깨어나서 데드락이 발생했는지 확인함.


-- 세션#1
SQL> update t1 set c2 = 2 where c1 = 2;
update t1 set c2 = 2 where c1 = 2
       *
1행에 오류:
ORA-00060: 자원 대기중 교착 상태가 검출되었습니다



  • 데드락이 확인되면 세션 #1 은 현재 문장(UPDATE Tl SET C2 = 2 WHERE Cl = 2)을 롤백(Rollback) 하고 트레이스 파일에 데드락 정보를 기록함.

트레이스 파일 조회



DEADLOCK DETECTED ( ORA-00060 )
 
[Transaction Deadlock]
 
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
 
Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-00090002-00002a10        20     123     X             28     112           X
TX-0002000f-0000293a        28     112     X             20     123           X
 
session 123: DID 0001-0014-00000104	session 112: DID 0001-001C-00000011 
session 112: DID 0001-001C-00000011	session 123: DID 0001-0014-00000104 
 
Rows waited on:
  Session 123: obj - rowid = 00014864 - AAAUhkAABAAA7SKAAB
  (dictionary objn - 84068, file - 1, block - 242826, slot - 1)
  Session 112: obj - rowid = 00014864 - AAAUhkAABAAA7SKAAA
  (dictionary objn - 84068, file - 1, block - 242826, slot - 0)
 
----- Information for the OTHER waiting sessions -----
Session 112:
  sid: 112 ser: 37 audsid: 6670546 user: 89/TESTUSER flags: 0x100045
  pid: 28 O/S info: user: SYSTEM, term: MYMAIN, ospid: 904
    image: ORACLE.EXE (SHAD)
  client details:
    O/S info: user: MYMAIN\Administrator, term: MYMAIN, ospid: 2828:2832
    machine: MSHOME\MYMAIN program: sqlplus.exe
    application name: SQL*Plus, hash value=3669949024
  Current SQL Statement:
  update t1 set c2 = 2 where c1 = 1
 
----- End of information for the OTHER waiting sessions -----
 
Information for THIS session:
 
----- Current SQL Statement for this session (sql_id=6sj55xg10kudc) -----
update t1 set c2 = 2 where c1 = 2



  • 알 수 있는 정보
  1. 123 과 112 세션 간의 데드락
  2. 데드락이 발생한 오브젝트 번호는 84068, 파일번호는 1, 블록번호는 242826
  3. 첫번째 로우의 아이디(ROWID)는 AAAUhkAABAAA7SKAAA, 두번째 로우의 아이디는 AAAUhkAABAAA7SKAAB




-- 오브젝트 번호로 테이블명 조회
SQL> select object_name from dba_objects where data_object_id = 84068;

OBJECT_NAME
------------------------------
T1

-- 로우 아이디에 해당하는 로우 조회
SQL> select * from t1 where rowid = 'AAAUhkAABAAA7SKAAB';

        C1         C2
---------- ----------
         2          2



Library Cache Lock에 의한 데드락
  • Enqueue 에 의한 데드락이 발생하는 경우에는 ORA-60 에러가 발생함.
    하지만 Library Cache Lock 에 의한 데드락이 발생하는 경우 ORA-4020 에러가 발생함.


ORA- 04020 : deadlock detected while trying to lock object <OBJECT NANE>
----------------------------------------------------------
  Object    waiting  waiting       blocking  blocking
  handle    session     lock mode   session      lock mode
--------   -------- -------- ----  --------  -------- ----
797992F8   7AA06C48 79FA5554    X  7AA06C48  79F8B3DO    X
----------------------------------------------------------


  • 오브젝트 핸들 797992F8 에 해당하는 Library Cache Object 에 대한 데드락.
  • 세션 어드레스 7AA06C48 에 해당하는 세션과 7AA06C48 에 해당하는 세션간의 데드락.
    두 세션 모두 독점 모드(X)로 Library Cache Lock 을 획득하려고 함.
  • 오브젝트 핸들 797992F8 에 해당하는 LCO 는 X$KGLOB.KGLHDADR 컬럼을 통해 찾을 수 있음.
    세션 어드레스에 해당하는 세션 정보는 V$SESSION.SADDR 컬럼을 통해 찾을 수 있음.
  • Enqueue 데드락은 사용자 애플리케이션에 의해 발생하는 데드락인 반면, Library Cache Lock 에 의한
    데드락은 오라클 내부 문제(가령 버그)로 인해 발생하는 데드락임.


글로벌 데드락
  • RAC 환경에서의 데드락으로 테스트 해보지 못함.
"데이터베이스 스터디모임" 에서 2012년에 "오라클 성능 트러블슈팅의 기초 " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/4307

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입