真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

OracleOnlineRedefinition在線重定義是什么

Oracle Online Redefinition在線重定義是什么,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)成都移動(dòng)機(jī)房托管的網(wǎng)絡(luò)公司,有著豐富的建站經(jīng)驗(yàn)和案例。

面對(duì)越來越多的7*24系統(tǒng),運(yùn)維人員進(jìn)行工作可用的時(shí)間窗口變的越來越小。就在有限的時(shí)間窗口中,硬件檢修、網(wǎng)絡(luò)改造配置占據(jù)了很多時(shí)間。對(duì)數(shù)據(jù)庫對(duì)象進(jìn)行日常維護(hù),越來越成為我們需要關(guān)注的問題。

 

進(jìn)行數(shù)據(jù)重排、表分區(qū)、字段類型修改、字段增改這樣的操作,在開發(fā)和測(cè)試環(huán)境上是比較容易進(jìn)行的。即使數(shù)據(jù)表很大,操作耗時(shí)可能會(huì)很高,我們也能夠通過一些非技術(shù)的手段贏取操作時(shí)間窗。但是對(duì)于投產(chǎn)系統(tǒng)而言,操作過程中的長(zhǎng)時(shí)間鎖定可能是業(yè)務(wù)不能接受的。這個(gè)時(shí)候,就可以考慮Oracle的一些Online操作技術(shù)。

 

在筆者之前的一些文章中,介紹過一些online處理方法,如刪除海量數(shù)據(jù)表,暫時(shí)隱去unused特定數(shù)據(jù)列,11g中默認(rèn)值列優(yōu)化等等。我們介紹Oracle的Online Redefinition(在線重定義)特性。

 

1、 基礎(chǔ)知識(shí)

 

Oracle Online Redefinition可以保證在數(shù)據(jù)表進(jìn)行DDL類型操作,如插入、刪除數(shù)據(jù)列,分區(qū)處理的時(shí)候,還能夠支持DML操作,特別是insert/update/delete操作。

 

對(duì)一般的DDL過程而言,Oracle都會(huì)給數(shù)據(jù)對(duì)象一個(gè)獨(dú)占表鎖。也就是說,在進(jìn)行DDL操作的過程中,我們是不能對(duì)數(shù)據(jù)表進(jìn)行DML(增加、修改和刪除操作)。只有等待DDL結(jié)束,才能夠繼續(xù)操作。

 

也就是說,如果一個(gè)DDL持續(xù)時(shí)間很長(zhǎng),比如數(shù)據(jù)表海量大小,那么在這個(gè)長(zhǎng)時(shí)間中,系統(tǒng)數(shù)據(jù)表其實(shí)是不能對(duì)外提供服務(wù)的。

 

Oracle在線重定義提供了解決問題的途徑。我們?nèi)绻枰獙?duì)一個(gè)數(shù)據(jù)表進(jìn)行重定義,需要定義一個(gè)中間目標(biāo)表Interim。在Interim表中定義好目標(biāo)結(jié)構(gòu),比如期望的存儲(chǔ)、分區(qū)、字段關(guān)系。在線重定義使用的主要是dbms_redefinition包的對(duì)應(yīng)方法。

 

在線重定義最大的特點(diǎn)是,當(dāng)進(jìn)行online操作的時(shí)候,我們還可以對(duì)數(shù)據(jù)表進(jìn)行DML操作。結(jié)束定義過程時(shí),期間進(jìn)行的操作都是可以反饋到目標(biāo)數(shù)據(jù)表中的。

 

目前,Oracle在線重定義支持下列種類的重定義動(dòng)作:

 

ü 插入、刪除數(shù)據(jù)表列和對(duì)一個(gè)存在的數(shù)據(jù)表列改名;

ü 修改字段類型;

ü 消除數(shù)據(jù)表段中的碎片塊;

ü 索引、約束等對(duì)象的重定義;

ü 分區(qū)表轉(zhuǎn)變;

 

下面,我們通過一個(gè)簡(jiǎn)單的例子,去看看如何使用dbms_redefinition包進(jìn)行重定義操作。

 

2、簡(jiǎn)單的重定義例子

 

我們?cè)贠racle 11gR2中進(jìn)行測(cè)試實(shí)驗(yàn)。

 

 

SQL> select * from v$version where rownum<3;

 

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

