TECH
QUESTION
자주하는 질문답변 입니다.
Oracle
작성자 | 유건데이타 | 등록일 | 2015-05-16 |
제목 | DBMS_REDEFINITION (COLUMN RENAME) | ||
---|---|---|---|
(9i) DBMS_REDEFINITION (COLUMN RENAME)
====================================== PURPOSE -------- Table을 online상으로 reorganization할 수 있는 있는 DBMS_REDEFINITION package가 Oracle9i에서 소개되었다. 이 package을 이용하면 column rename이나 table상의 column의 위치를 바꾸고자 할때 유용하다. Explanation ------------ 1. DBMS_REDEFINITION DBMS_REDEFINITION을 가지고 table의 reorganization을 online상에서 수행할 수 있다. 이 online reorganization을 수행하기 위해서는 materialized view가 사용되어진다. Snapshot log가 master table에 define되어지며 이 log가 online reorganization이 수행되는 동안에 master table에 변화된 내용을 반 영할수 있게 해준다. < 제약사항 > - Online reorganization을 수행하기 위해서는 primary key을 반드시 가져야 한다. - Materialized view와 materialized view log가 define되어 있는 table은 online reorganization을 수행할 수 없다. - IOT table의 overflow table에 대해서는 Online reorganization을 수행할 수 없다. 지금부터는 DBMS_REDEFINITION Package의 각각의 Subprogram에 대해 알아보자. 1) CAN_REDEF_TABLE Procedure: 주어진 table이 online reorganization을 할 수 있는지 없는지를 결정하는 procedure이다. Online reorganization 작업의 첫번째 순서가 된다. 만약 table이 online redefinition에 적합하지 않다면 예제에서도 다루지만 'ORA-12089' error message를 낸다. DBMS_REDEFINITION.can_redef_table ( uname IN VARCHAR2, tname IN VARCHAR2); CAN_REDEF_TABLE Procedure Parameters: Parameter Description --------- ------------ uname table의 schema(user) name. tname reorganization할 table의 name. 2) START_REDEF_TABLE Procedure: Reorganization 작업을 초기화하는 procedure이다. Online reorganization을 할 수 있는지를 알아본 이후에 희망하는 reorganization 이후의 모습을 가진 빈 공간의 임시 table을 생성한다. DBMS_REDEFINITION.start_redef_table ( uname IN VARCHAR2, orig_table IN VARCHAR2, int_table IN VARCHAR2, col_mapping IN VARCHAR2 := NULL); START_REDEF_TABLE Procedure Parameters: Parameter Description ---------- ------------ uname table의 schema(user) name. orig_table reorganization할 table의 name. int_table 임시 table의 이름. col_mapping 임시 table과 Original table과의 mapping정보 (Select 절에서의 column list와 비슷하다) 만약 NULL이면 original table의 전체 column이 선택된 것이 되며 reorganization이후에도 같은 column 이름을 가지게 된다. 3) FINISH_REDEF_TABLE Procedure: Reorganization 작업을 완성하는 procedure이다. 필요하다면 이 순서전에 새로운 index, trigger, grant, constraint등을 임시 table에 생성한다. Referential constraint는 임시 table이 disable된 이후에 포함한다. 이 작업이 완성될때까지는 orginal table에 일시적으로 lock이 걸리게 된다. DBMS_REDEFINITION.finish_redef_table ( uname IN VARCHAR2, orig_table IN VARCHAR2, int_table IN VARCHAR2); FINISH_REDEF_TABLE Procedure Parameters: Parameter Description --------- ------------ uname table의 schema(user) name. orig_table reorganization할 table의 name. int_table 임시 table의 이름. 4) SYNC_INTERIM_TABLE Procedure: Original table과 임시 table을 동기화시키는 procedure이다. 즉 Online reorganization 작업중에 변경된 사항을 맞춰주는 작업이다. DBMS_REDEFINITION.sync_interim_table ( uname IN VARCHAR2, orig_table IN VARCHAR2, int_table IN VARCHAR2); SYNC_INTERIM_TABLE Procedure Parameters: Parameters Description ---------- ------------ uname table의 schema(user) name. orig_table reorganization할 table의 name. int_table 임시 table의 이름. 5) ABORT_REDEF_TABLE Procedure: Reorganization 작업중에 error가 난 경우에 멈추기 위한 procedure이다. 이 procedure는 어느때나 호출할 수 있다. DBMS_REDEFINITION.abort_redef_table ( uname IN VARCHAR2, orig_table IN VARCHAR2, int_table IN VARCHAR2); ABORT_REDEF_TABLE Procedure Parameters: Parameters Description ---------- ------------ uname table의 schema(user) name. orig_table reorganization할 table의 name. int_table 임시 table의 이름. Example -------- 아래의 emp table은 아무런 constraint을 가지고 있지 않다고 가정한다. 예로 JOB 이라는 column name을 DESIGNATION 으로 바꾸고 EMPNO에 의해 partition 되도록 바꾸고자 한다. SQL> desc emp Name Null? Type ----------------------------------------- -------- ------ EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) 1. SCOTT user에게 DBMS_REDEFINITION을 실행할수 있도록 권한을 부여한다. SQL> connect sys/manager as sysdba Connected. SQL> grant execute on dbms_redefinition to scott; Grant succeeded. 2. Dbms_redefinition.can_redef_table procedure을 이용하여 redefine가능한지 결정한다. SQL> connect scott/tiger Connected. SQL> exec dbms_redefinition.can_redef_table('SCOTT', 'EMP'); BEGIN dbms_redefinition.can_redef_table('SCOTT', 'EMP'); END; * ERROR at line 1: ORA-12089: cannot online redefine table "SCOTT"."EMP" with no primary key ORA-06512: at "SYS.DBMS_REDEFINITION", line 8 ORA-06512: at "SYS.DBMS_REDEFINITION", line 236 ORA-06512: at line 1 primary key가 없다면 위와 같은 error가 발생하며 가능하다면 primary key을 가지도록 수정한다. 왜냐하면 이 online reorganization동안에 생성되는 Materialized view 와 log가 primary key가 꼭 있어야 하기 때문이다. SQL> alter table emp add constraint emp_pk primary key (empno); Table altered. SQL> exec dbms_redefinition.can_redef_table('SCOTT', 'EMP'); PL/SQL procedure successfully completed. 3. 원하는 성격을 지닌 임시 table을 생성한다. 예로 JOB 이라는 column name을 DESIGNATION 으로 바꾸고 EMPNO에 의해 partition 되도록 바꾸고자 한다. SQL> create table int_emp (empno number primary key, ename varchar2(10), designation varchar2(9), mgr number(4), hiredate date, sal number(7,2), comm number(7,2), deptno number(2) ) Partition By Range (empno) (partition emp_part1 values less than (2000), partition emp_part2 values less than (maxvalue) ); Table created. 4. Redefinition을 시작한다. SQL> exec dbms_redefinition.start_redef_table('SCOTT','EMP','INT_EMP', - 'EMPNO EMPNO, ENAME ENAME, JOB DESIGNATION, MGR MGR, HIREDATE HIREDATE, - SAL SAL,COMM COMM,DEPTNO DEPTNO'); PL/SQL procedure successfully completed. 5. Online reorganization 작업중에 변경된 사항을 맞춰주기 위해 sync_interim_table procedure을 호출한다. 이 작업을 함으로써 finish_redef_table시에 동기화를 맞춰주는 양을 줄일 수 있다. SQL> exec dbms_redefinition.sync_interim_table('SCOTT','EMP','INT_EMP'); PL/SQL procedure successfully completed. 6. 임시 table을 query하여 data가 잘 들어 왔는지 확인하고 finish하도록 한다. SQL> select * from int_emp; SQL> exec dbms_redefinition.finish_redef_table('SCOTT','EMP','INT_EMP'); PL/SQL procedure successfully completed. 이 procedure을 call하고 나면 original table과 임시 table이 바뀌는 것을 볼수 있다. 즉 원하는 형태로 바뀌는 최종 단계이다 SQL> desc emp Name Null? Type ----------------------------------------- -------- ------------------ EMPNO NOT NULL NUMBER ENAME VARCHAR2(10) DESIGNATION <-- 요기 column rename 완료 VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) SQL> desc int_emp Name Null? Type ----------------------------------------- -------- ------------------ EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) 위와 같이 emp table이 원하는 형태로 바뀐 것을 볼 수 있다. 7. 그러면 이제는 임시 table인 int_emp table을 drop해도 무방하다. 항상 data가 제대로 다 옮겨졌는지를 확인하고 drop한다. SQL> drop table int_emp; Table dropped. RELATED DOCUMENTS ----------------- Note:149564.1 Note.157084.1 Oracle9i Database Administrator's Guide Part Number A90117-01 Oracle9i Supplied PL/SQL Packages and Types Reference Part Number A89852-02 |
Comment | |||
---|---|---|---|
등록된 코멘트가 없습니다. |