본문 바로가기

IT/Oracle

오라클 enq: RO - fast object reuse 락

300x250

enq: RO - fast object reuse 락은 Oracle 데이터베이스에서 테이블을 DROP, TRUNCATE하거나 특정 작업으로 인해 오브젝트의 공간을 재사용하려고 할 때 발생하는 대기 이벤트입니다. 이 락은 주로 DDL 작업이나 세션 간 충돌과 관련됩니다.



원인 분석
RO - fast object reuse 락이 발생하는 이유는 다음과 같습니다
1. 동시에 DML/DDL 충돌
  • 특정 테이블에서 DROP, TRUNCATE, 또는 DML 작업이 동시에 수행되는 경우 락이 발생합니다.
  • 예를 들어, 한 세션이 테이블을 TRUNCATE 하려고 시도하고, 다른 세션이 해당 테이블에 접근 중인 경우입니다.

2. 테이블을 사용하는 세션이 열려 있는 경우
  • TRUNCATE나 DROP 같은 작업은 테이블이 다른 세션에서 사용 중이면 락이 걸립니다.
  • 테이블을 사용하는 세션이 COMMIT이나 ROLLBACK으로 작업을 완료하지 않은 상태라면 락이 해제되지 않습니다.

3. UNDO Tablespace 부족
  • TRUNCATE 작업은 UNDO가 생성되지 않지만, 해당 오브젝트에 대해 언두 리소스를 확인하는 과정에서 충돌이 발생할 수 있습니다.

4. Foreign Key 제약 조건
  • 테이블에 참조 무결성(Foreign Key) 제약 조건이 설정되어 있을 경우,
     부모 테이블에서 데이터 삭제나 테이블 드롭 시 해당 제약 조건으로 인해 락이 발생할 수 있습니다.

5. 동시 작업으로 인한 데이터 딜레이
  • 한 테이블이 다수의 세션에서 동시에 사용되면서 락 요청이 큐에 쌓이면 충돌이 발생할 수 있습니다.


해결 방법

1. 세션 확인 및 강제 종료
  • 락이 걸린 세션을 확인하고 필요하면 강제 종료합니다.
  • 락을 확인하는 SQL

SELECT s.sid, s.serial#, s.username, s.osuser, l.OBJECT_ID, o.OBJECT_NAME
FROM v$session s
JOIN v$locked_object l ON s.sid = l.session_id
JOIN dba_objects o ON l.object_id = o.object_id
WHERE o.OBJECT_NAME = 'PBT0101_STG_NULL';

  • 세션 강제 종료

ALTER SYSTEM KILL SESSION 'SID,SERIAL#';

2. 락 대기 세션 분석
 현재 락을 잡고 있는 세션을 찾고 대기 상태를 분석합니다.
• 락 대기 세션 확인

SELECT * 
FROM v$session
WHERE event LIKE 'enq: RO%';

• 세션 충돌 해소
  - 작업이 끝나지 않은 세션에서 COMMIT이나 ROLLBACK을 강제 수행.
  - 필요 시 대기 중인 DDL을 연기하거나 세션을 종료.

3. TRUNCATE 작업 전 준비

 TRUNCATE 작업 수행 전에 충돌을 방지하기 위해 다음 조치를 취할 수 있습니다:
• 활성 세션 정리
  - 테이블을 사용하는 세션이 없는지 확인하고, 작업이 종료된 상태에서 TRUNCATE를 수행합니다.
• Explicit Lock (명시적 락) 적용
  - DDL 작업 전에 LOCK TABLE을 사용하여 필요한 리소스를 명시적으로 락할 수 있습니다:

LOCK TABLE PBT0101_STG_NULL IN EXCLUSIVE MODE;

4. 외부 제약 조건(Foreign Key) 확인
 테이블에 외부 제약 조건이 있는 경우 제약 조건을 비활성화한 뒤 작업을 진행합니다.
• Foreign Key 비활성화

ALTER TABLE 자식테이블명 DISABLE CONSTRAINT 외래키명;


 Foreign Key 활성화

ALTER TABLE 자식테이블명 ENABLE CONSTRAINT 외래키명;


5. UNDO 및 TEMP 테이블스페이스 점검
 UNDO 테이블스페이스나 TEMP 테이블스페이스가 부족한 경우, 충분한 공간을 확보합니다.
• UNDO 테이블스페이스 확인

SELECT tablespace_name, file_name, bytes/1024/1024 AS size_mb
FROM dba_data_files
WHERE tablespace_name LIKE 'UNDO%';

 TEMP 테이블스페이스 확인

SELECT tablespace_name, file_name, bytes/1024/1024 AS size_mb
FROM dba_temp_files;


6. 병렬 작업 최소화
• 동시에 실행되는 작업을 줄이거나 순차적으로 실행하도록 조정합니다.
• TRUNCATE와 같은 작업은 단일 스레드로 실행되므로, 해당 테이블에서 작업하는 세션을 확인한 뒤 작업을 시작합니다.


예방 조치
• DDL 작업 시 다른 세션 확인
• TRUNCATE나 DROP 전에 해당 테이블을 사용하는 세션이 없는지 확인.
• 작업 시간 조정 : 대량의 DML/DDL 작업은 사용량이 적은 시간대에 실행.
• 작업 분리 : 데이터 삽입, 삭제, 테이블 관리를 별도로 나누어 순차적으로 처리


관련 블로그

 

유형별 락(Lock)

오라클 데이터베이스에서 락(Lock)은 여러 트랜잭션이 동일한 데이터에 접근할 때 일관성을 유지하고 데이터 무결성을 보호하기 위한 중요한 메커니즘입니다. 락의 유형을 아래와 같이 정리할

make2t.tistory.com

 

300x250