溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

oracle 11g在線重定義 普通表變分區表

發布時間:2020-06-28 23:21:27 來源:網絡 閱讀:1169 作者:emperor_majesty 欄目:關系型數據庫

第一種方法

    使用主鍵id進行重定義


--create user test identified by 1 account unlock; 

--grant resource 

--grant create any table, alter any table, drop any table, lock any table, select any table to test; 

--<1> 創建測試表,以下使用在線重定義把表轉換為分區表,created為分區鍵, object_id 為主鍵

drop table test01 purge;

create table test01 as select * from dba_objects where object_id is not null;

alter table test01 add primary key(object_id); 

select * from test01;


--<2> 創建分區表

create table test01_new 

partition by range(created)

--INTERVAL(NUMTOYMINTERVAL(1,'month'))

interval(numtodsinterval(1,'day'))

store in (users)

(

  partition p0 values less than (to_date('2008-01-01','yyyy-mm-dd') )

as select * from test01 where created is not null and 1!=1;

alter table test01_new add primary key(object_id); 


--判斷目標表是否可以使用主鍵進行在線重定義,也可以使用rowid

exec dbms_redefinition.can_redef_table('TEST', 'TEST01', dbms_redefinition.cons_use_pk);


--把用戶test的test01表的定義改為test01_new表的定義

exec dbms_redefinition.start_redef_table('TEST', 'TEST01', 'TEST01_NEW');


--將中間表與原始表同步。(僅當要對表 TEST01 進行更新時才需要執行該操作。)

exec dbms_redefinition.sync_interim_table('TEST', 'TEST01', 'TEST01_NEW');


--結束重定義表

exec dbms_redefinition.finish_redef_table('TEST', 'TEST01', 'TEST01_NEW');


--如果重定義失敗,解鎖

exec dbms_redefinition.abort_redef_table('TEST', 'TEST01', 'TEST01_NEW');



--優點:

--保證數據的一致性,在大部分時間內,表T都可以正常進行DML操作。

--只在切換的瞬間鎖表,具有很高的可用性。這種方法具有很強的靈活性,對各種不同的需要都能滿足。

--而且,可以在切換前進行相應的授權并建立各種約束,可以做到切換完成后不再需要任何額外的管理操作。

--

--不足:實現上比上面兩種略顯復雜,適用于各種情況。

--然而,在線表格重定義也不是完美無缺的。下面列出了Oracle9i重定義過程的部分限制:

--你必須有足以維護兩份表格拷貝的空間。   

--你不能更改主鍵欄。   

--表格必須有主鍵。   

--必須在同一個大綱中進行表格重定義。   

--在重定義操作完成之前,你不能對新加欄加以NOT NULL約束。   

--表格不能包含LONG、BFILE以及用戶類型(UDT)。   

--不能重定義鏈表(clustered tables)。   

--不能在SYS和SYSTEM大綱中重定義表格。   

--不能用具體化視圖日志(materialized VIEW logs)來重定義表格;不能重定義含有具體化視圖的表格。   

--不能在重定義過程中進行橫向分集(horizontal subsetting)



第二種方法

使用rowid進行重定義,一般在沒有主鍵的情況下使用


--其他如上

--判斷目標表是否可以使用主鍵進行在線重定義,也可以使用rowid

exec dbms_redefinition.can_redef_table('TEST', 'TEST01', dbms_redefinition.cons_use_rowid);


--把用戶test的test01表的定義改為test01_new表的定義

exec dbms_redefinition.start_redef_table('TEST', 'TEST01', 'TEST01_NEW',null,2);


--將中間表與原始表同步。(僅當要對表 TEST01 進行更新時才需要執行該操作。)

exec dbms_redefinition.sync_interim_table('TEST', 'TEST01', 'TEST01_NEW');


--結束重定義表

exec dbms_redefinition.finish_redef_table('TEST', 'TEST01', 'TEST01_NEW');


--如果重定義失敗,解鎖

exec dbms_redefinition.abort_redef_table('TEST', 'TEST01', 'TEST01_NEW');


第三種方法

--<3>重命名表

alter table test01  rename to test01_bak;

alter table test01_bak rename to test01 ;


--<4>檢查是否缺漏數據,補齊數據

select * from test01 t1

where up_time is not null --索引鍵不能有空數據,否則插入失敗

  and not exists (select 1 from test01  t2 where t1.id = t2.id )


insert into test01 

select * from test01_bak  t1

where up_time is not null --索引鍵不能有空數據,否則插入失敗

  and not exists (select 1 from test01  t2 where t1.id = t2.id )


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女