在oracle9i出現(xiàn)之前,你只能通過導(dǎo)出和導(dǎo)入的方式來進(jìn)行表格重定義,因此表格重定義的過程是一個(gè)離線過程。甚至在線變化(“alter table add new_col number(3)”)也會導(dǎo)致獨(dú)占性死鎖(exclusive locks),這就需要在ddl完成之前防止所有dml(插入、更新)的運(yùn)行。
為了解決這個(gè)問題,oracle9i在其dbms_redefinition軟件包中引入了在線表格重定義功能。有了dbms_redefinition軟件包,你就可以:
1.拷貝表格(用ctas)
2.創(chuàng)建表格的快照(snapshot)
3.把重定義表格的過程中所發(fā)生的變化進(jìn)行排隊(duì)
4.并用變化隊(duì)列來同步重定義后的表格。
這個(gè)特性對24/7oracle數(shù)據(jù)庫來說非常重要,這是由于dba現(xiàn)在可以在保持表格的可更新性的同時(shí)重新組織表格的結(jié)構(gòu)。
我們以下面的腳本為例來說明重新組織表格結(jié)構(gòu)的完整過程。
exec dbms_redefinition.abort_redef_table('pubs','titles','titles2');
alter table titles add constraint pk_titles primary key (title_id);
exec dbms_redefinition.can_redef_table('pubs','titles');
create table titles2
as
select * from titles;
exec dbms_redefinition.start_redef_table('pubs','titles','titles2','title_id title_id,title title,type type,pub_id pub_id,price price,advance advance,royalty*1.1 royalty,ytd_sales ytd_sales,notes notes,pubdate pubdate');
exec dbms_redefinition.sync_interim_table('pubs','titles','titles2');
exec dbms_redefinition.finish_redef_table('pubs','titles','titles2');
drop table titles2;
如果重組織失敗,那么你就必須采取特殊的步驟來讓它重新開始。由于重定義過程需要?jiǎng)?chuàng)建表格的快照,因此為了重新開始這一過程,你必須調(diào)用dbms_redefinition.abort_redef_table來釋放快照。
dbms_redefinition.abort_redef_table過程有三個(gè)參數(shù),即大綱(schema)、原始表格(original table name)名稱以及持有表格名稱(holding table name)。它“出棧”并允許你開始重組織表格。
dbms_redefinition.abort_redef_table('pubs','titles','titles2');
然而,在線表格重定義也不是完美無缺的。下面列出了oracle9i重定義過程的部分限制。
你必須有足以維護(hù)兩份表格拷貝的空間。
你不能更改主鍵欄。
表格必須有主鍵。
必須在同一個(gè)大綱中進(jìn)行表格重定義。
在重定義操作完成之前,你不能對新加欄加以not null約束。
表格不能包含long、bfile以及用戶類型(udt)。
不能重定義鏈表(clustered tables)。
不能在sys和system大綱中重定義表格。
不能用具體化視圖日志(materialized view logs)來重定義表格;不能重定義含有具體化視圖的表格。
不能在重定義過程中進(jìn)行橫向分集(horizontal subsetting)。
新聞熱點(diǎn)
疑難解答
圖片精選