제25장 DBMS_REDEFINITION

내용 목차

25.1. 개요
25.2. 프러시저
25.2.1. ABORT_REDEF_TABLE
25.2.2. CAN_REDEF_TABLE
25.2.3. COPY_TABLE_DEPENDENTS
25.2.4. FINISH_REDEF_TABLE
25.2.5. REGISTER_DEPENDENT_OBJECT
25.2.6. START_REDEF_TABLE
25.2.7. SYNC_INTERIM_TABLE
25.2.8. UNREGISTER_DEPENDENT_OBJECT

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

DBMS_REDEFINITION은 온라인 상태에서 특정 테이블을 재정의하기 위한 프러시저를 제공하는 패키지이다.

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

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

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

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;
    /

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

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

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; 
    /