서버 이관 프로젝트를 수행하는 과정에서 데이터베이스의 성능과 안정성을 유지하는 것은 가장 중요한 과제 중 하나다. 새로운 환경에서 기존과 다른 성능 저하가 발생할 가능성이 있으며, 특히 트랜잭션이 증가하면서 락(Lock) 대기 시간이 길어지는 문제가 발생할 수 있다.
락(Lock)은 데이터베이스에서 동시에 실행되는 여러 트랜잭션 간의 데이터 무결성을 보장하기 위해 사용되는 메커니즘이다. 그러나 락이 과도하게 발생하면 다른 트랜잭션이 대기 상태로 유지되면서 성능 저하와 응답 지연을 초래할 수 있다.
본 글에서는 락 대기 이벤트의 개념과 주요 원인, SQL을 활용한 락 대기 분석 방법, 그리고 성능 최적화를 위한 해결 방안을 설명한다. 이를 통해 서버 이관 후 발생할 수 있는 락 대기 문제를 효과적으로 진단하고 해결할 수 있도록 한다.
1. 락(Lock) 대기 이벤트란?
1.1 락(Lock)의 개념
락(Lock)은 여러 트랜잭션이 동일한 데이터에 동시 접근할 때, 데이터의 일관성과 무결성을 보장하기 위해 사용되는 동기화 기법이다.
- 공유 락(Shared Lock, S-Lock): 여러 트랜잭션이 데이터를 읽을 수 있지만, 쓰기는 제한됨.
- 배타 락(Exclusive Lock, X-Lock): 하나의 트랜잭션만 데이터에 쓰기를 수행할 수 있으며, 다른 트랜잭션은 읽기도 불가능.
락이 적절하게 관리되지 않으면, 트랜잭션이 서로 기다리는 상태가 지속되면서 성능 저하로 이어질 수 있다.
1.2 락 관련 대기 이벤트의 종류
Oracle 데이터베이스에서 발생하는 주요 락 대기 이벤트는 다음과 같다.
대기 이벤트설명원인
enq: TX - row lock contention | 행(Row) 수준에서 락이 발생하여 트랜잭션이 대기하는 현상 | 동일한 행을 여러 트랜잭션이 동시에 수정하려고 할 때 |
enq: TM - contention | 테이블 수준에서 락이 발생하여 트랜잭션이 대기하는 현상 | 테이블에 대해 DML(INSERT, UPDATE, DELETE) 작업이 많을 때 |
enq: UL - contention | 사용자 정의 락(User Lock)으로 인해 대기 발생 | 애플리케이션에서 수동으로 설정한 락이 해제되지 않은 경우 |
library cache lock | SQL 실행 계획 캐시에서 충돌이 발생하는 현상 | 여러 세션이 동일한 SQL을 동시에 변경하는 경우 |
락이 과도하게 발생하면 트랜잭션 처리가 지연되면서 전체 시스템 성능에 악영향을 미칠 수 있다.
2. 락(Lock) 대기 분석 방법
락 대기 이벤트를 분석하려면 ASH(Active Session History) 데이터와 V$LOCK 뷰를 활용하는 것이 효과적이다.
2.1 ASH 데이터를 활용한 락 대기 분석
아래 SQL을 실행하면 특정 시간 동안 발생한 락 대기 이벤트를 확인할 수 있다.
- wait_class = 'Concurrency': 락과 관련된 대기 이벤트만 필터링.
- COUNT(*) AS wait_count: 가장 빈번하게 발생한 락 대기 이벤트를 확인.
이 데이터를 활용하면, 트랜잭션 경합이 심한 테이블이나 SQL을 파악할 수 있다.
2.2 V$LOCK을 활용한 락 상태 분석
현재 데이터베이스에서 어떤 세션이 락을 보유하고 있으며, 어떤 세션이 대기 중인지 확인하려면 다음 SQL을 실행한다.
- l.sid: 락을 보유한 세션의 ID.
- s.username: 해당 세션의 사용자.
- l.mode_held / mode_requested: 현재 보유 중인 락과 요청한 락의 유형.
- l.block = 1: 현재 다른 트랜잭션을 블로킹하는 락만 조회.
이 데이터를 활용하면, 어떤 세션이 락을 유지하면서 다른 세션을 대기시키고 있는지를 파악할 수 있다.
2.3 블로킹 세션 감지
특정 세션이 다른 세션을 차단하고 있는 경우, 블로킹 세션을 감지하여 해결할 수 있다.
- blocking_session: 다른 세션을 차단하는 블로킹 세션 ID.
- sid, serial#: 대기 중인 세션의 정보.
- event: 대기하고 있는 이벤트.
이 데이터를 활용하면, 어떤 트랜잭션이 시스템을 정체시키고 있는지 분석하고 필요한 조치를 취할 수 있다.
3. 락(Lock) 대기 문제 해결 방법
3.1 트랜잭션 크기 조정 및 커밋(Commit) 최적화
긴 트랜잭션이 락을 오랫동안 유지하는 경우, 트랜잭션을 작은 단위로 나누고, 커밋을 적절한 시점에 수행하는 것이 중요하다.
3.2 적절한 인덱스 활용
인덱스가 적절하게 설정되지 않으면 테이블 락이 과도하게 발생할 수 있다. 인덱스를 활용하면 락이 행(Row) 수준에서 발생하도록 유도하여 트랜잭션 충돌을 줄일 수 있다.
3.3 블로킹 세션 강제 종료(Kill Session)
블로킹 세션이 장시간 유지되는 경우, 관리자가 세션을 강제 종료할 수 있다.
- 1234,56789: 종료할 세션의 SID와 SERIAL#.
락(Lock) 대기 이벤트는 트랜잭션 처리 속도를 저하시킬 수 있는 주요 원인 중 하나이며, 이를 적절하게 분석하고 해결하지 않으면 전체 데이터베이스 성능이 저하될 가능성이 크다.
ASH 및 V$LOCK 뷰를 활용하여 락을 분석하고, 트랜잭션 크기 조정, 인덱스 최적화, 블로킹 세션 관리 등의 기법을 적용하면 락 대기로 인한 성능 문제를 효과적으로 해결할 수 있다.
'IT > AWR-ASH' 카테고리의 다른 글
실시간 ASH 데이터를 조회하는 방법: 현재 진행 중인 세션 활동을 조회하는 SQL. (0) | 2025.02.10 |
---|---|
ASH에서 특정 세션 분석하기: 문제를 일으키는 특정 세션을 추적하고 해결하는 방법 (0) | 2025.02.10 |
ASH를 활용한 SQL 튜닝: 실행 시간이 긴 SQL을 최적화하는 접근법 (0) | 2025.02.09 |
SQL 실행 빈도 분석: 가장 많이 실행되는 SQL을 찾아 성능 최적화를 수행하는 방법 (0) | 2025.02.09 |
디스크 I/O 대기 분석: 디스크 읽기/쓰기 지연이 성능 저하에 미치는 영향 분석 (0) | 2025.02.09 |
CPU 대기 이벤트 분석: CPU 사용량이 높은 SQL을 식별하고 최적화하는 방법 (0) | 2025.02.09 |
ASH 보고서에서 Wait Event 분석하기: 가장 많이 발생하는 대기 이벤트를 식별하는 방법. (0) | 2025.02.09 |
대기 이벤트란?: SQL 실행이 지연되는 원인을 분석하는 중요한 요소 (0) | 2025.02.09 |