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
'IT > Oracle' 카테고리의 다른 글
Oracle 19c의 기능 (1) | 2025.02.23 |
---|---|
오라클 파티션 리빌드(Rebuild) 쿼리 (0) | 2025.02.23 |
GROUP BY를 사용 시 성능과 효율성 향상 방안 (0) | 2025.02.22 |
오라클 인덱스 생성시 NOWAIT 옵션 (0) | 2025.02.22 |
오러클 인덱스 없는 테이블에 빠른 데이터 저장 방법 (0) | 2025.02.22 |