제19장 DBMS_REDEFINITION

내용 목차

19.1. 개요
19.2. 프러시저
19.2.1. ABORT_REDEF_TABLE
19.2.2. CAN_REDEF_TABLE
19.2.3. COPY_TABLE_DEPENDENTS
19.2.4. FINISH_REDEF_TABLE
19.2.5. REGISTER_DEPENDENT_OBJECT
19.2.6. START_REDEF_TABLE
19.2.7. SYNC_INTERIM_TABLE
19.2.8. UNREGISTER_DEPENDENT_OBJECT

본 장에서는 DBMS_REDEFINITION 패키지의 기본 개념과 패키지 내의 프러시저를 사용하는 방법을 설명한다.

19.1. 개요

DBMS_REDEFINITION은 온라인 상태에서 특정 테이블을 재정의하기 위한 프러시저를 제공하는 패키지이다. DBMS_REDEFINITION을 사용하기 위해서는 EXECUTE ON DBMS_REDEFINITION과 CREATE ANY MATERIALIZED VIEW 권한이 필요하다.

재정의할 대상인 원본 테이블을 지정된 컬럼 대응 정보에 따라 새 테이블로 재정의할 수 있다. 새 테이블은 재정의 수행 이전에 미리 생성되어 있어야 하며, 재정의가 끝나면 원본 테이블의 구조와 새 테이블의 구조가 서로 바뀐다.

19.2. 프러시저

본 절에서는 DBMS_REDEFINITION 패키지에서 제공하는 프러시저를 알파벳 순으로 설명한다.

19.2.1. ABORT_REDEF_TABLE

온라인 테이블 재정의를 취소하는 프러시저이다. 이 프러시저에 원본 테이블과 새 테이블의 이름을 지정하면, 온라인 테이블을 재정의하기 위해 생성한 내부 객체는 제거되고 재정의가 취소된다. 이때 원본 테이블과 새 테이블은 취소 시점의 상태로 남는다.

ABORT_REDEF_TABLE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE ABORT_REDEF_TABLE 
    (
        uname IN VARCHAR2, 
        orig_table IN VARCHAR2,
        int_table IN VARCHAR2 
    );
  • 파라미터

    파라미터설명
    uname원본 테이블과 새 테이블이 속한 스키마의 이름이다.
    orig_table원본 테이블의 이름이다.
    int_table새 테이블의 이름이다.
  • 예제

    BEGIN
       DBMS_REDEFINITION.ABORT_REDEF_TABLE('TIBERO', 'ORIG_TABLE', 'INT_TABLE');
    END; /

19.2.2. CAN_REDEF_TABLE

온라인 테이블 재정의가 가능한지 확인하는 프러시저이다. 이 테이블에 테이블 이름과 옵션을 주면 온라인 테이블 재정의가 가능한지 확인한 후, 가능하지 않은 경우 에러를 발생시킨다.

CAN_REDEF_TABLE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE CAN_REDEF_TABLE 
    (
       uname IN VARCHAR2, 
       tname IN VARCHAR12,
       options_flag IN BINARY_INTEGER := 1, 
       part_name IN VARCHAR2 := NULL
    );
  • 파라미터

    파라미터설명
    uname테이블이 속한 스키마의 이름이다.
    tname온라인 테이블 재정의가 가능한지 확인할 테이블의 이름이다.
    options_flag

    원본 테이블에서 새 테이블로 데이터를 옮길 때 어떤 정보를 사용할 것인지를 지정한다.

    • cons_use_pk: 기본 키의 정보를 사용한다. (지정하지 않을 경우 기본값)

    • cons_use_rowid: ROWID를 사용한다.

    part_name

    재정의할 파티션의 이름이다. 한 테이블의 단 하나의 파티션을 재정의하는 경우에는 파티션의 이름을 해당 파라미터로 명시해야 한다.

    NULL은 전체 테이블이 재정의된다는 것을 의미한다.

  • 예제

    CREATE TABLE T1 (A NUMBER PRIMARY KEY);
    
    BEGIN
              DBMS_REDEFINITION.CAN_REDEF_TABLE('TIBERO', 'T1');
    END; /