PL/SQL Release 11.2.0.3.0 – Production

 

 

首先我們創(chuàng)建目標(biāo)數(shù)據(jù)表。

 

 

SQL> create table t as select object_id, object_name, owner from dba_objects;

 

Table created

Executed in 0.328 seconds

 

SQL> select count(*) from t;

 

  COUNT(*)

----------

     75192

 

Executed in 0.047 seconds

 

SQL> alter table t add constraint pk_t_id primary key (object_id);

Table altered

 

 

進(jìn)行在線重定義的第一步,就是判斷目標(biāo)數(shù)據(jù)表是否可以進(jìn)行重定義。此時(shí),可以使用dbms_redefinition包的can_redef_table方法進(jìn)行判斷。

 

 

SQL> exec dbms_redefinition.can_redef_table( 'SCOTT','T',dbms_redefinition.cons_use_pk);

PL/SQL procedure successfully completed

 

Executed in 0.016 seconds

 

 

注意該方法的第三個(gè)參數(shù),使用主鍵還是rowid方法。本質(zhì)上,Online Redefinition是使用物化視圖Materialized View技術(shù)。過程定義記錄就是主鍵和rowid兩種策略。通常而言,我們還是推薦數(shù)據(jù)表有一個(gè)明確主鍵,也就是使用cons_use_pk。如果希望使用rowid,就使用dbms_redefinition.cons_use_rowid。

 

通過了檢查之后,就可以進(jìn)行下一步,定義目標(biāo)數(shù)據(jù)表格式。無論是何種變化,我們需要?jiǎng)?chuàng)建一個(gè)中間表interim,將我們“期望”的數(shù)據(jù)表定義實(shí)現(xiàn)在里面。其中包括表類型、列定義、分區(qū)定義和索引等。但是注意,約束(主外鍵)可以不定義在其中。

 

 

SQL> create table t_interim as select * from dba_objects where 1=0;

Table created

 

Executed in 0.032 seconds

 

 

顯然,我們是希望給數(shù)據(jù)表T增加一些列。

 

此時(shí),我們就可以開始重定義過程。使用dbms_redefinition的start_redef_table方法。

 

 

SQL> exec dbms_redefinition.start_redef_table('SCOTT','T','T_INTERIM',col_mapping => 'object_id object_id, object_name object_name, owner owner',options_flag => dbms_redefinition.cons_use_pk);

 

PL/SQL procedure successfully completed

 

Executed in 0.625 seconds

 

 

此處注意參數(shù)col_mapping,這里以配對(duì)鍵值的方式定義了源數(shù)據(jù)表和中間表在列關(guān)系上的對(duì)應(yīng)關(guān)系。每個(gè)列關(guān)系按照<源列名目標(biāo)列名>的格式進(jìn)行書寫。

 

對(duì)約束的處理,如果有需要轉(zhuǎn)換的約束對(duì)象,我們可以使用copy_table_dependents方法將source數(shù)據(jù)表的約束拷貝到目標(biāo)對(duì)象中。

 

 

SQL> declare

  2    error_count number;

  3  begin

  4    error_count := 0;

  5    dbms_redefinition.copy_table_dependents(uname => 'SCOTT',orig_table => 'T',

  6                                            int_table => 'T_INTERIM',

  7                                            copy_indexes => dbms_redefinition.cons_orig_params,

  8                                            num_errors => error_count);

  9    dbms_output.put_line(to_char(error_count));

 10  end;

 11  /

 

0

 

PL/SQL procedure successfully completed

 

Executed in 4.265 seconds

 

 

