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