19.2.3. COPY_TABLE_DEPENDENTS

테이블을 온라인 재정의를 수행하면서, 테이블과 관련된 다른 객체들도 복사해주는 프러시저이다. 인덱스, 제약사항, 트리거, 권한 등에 대해서 기존 테이블의 관련 객체를 새 테이블에 복사해 줄지 파라미터로 명시 할 수 있다.

COPY_TABLE_DEPENDENTS 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE COPY_TABLE_DEPENDENTS 
    ( 
        uname IN VARCHAR2, 
        orig_table IN VARCHAR2,
        int_table IN VARCHAR2,
        copy_indexes IN PLS_INTEGER := 1,
        copy_triggers IN BOOLEAN := TRUE,
        copy_constraints IN BOOLEAN := TRUE,
        copy_privileges IN BOOLEAN := TRUE, 
        ignore_errors IN BOOLEAN := FALSE,
        num_errors OUT PLS_INTEGER,
        copy_statistics IN BOOLEAN := FALSE,
        copy_mvlog IN BOOLEAN := FALSE
    );
  • 파라미터

    파라미터설명
    uname원본 테이블과 새 테이블이 속한 스키마의 이름이다.
    orig_table원본 테이블의 이름이다.
    int_table새 테이블의 이름이다.
    copy_indexes

    인덱스들도 복사해 줄 것인지 명시한다.

    • 0: 인덱스를 복사하지 않는다.

    • dbms_redefinition.cons_orig_params: 인덱스를 복사한다.

    copy_triggers
    • TRUE: 트리거를 복사한다.

    • FALSE: 트리거를 복사하지 않는다.

    copy_constraints
    • TRUE: 제약 사항들을 복사한다.

    • FALSE: 제약 사항들을 복사하지 않는다.

    copy_privileges
    • TRUE: 테이블의 권한을 복사한다.

    • FALSE: 테이블의 권한을 복사하지 않는다.

    ignore_errors
    • TRUE: 관련있는 객체를 복사하며 발생하는 에러는 무시하고 넘어간다.

    • FALSE: 관련있는 객체를 복사하며 에러가 발생하면 멈춘다.

    num_errors에러가 발생한 횟수를 담아 준다.
    copy_statistics테이블의 통계 정보를 복사한다.
    copy_mvlog테이블의 Materialized View LOG들을 복사한다.
  • 예제

    CREATE TABLE T1 (A NUMBER PRIMARY KEY, B NUMBER);
    CREATE INDEX I1 ON T1(B);
    CREATE TABLE INT_T1 (A NUMBER, B NUMBER);
    
    BEGIN
        DBMS_REDEFINITION.START_REDEF_TABLE('TIBERO', 'T1', 'INT_T1',
         'A A, B B'); 
    END; 
    /
    
    DECLARE num_errors pls_integer;
    BEGIN
        DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('TIBERO', 'T1', 'INT_T1',
              DBMS_REDEFINITION.CONS_ORIG_PARAMS,
              TRUE, TRUE, TRUE, TRUE, num_errors, FALSE);
    END;
    /

19.2.4. FINISH_REDEF_TABLE

온라인 테이블 재정의를 종료하는 프러시저이다. 이 프러시저에 원본 테이블과 새 테이블의 이름을 지정하면, 재정의 중에 변경된 데이터를 서로 교체한 후 원본 테이블과 새 테이블의 이름을 동기화한다. 이로써 재정의가 종료된다. 단, 시스템이 객체를 바꾸는 등의 작업을 하기 때문에 해당 테이블에서 수행되는 트랜잭션이 없는 경우에만 프러시저가 종료 작업을 수행한다.

FINISH_REDEF_TABLE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE FINISH_REDEF_TABLE 
    ( 
        uname IN VARCHAR2, 
        orig_table IN VARCHAR2,
        int_table IN VARCHAR2 
    );
  • 파라미터

    파라미터설명
    uname원본 테이블과 새 테이블이 속한 스키마의 이름이다.
    orig_table원본 테이블의 이름이다.
    int_table새 테이블의 이름이다.
  • 예제

    BEGIN
        DBMS_REDEFINITION.FINISH_REDEF_TABLE('TIBERO', 'ORIG_TABLE', 'INT_TABLE');
    END; /