這個(gè)方法的參數(shù)很多,定義如下:

 

 

  --  NAME:     copy_table_dependents

  --

  --  INPUTS:  uname             - schema name

  --           orig_table        - name of table to be re-organized

  --           int_table         - name of interim table

  --           copy_indexes      - integer value indicating whether to

  --                               copy indexes

  --                               0 - don't copy

  --                               1 - copy using storage params/tablespace

  --                                   of original index

  --           copy_triggers      - TRUE implies copy triggers, FALSE otherwise

  --           copy_constraints   - TRUE implies copy constraints, FALSE

  --                                otherwise

  --           copy_privileges    - TRUE implies copy privileges, FALSE

  --                                otherwise

  --           ignore errors      - TRUE implies continue after errors, FALSE

  --                                otherwise

  --           num_errors         - number of errors that occurred while

  --                                cloning ddl

  --           copy_statistics    - TRUE implies copy table statistics, FALSE

  --                                otherwise.

  --                                If copy_indexes is 1, copy index

  --                                related statistics, 0 otherwise.

  --           copy_mvlog         - TRUE implies copy table's MV log, FALSE

  --                                otherwise.

  PROCEDURE copy_table_dependents(uname              IN  VARCHAR2,

                                  orig_table         IN  VARCHAR2,

                                  int_table          IN  VARCHAR2,

                                  copy_indexes       IN  PLS_INTEGER := 1,

                                  copy_triggers      IN  BOOLEAN := TRUE,

                                  copy_constraints   IN  BOOLEAN := TRUE,

                                  copy_privileges    IN  BOOLEAN := TRUE,

                                  ignore_errors      IN  BOOLEAN := FALSE,

                                  num_errors         OUT PLS_INTEGER,

                                  copy_statistics    IN  BOOLEAN := FALSE,

                                  copy_mvlog         IN  BOOLEAN := FALSE);

 

 

利用各種copy_xxx參數(shù),我們可以精細(xì)的定義哪些約束依賴關(guān)系會(huì)被拷貝到目標(biāo)表中。

 

當(dāng)結(jié)束之后,我們需要使用finish_redef_table方法結(jié)束定義過程。

 

 

SQL> exec dbms_redefinition.finish_redef_table('SCOTT','T','T_INTERIM');

PL/SQL procedure successfully completed

 

Executed in 1.406 seconds

 

 

最后,我們查看效果。

 

 

SQL> desc t;

Name           Type          Nullable Default Comments

-------------- ------------- -------- ------- --------

OWNER          VARCHAR2(30)  Y                        

OBJECT_NAME    VARCHAR2(128) Y                        

SUBOBJECT_NAME VARCHAR2(30)  Y                         

OBJECT_ID      NUMBER        Y                        

DATA_OBJECT_ID NUMBER        Y                        

OBJECT_TYPE    VARCHAR2(19)  Y                        

CREATED        DATE          Y                        

LAST_DDL_TIME  DATE          Y                        

TIMESTAMP      VARCHAR2(19)  Y                        

STATUS         VARCHAR2(7)   Y                        

TEMPORARY      VARCHAR2(1)   Y                        

GENERATED      VARCHAR2(1)   Y                        

SECONDARY      VARCHAR2(1)   Y                        

NAMESPACE      NUMBER        Y                        

EDITION_NAME   VARCHAR2(30)  Y                        

 

SQL> desc t_interim;

Name        Type          Nullable Default Comments

----------- ------------- -------- ------- --------

OBJECT_ID   NUMBER                                 

OBJECT_NAME VARCHAR2(128) Y                        

OWNER       VARCHAR2(30)  Y                        

 

SQL> select count(*) from t;

 

  COUNT(*)

----------

     75192

 

 

數(shù)據(jù)表T的字段被添加上,而中間表的結(jié)構(gòu)被設(shè)置為原來的樣子。約束內(nèi)容,也就是原來的主鍵也被保留下來。

 

 

--在dbms_metadata.getddl輸出片段

         "EDITION_NAME" VARCHAR2(30),

          CONSTRAINT "PK_T_ID" PRIMARY KEY ("OBJECT_ID")

 

 

至此,我們完成了一個(gè)最簡(jiǎn)單的重定義過程。大致分為五個(gè)步驟:

 

ü 判斷數(shù)據(jù)表是否可以支持重定義,定義中間表Interim結(jié)構(gòu);

ü 使用dbms_redefinition的start_redef_table方法開始重定義過程;

ü 拷貝約束、重定義register約束信息內(nèi)容;

ü 同步online過程中的DML操作(Optional,在之后例子演示);

ü 結(jié)束過程finish_redef_table操作;

 

對(duì)在線重定義,其中的細(xì)節(jié)過程,例如實(shí)現(xiàn)方式、中間DML操作同步、鎖機(jī)制和各種方法的功能原理,我們?cè)谙旅胬^續(xù)進(jìn)行討論。

 

關(guān)于Oracle Online Redefinition在線重定義是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


網(wǎng)站欄目:OracleOnlineRedefinition在線重定義是什么
瀏覽路徑:http://weahome.cn/article/phosji.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部