DDL Wait

 

DDL wait 기능은 데이터베이스 object에 DDL문장을 수행할 때, 필요한 Exclusive Lock을 얻지 못하는 경우 정해진 시간만큼 대기하는 기능이다.

예를들어, 테이블에 column을 추가할 경우

 

일반 업무 시간에는 DML이 Table에 대한 Shared Lock 를 잡고 있으므로 DDL문장을 수행할 경우, “ORA-54 resource busy …” 에러를 유발되는 경우가 많다.

 

따라서 기다렸다가 다시 실행하거나, 업무가 중단된 시점에 수행해야만 하는 불편함이 있었다.

 

DDL Wait 기능을 사용하면 지정한 대기시간 만큼 기다리면서 연속적으로 DDL을 시도 하므로 DDL의 성공확률을 높이고 관리자의 불편함이 해소될 수 있다.

 

 

 

 

DDL Wait Commands

 

 

DDL Wait을 사용하는 방법은 DDL_LOCK_TIMEOUT Parameter로 지정함으로써 설정할 수 있고 session 또는 system level로 설정가능하다. 단위은 초(sec)이다.

 

 

DDL_LOCK_TIMEOUT

 

Property Description
Default Value 0  (nowait)
Range of Values 0 ~ 1,000,000 (in seconds)
1,000,000 은 lock을 얻을 때 까지 무한 Wait

 

 

  

DDL Wait 장점

 

모든 DDL을 업무 중에 수행할 수는 없겠지만, 업무에 영향이 많지 않은 DDL에 한해서는 업무시간에 성공적으로 수행할 수 있게 되었다.

 

업무중에도 DDL 수행의 성공 확률이 높아졌다.

 

DDL수행을 위한 지속적인 반복수행 등의 불편함이 해소 되었다.

 

 

 

DDL Wait 옵션

 

 

예를 들어 DBA는 쿼리를 통해 SALES 와 같은 테이블에 TAX_CODE라는 컬럼을 추가하는 작업을 진행 하고자 할 때 아래와 같이 SQL 명령을 실행합니다:

 

하지만 “Table altered”라는 결과 대신, 아래와 같은 에러를 확인합니다.

 

 

 

에러 메시지가 모든 것을 말해 줍니다. 테이블이 다른 트랜잭션에 의해 사용되고 있어, 테이블에 Exclusive Lock을 설정하는 것이 불가능하다는 내용입니다. 물론 테이블의 로우에 걸린 락은 언젠가는 풀리게 마련입니다.

세션이 커밋을 실행하면 로우에 대한 락은 해제됩니다. 하지만 그 전에 다른 세션이 테이블의 다른 로우에 업데이트를 시작할 수 있으며, 어쩌면 테이블에 Exclusive Lock을 설정할 수 있는 기회를 영영 얻을 수 없을 지도 모릅니다.

일반적인 비즈니스 환경에서 테이블 락을 설정할 수 있는 기회는 주기적으로 찾아 오지만, DBA가 이 시간대에 alter 커맨드를 수행할 수 있으리라는 보장 할 수 없습니다.

물론 DBA는 alter table ~ 명령어로 Exclusive Lock을 설정할 수 있을 때까지 커맨드를 쉬지 않고 입력하거나, 또는 미쳐 버리거나 둘 중의 한 가지를 선택할 수도 있습니다.

Oracle Database 11g은 더 바람직한 대안을 제공합니다.

DDL Wait 옵션이 바로 그것입니다.

 

이번에는 DBA는 아래와 같이 명령을 실행합니다 :

 

이제부터 실행되는 세션의 DDL 구문이 Exclusive Lock을 설정할 수 없는 경우라도 에러는 발생하지 않습니다.

 

그 대신, DBA가 수행한 세션은 10 초간을 대기합니다. 이 10 초 동안, 세션은 명령이 성공하거나 또는 제한 시간이 경과할 때까지 DDL 작업을 연속적으로 시도합니다. 이제 DBA는 아래와 같이 실행합니다.

 

이번에는 에러가 발생하지 않습니다. Exclusive Lock을 얻을 수 있을 때까지 반복적으로 명령을 입력하는 대신, 쿼리는 Database 11g의 반복 시도 기능을 사용합니다.

이 기능은 마치 통화 중인 전화번호에 대해 반복 연결 시도하는 전화기처럼 동작합니다.

DBA는 이 기능에 너무도 만족해 하면서 다른 DBA 들에게 이 정보를 공유합니다.

 

운영 중인 시스템에서 DDL 명령을 내려 본 일이 있는 데이터베이스 관리자라면 누구든 이 새로운 기능을 반가운 소식으로 받아들일 것입니다.

 

이 동작 방식을 디폴트로 설정해서 매번 ALTER SESSION 구문을 반복적으로 실행할 필요가 없게 만든다면 더 좋지 않을까요?

가능합니다.

 

“ALTER SYSTEM SET DDL_LOCK_TIMEOUT = 10″과 같이 실행하는 경우 세션은 DDL 작업이 진행되는 동안 자동으로 DDL WAIT 옵션을 사용합니다.

 

다른 ALTER SYSTEM 구문과 마찬가지로, 이 옵션은 ALTER SESSION 구문에 의해 무시(override) 될 수 있습니다.

 

 

 

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다