19.2.5. REGISTER_DEPENDENT_OBJECT

기존 테이블의 관련 객체와 새 테이블의 관련 객체를 매핑시킨다. 온라인 테이블 재정의가 끝나면 매핑시킨 객체들의 이름이 서로 바뀌게 된다.

REGISTER_DEPENDENT_OBJECT 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE REGISTER_DEPENDENT_OBJECT 
    (
        uname IN VARCHAR2, 
        orig_table IN VARCHAR2, 
        int_table IN VARCHAR2,
        dep_type IN PLS_INTEGER,
        dep_owner IN VARCHAR2,
        dep_orig_name IN VARCHAR2,
        dep_int_name IN VARCHAR2 
    );
  • 파라미터

    파라미터설명
    uname원본 테이블과 새 테이블이 속한 스키마의 이름이다.
    orig_table원본 테이블의 이름이다.
    int_table새 테이블의 이름이다.
    dep_type관련 객체의 타입이다.
    dep_owner관련 객체를 소유한 사용자 이름이다.
    dep_orig_name원본 테이블의 관련 객체 이름이다.
    dep_int_name새 테이블의 관련 객체 이름이다.
  • 예제

    CREATE TABLE T1 (A NUMBER PRIMARY KEY, B NUMBER);
    CREATE INDEX I1 ON T1(B);
    CREATE TABLE INT_T1 (A NUMBER, B NUMBER);
    CREATE INDEX INT_I1 ON INT_T1(B);
    
    BEGIN
        DBMS_REDEFINITION.START_REDEF_TABLE('TIBERO', 'T1', 'INT_T1',
           'A A, B B'); 
    END; 
    /
    
    BEGIN
        DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT('TIBERO', 'T1', 'INT_T1',
               DBMS_REDEFINITION.CONS_INDEX, 'TIBERO', 'I1', 'INT_I1');
    END;
    /

19.2.6. START_REDEF_TABLE

온라인 테이블 재정의를 시작하는 프러시저이다. 이 프러시저에 원본 테이블과 새 테이블의 이름 그리고 컬럼 대응 정보를 지정하면, 원본 테이블의 데이터를 새 테이블에 옮기기 시작한다.

여기서 새 테이블은 이 프러시저를 실행하기 전에 미리 생성해야 하며, 원본 테이블과 같은 스키마에 존재해야 한다. 단, 파티셔닝, 인덱스, 제약조건, 트리거와 같은 테이블의 구조와 관련된 객체는 원본 테이블과 같지 않아도 된다.

참고

컬럼 대응 정보는 원본 테이블의 어떤 컬럼을 새 테이블의 어떤 컬럼에 저장할지를 지정하는 것을 말한다.

