소개
Oracle 데이터베이스를 운영하다 보면 테이블 구조 변경, 인덱스 생성 등 다양한 DDL(Data Definition Language) 작업을 수행해야 합니다. 이러한 DDL 작업은 데이터베이스 성능에 큰 영향을 미칠 수 있으며, 특히 장시간 실행되는 DDL 작업은 서비스 중단으로 이어질 수도 있습니다.
이러한 문제를 해결하기 위해 Oracle 데이터베이스는 Nonblocking DDL(온라인 DDL)과 Blocking DDL을 제공합니다. Nonblocking DDL은 DDL 작업 중에도 DML(Data Manipulation Language) 작업을 허용하여 서비스 중단을 최소화하는 반면, Blocking DDL은 DDL 작업 동안 DML 작업을 차단합니다.
이 글에서는 Nonblocking DDL과 Blocking DDL의 개념, 차이점, 사용 방법, 그리고 실무에 적용 가능한 다양한 예시를 통해 자세히 설명합니다.
Nonblocking DDL (온라인 DDL)
Nonblocking DDL은 DDL 작업이 수행되는 동안에도 대부분의 DML 작업을 허용하여 데이터베이스의 가용성을 유지하는 기능입니다. 즉, 서비스 중단 시간을 최소화하면서 테이블 구조를 변경하거나 인덱스를 생성할 수 있습니다.
Nonblocking DDL의 장점
- 최소한의 서비스 중단: DDL 작업 중에도 DML 작업이 가능하므로 서비스 중단 시간을 최소화할 수 있습니다.
- 가용성 향상: 데이터베이스 가용성을 높여 사용자 경험을 향상시킵니다.
- 유연성: 테이블 구조 변경, 인덱스 생성 등 다양한 DDL 작업을 온라인으로 수행할 수 있습니다.
Nonblocking DDL 사용 시 고려 사항
- 성능 오버헤드: Nonblocking DDL은 Blocking DDL에 비해 약간의 성능 오버헤드가 발생할 수 있습니다.
- 제한 사항: 모든 DDL 작업이 Nonblocking으로 수행될 수 있는 것은 아닙니다. (아래 ‘제한 사항’ 섹션 참조)
- 일부 DML 차단: 테이블 구조 변경과 관련된 일부 DML 작업은 DDL 작업이 완료될 때까지 차단될 수 있습니다.
Nonblocking DDL 예시
다음은 employees
테이블에 email
컬럼을 추가하는 Nonblocking DDL 예시입니다.
ALTER TABLE employees ADD (email VARCHAR2(100));
위 SQL 구문은 employees
테이블의 서비스 가용성을 유지하면서 email
컬럼을 추가합니다.
Blocking DDL
Blocking DDL은 DDL 작업이 완료될 때까지 테이블에 대한 모든 DML 작업을 차단하는 기존의 DDL 방식입니다. Blocking DDL은 간단하지만 서비스 중단 시간을 발생시킨다는 단점이 있습니다.
Blocking DDL의 장점
- 단순성: 구현 및 이해가 간단합니다.
- 일관성: DDL 작업이 완료될 때까지 데이터 일관성을 보장합니다.
Blocking DDL의 단점
- 서비스 중단: DDL 작업 중에는 테이블에 대한 모든 DML 작업이 차단되어 서비스 중단 시간이 발생합니다.
- 가용성 저하: 데이터베이스 가용성이 저하되어 사용자 경험에 부정적인 영향을 미칠 수 있습니다.
Blocking DDL 예시
다음은 employees
테이블의 이름을 old_employees
로 변경하는 Blocking DDL 예시입니다.
ALTER TABLE employees RENAME TO old_employees;
위 SQL 구문은 테이블 이름 변경 동안 employees
테이블에 대한 모든 DML 작업을 차단합니다.
Nonblocking DDL과 Blocking DDL 비교
다음 표는 Nonblocking DDL과 Blocking DDL의 주요 차이점을 요약한 것입니다.
특성 | Nonblocking DDL | Blocking DDL |
---|---|---|
DML 작업 허용 | 허용 (일부 제한 있음) | 차단 |
서비스 중단 | 최소화 | 발생 |
성능 오버헤드 | 약간 발생 | 발생하지 않음 |
복잡도 | Blocking DDL에 비해 높음 | 단순함 |
Nonblocking DDL 사용 시 제한 사항
모든 DDL 작업이 Nonblocking으로 수행될 수 있는 것은 아닙니다. 다음은 Nonblocking DDL 사용 시 몇 가지 제한 사항입니다.
- 테이블 공간 변경: 테이블을 다른 테이블 공간으로 이동하는 작업은 Blocking DDL로 수행해야 합니다.
- 파티션 테이블: 파티션 테이블에 대한 일부 작업 (예: 파티션 분할)은 Blocking DDL로 수행해야 합니다.
- LOB 컬럼: LOB (Large Object) 컬럼이 포함된 테이블에 대한 일부 작업은 Blocking DDL로 수행해야 합니다.
- 시스템 권한:
SYS
사용자로 연결하여 시스템 권한을 획득해야 합니다.
제한 사항에 대한 자세한 내용은 Oracle 설명서를 참조하십시오.
실무 적용 예시
다음은 실제 운영 환경에서 Nonblocking DDL을 활용하는 몇 가지 예시입니다.
- 온라인 인덱스 생성: 서비스 중단 없이 대용량 테이블에 인덱스를 생성하여 쿼리 성능을 향상시킵니다.
- 온라인 테이블 재정의: 테이블 구조를 변경하면서도 데이터베이스 가용성을 유지합니다.
- 애플리케이션 업그레이드: 데이터베이스 스키마를 변경하면서 애플리케이션 업그레이드를 수행합니다.
결론
Nonblocking DDL은 Oracle 데이터베이스의 가용성을 향상시키는 강력한 기능입니다. Nonblocking DDL과 Blocking DDL의 차이점을 이해하고 적절한 DDL 방식을 선택함으로써 서비스 중단 시간을 최소화하고 사용자 경험을 향상시킬 수 있습니다.