Oracle database 11g 重定義表

Oracle11g 的聯機重定義功能

聯機條件下把普通的堆錶轉換成分區表(11g新特性)

例:聯機創建分區表:將emp表聯機重定義、要求完成兩個任務、使其按照 sal分區(以2500爲界)、並去掉comm列、這個過程需要建立一個臨時分區表emp_temp完成複製轉換、

sys下執行

create table scott.emp as select * from scott.emp;

alter table scott.emp add constraint pk_emp primary key(empno);

1) 檢查原始表是否具有在線重定義資格、(要求表自包含及之前沒有建立實體化視圖及日誌)

SQL>BEGIN
      DBMS_REDEFINITION.CAN_REDEF_TABLE('scott','emp');
    END;
    /

2) 創建一個臨時分區表:emp_temp, 含有7列(刪去comm列)、然後range分區、兩個區以sal=2500爲界、

SQL>
CREATE TABLE scott.emp_temp
  (empno        number(4) not null,
   ename        varchar2(10),
   job          varchar2(9),
   mgr          number(4),
   hiredate     date,
   sal          number(7,2),
   deptno       number(2))
PARTITION BY RANGE(sal)
   (PARTITION sal_low VALUES LESS THAN(2500),
   PARTITION sal_high VALUES LESS THAN (maxvalue));

3)啓動聯機重定義處理過程、

SQL>
BEGIN
  dbms_redefinition.start_redef_table('scott','emp','emp_temp',
   'empno empno,
   ename ename,
   job job,
   mgr mgr,
   hiredate hiredate,
   sal sal,
   deptno deptno');
END;
/
SQL> select count(*) from scott.emp_temp;

  COUNT(*)
----------
        14
SQL> select * from scott.emp_temp partition(sal_low);

     EMPNO ENAME      JOB              MGR  HIREDATE                        SAL     DEPTNO
---------- ---------- --------- ---------- ------ -------------   ----------------  -------                     
      7369 SMITH      CLERK                7902 1980-12-17 00:00:00        800         20
      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        30
      7521 WARD      SALESMAN        7698 1981-02-22 00:00:00       1250        30
      7654 MARTIN   SALESMAN        7698 1981-09-28 00:00:00       1250        30
      7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450        10
      7844 TURNER   SALESMAN        7698 1981-09-08 00:00:00       1500        30
      7876 ADAMS    CLERK                7788 1987-05-23 00:00:00       1100        20
      7900 JAMES      CLERK                7698 1981-12-03 00:00:00        950         30
      7934 MILLER     CLERK                7782 1982-01-23 00:00:00       1300        10

已選擇9行。

SQL> select * from scott.emp_temp partition(sal_high);

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ----------
      7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975         20
      7698 BLAKE      MANAGER         7839 1981-05-01 00:00:00       2850         30
      7788 SCOTT      ANALYST           7566 1987-04-19 00:00:00       3000         20
      7839 KING        PRESIDENT                 1981-11-17 00:00:00       5000         10
      7902 FORD       ANALYST           7566 1981-12-03 00:00:00       3000         20

已選擇5行。

這個時候emp_temp的主鍵、索引、觸發器、授權等還沒有從原始表繼承過來、

SQL> select constraint_name,constraint_type,table_name from user_constraints where table_name like 'emp%';

CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME
------------------------------ --------------- ------------------------------
PK_emp                          P                emp
SYS_C009652                    C               emp_TEMP

4) 複製依賴對象、

這一步的作用是:臨時分區表emp_temp繼承原始表emp的全部屬性、包括索引、約束和授權以及觸發器、

SQL>
DECLARE
  num_errors PLS_INTEGER;
BEGIN
  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('scott','emp','emp_temp',
  DBMS_REDEFINITION.CONS_ORIG_PARAMS,TRUE,TRUE,TRUE,TRUE,num_errors);
END;
/

SQL> select constraint_name,constraint_type,table_name from user_constraints where table_name like 'emp%';

CONSTRAINT_NAME                CONSTRAINT_TYPE      TABLE_NAME
--------------------------- --------------- ----------------------
PK_emp                            P                 emp
SYS_C009652                       C                 emp_TEMP
TMP$$_PK_emp0                     P                   emp_TEMP

這時候原始表emp還沒有分區,

SQL> select table_name,partition_name,high_value from user_tab_partitions;

TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ ----------------------
emp_TEMP                      SAL_HIGH                                MAXVALUE
emp_TEMP                      SAL_LOW                                 2500

5) 完成重定義過程。(相當於原始表emp與臨時分區表emp_temp互換名稱。)

SQL> EXECUTE dbms_redefinition.finish_redef_table('scott','emp','emp_temp');

SQL> select table_name,partition_name,high_value from user_tab_partitions;

TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ ---------------------------
emp                           SAL_HIGH                       MAXVALUE
emp                           SAL_LOW                        2500
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章