START_REDEF_TABLE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE START_REDEF_TABLE 
    ( 
        uname IN VARCHAR2,
        orig_table IN VARCHAR2,
        int_table IN VARCHAR2,
        col_mapping IN VARCHAR2 DEFAULT NULL, 
        options_flag IN BINARY_INTEGER DEFAULT cons_use_pk 
    );
  • 파라미터

    파라미터설명
    uname원본 테이블과 새 테이블이 속한 스키마의 이름이다.
    orig_table원본 테이블의 이름이다.
    int_table새 테이블의 이름이다.
    col_mapping원본 테이블과 새 테이블의 컬럼 대응 정보이다.
    options_flag

    원본 테이블에서 새 테이블로 데이터를 옮길 때 어떤 정보를 사용할 것인지를 지정한다.

    • cons_use_pk: 기본 키의 정보를 사용한다. (지정하지 않을 경우 기본값)

    • cons_use_rowid: ROWID를 사용한다.

  • 예제

    create table ORIG_TABLE ( 
       PRODUCT_ID NUMBER primary key,
       PRODUCT_NAME VARCHAR2(20), 
       PRICE NUMBER, 
       SOLD_DATE DATE );
    
    insert into ORIG_TABLE values (1, 'Tibero', 10000, SYSDATE);
    
    commit;
    create table INT_TABLE ( 
       ID NUMBER primary key, 
       NAME VARCHAR2(30), 
       PRICE NUMBER(8,2), 
       SOLD_DATE DATE )
    partition by range (SOLD_DATE) 
    ( 
       partition P_2008 values less than ('2009-01-01'), 
       partition P_2009 values less than (maxvalue)
    );
          
    BEGIN 
       DBMS_REDEFINITION.START_REDEF_TABLE('TIBERO', 'ORIG_TABLE',
       'INT_TABLE', 'PRODUCT_ID ID, PRODUCT_NAME NAME, PRICE PRICE, 
        SOLD_DATE SOLD_DATE');
    END; 
    /

19.2.7. SYNC_INTERIM_TABLE

원본 테이블과 새 테이블의 데이터를 동기화하는 프러시저이다. 물론 FINISH_REDEF_TABLE 프러시저를 실행해도 동기화가 되지만, 온라인 테이블을 재정의하는 중에 해당 테이블에 DML 문장이 많이 수행되는 경우라면 변경된 데이터를 한꺼번에 반영해야 하므로 처리 속도가 늦어질 수 있다. 또한, 재정의를 종료하는 동안에도 해당 테이블에 트랜잭션이 없어야 하기 때문에 DML 문장의 수행이 제한된다.

SYNC_INTERIM_TABLE 프러시저는 이러한 경우와는 다르게 재정의 중에도 동기화를 수행할 수 있으며, 재정의를 종료하는 시간을 줄일 수 있다.

SYNC_INTERIM_TABLE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE SYNC_INTERIM_TABLE 
    ( 
        uname IN VARCHAR2, 
        orig_table IN VARCHAR2,
        int_table IN VARCHAR2 
    );
  • 파라미터

    파라미터설명
    uname원본 테이블과 새 테이블이 속한 스키마의 이름이다.
    orig_table원본 테이블의 이름이다.
    int_table새 테이블의 이름이다.
  • 예제

    BEGIN
    	DBMS_REDEFINITION.SYNC_INTERIM_TABLE('TIBERO', 'ORIG_TABLE', 'INT_TABLE');
    END; /

19.2.8. UNREGISTER_DEPENDENT_OBJECT

원본 테이블과 새 테이블 사이에 매핑되어 있는 관련 객체들의 정보를 해제한다.

UNREGISTER_DEPENDENT_OBJECT 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE UNREGISTER_DEPENDENT_OBJECT 
    (
        uname IN VARCHAR2, 
        orig_table IN VARCHAR2, 
        int_table IN VARCHAR2,
        dep_type IN PLS_INTEGER,
        dep_owner IN VARCHAR2,
        dep_orig_name IN VARCHAR2,
        dep_int_name IN VARCHAR2 
    );
  • 파라미터

    파라미터설명
    uname원본 테이블과 새 테이블이 속한 스키마의 이름이다.
    orig_table원본 테이블의 이름이다.
    int_table새 테이블의 이름이다.
    dep_type관련 객체의 타입이다.
    dep_owner관련 객체를 소유한 사용자 이름이다.
    dep_orig_name원본 테이블의 관련 객체 이름이다.
    dep_int_name새 테이블의 관련 객체 이름이다.
  • 예제

    CREATE TABLE T1 (A NUMBER PRIMARY KEY, B NUMBER);
    CREATE INDEX I1 ON T1(B);
    CREATE TABLE INT_T1 (A NUMBER, B NUMBER);
    CREATE INDEX INT_I1 ON INT_T1(B);
    
    BEGIN
       DBMS_REDEFINITION.START_REDEF_TABLE('TIBERO', 'T1', 'INT_T1',
         'A A, B B'); 
    END; 
    /
    
    BEGIN
       DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT('TIBERO', 'T1', 'INT_T1',
          DBMS_REDEFINITION.CONS_INDEX,
          'TIBERO', 'I1', 'INT_I1');
    END;
    /
    
    BEGIN
       DBMS_REDEFINITION.UNREGISTER_DEPENDENT_OBJECT('TIBERO', 'T1', 'INT_T1',
       DBMS_REDEFINITION.CONS_INDEX,
         'TIBERO', 'I1', 'INT_I1');
    END;
    /