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

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

OracleOnlineRedefinition在線重定義的示例分析

這篇文章將為大家詳細(xì)講解有關(guān)Oracle Online Redefinition在線重定義的示例分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

讓客戶(hù)滿意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、網(wǎng)絡(luò)空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、懷遠(yuǎn)網(wǎng)站維護(hù)、網(wǎng)站推廣。

我們從一個(gè)較復(fù)雜的案例出發(fā),討論復(fù)雜變化情況下如何進(jìn)行Online Redefinition,以及dbms_redefinition包各個(gè)關(guān)鍵方法的作用。

一個(gè)分區(qū)表的重定義動(dòng)作

我們定義一個(gè)數(shù)據(jù)表T。

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

Table created

SQL> desc t;

Name        Type          Nullable Default Comments

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

OBJECT_ID   NUMBER        Y                        

OBJECT_NAME VARCHAR2(128) Y                        

CREATED     DATE          Y                        

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

Table altered

SQL> select count(*) from t;

  COUNT(*)

----------

     75192

期望的重定義目標(biāo)有幾個(gè):首先使用object_id進(jìn)行分區(qū)、created字段從date類(lèi)型變?yōu)閠imestamp類(lèi)型。另外object_name字段改名為object_name_2。中間定義表如下:

(分區(qū),created變類(lèi)型,object_name字段改名)

SQL> create table t_interim

  2  (object_id number,

  3   object_name_2 varchar2(128),

  4   created timestamp

  5  )

  6  partition by range(object_id)

  7  (

  8     partition p1 values less than (10000),

  9     partition p2 values less than (50000),

 10     partition p3 values less than (maxvalue)

 11  )

 12  ;

Table created

首先,判斷是否可以進(jìn)行重定義操作。

SQL> set serveroutput on;

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

PL/SQL procedure successfully completed

啟動(dòng)重定義動(dòng)作。

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

PL/SQL procedure successfully completed

SQL> set timing on;

注意這個(gè)col_mapping映射關(guān)系設(shè)置,如果存在列名轉(zhuǎn)換,就在這里將列關(guān)系映射說(shuō)明出來(lái)。如果需要進(jìn)行字段類(lèi)型轉(zhuǎn)換,要書(shū)寫(xiě)函數(shù)關(guān)系將映射計(jì)算規(guī)則定義出來(lái)。

Oracle在線重定義的基礎(chǔ)是物化視圖技術(shù)。此時(shí),我們檢查試圖user_mviews,可以看到有一個(gè)新的物化視圖生成,并且存在對(duì)應(yīng)的物化視圖日志。

SQL> col query for a20;

SQL> select mview_name, container_name, query, REFRESH_METHOD from user_mviews;

MVIEW_NAME CONTAINER_NAME       QUERY                REFRESH_METHOD

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

T_INTERIM  T_INTERIM            select object_id obj         FAST

                                ect_id, object_name 

                                object_name_2, to_ti

                                mestamp(created) cre

                                ated from "SCOTT"."T

                                "   "T"             

Executed in 0.031 seconds

SQL> select master, log_table from user_mview_logs;

MASTER                         LOG_TABLE

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

T                              MLOG$_T

Executed in 0.016 seconds

Start方法創(chuàng)建了一個(gè)Fast刷新模式的物化視圖對(duì)象t_interim。物化視圖中最重要的物化視圖日志,名稱(chēng)為MLOG$_T。

此時(shí),數(shù)據(jù)表數(shù)據(jù)情況如下。

--源數(shù)據(jù)表和中間數(shù)據(jù)表已經(jīng)實(shí)現(xiàn)同步

SQL> select count(*) from t;

  COUNT(*)

----------

     75192

Executed in 0.016 seconds

SQL> select count(*) from t_interim;

  COUNT(*)

----------

     75192

Executed in 0.031 seconds

--沒(méi)有DML語(yǔ)句過(guò)程,物化視圖日志尚空

SQL> select count(*) from mlog$_t;

  COUNT(*)

----------

         0

Executed in 0.015 seconds

綜合上述內(nèi)容,說(shuō)明start_redef_table的作用是下面幾個(gè)方面:

ü  以Interim數(shù)據(jù)表為名稱(chēng),創(chuàng)建一個(gè)Fast刷新模式的物化視圖對(duì)象;

ü  從源數(shù)據(jù)表中將數(shù)據(jù)加載到Interim中;

ü  創(chuàng)建物化視圖日志;

如果在這個(gè)過(guò)程中,發(fā)生DML操作,也就是說(shuō)在start過(guò)程和之后有DML操作,有新數(shù)據(jù)插入到其中。

SQL> select max(object_id) from t;

MAX(OBJECT_ID)

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

         76847

Executed in 0 seconds

SQL> insert into t select object_id+76847, object_name, created from dba_objects;

75199 rows inserted

Executed in 7.297 seconds

SQL> select count(*) from t;

  COUNT(*)

----------

    150391

Executed in 0.016 seconds

中間表的數(shù)據(jù)內(nèi)容保持不變,并且物化視圖日志積累了需要刷新的數(shù)據(jù)條目。

SQL> select count(*) from t_interim;

  COUNT(*)

----------

     75192

Executed in 0.016 seconds

SQL> select count(*) from mlog$_t;

  COUNT(*)

----------

     75199

Executed in 0.016 seconds

此時(shí)存在數(shù)據(jù)的不一致和不統(tǒng)一。Oracle推薦要求使用sysnc_interim_table方法將重定義過(guò)程中出現(xiàn)的變化數(shù)據(jù)刷新。

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

PL/SQL procedure successfully completed

Executed in 195.937 seconds

刷新7萬(wàn)左右數(shù)據(jù),使用了超過(guò)三分鐘時(shí)間。在這個(gè)過(guò)程中,我們可以看到刷新物化視圖過(guò)程。

SQL> select * from v$mvrefresh;

       SID    SERIAL# CURRMVOWNER                     CURRMVNAME

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

        47         13 SCOTT                           T_INTERIM

刷新開(kāi)始和結(jié)束過(guò)程,我們可以看到物化視圖刷新過(guò)程中的時(shí)間變化。

SQL> select name, LAST_REFRESH from user_mview_refresh_times;

NAME       LAST_REFRESH

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

T_INTERIM  2013-9-10 9:07:01

SQL> select name, LAST_REFRESH from user_mview_refresh_times;

NAME       LAST_REFRESH

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

T_INTERIM  2013-9-10 9:15:28

結(jié)束后,我們發(fā)現(xiàn)interim表和mlog$_t日志表數(shù)據(jù)的變化。

SQL> select count(*) from t_interim;

  COUNT(*)

----------

    150391

Executed in 0.016 seconds

--無(wú)變化數(shù)據(jù)需要刷新了

SQL> select count(*) from mlog$_t;

  COUNT(*)

----------

         0

Executed in 0.016 seconds

綜合上面的實(shí)驗(yàn),我們知道方法sync_interim_table的實(shí)質(zhì)是進(jìn)行一次物化視圖快速刷新。這個(gè)方法持續(xù)的時(shí)間根據(jù)不同數(shù)據(jù)量和物化視圖刷新算法來(lái)決定,這個(gè)過(guò)程中,并不會(huì)引起很多鎖定動(dòng)作。而且,在在線重定義過(guò)程中,這個(gè)方法是可以重復(fù)執(zhí)行多次的。

下面,需要將原有數(shù)據(jù)表中的約束關(guān)系刷新到目標(biāo)結(jié)構(gòu)上。

SQL> set serveroutput on;

SQL> declare

  2    error_count number:=0;

  3  begin

  4    dbms_redefinition.copy_table_dependents(uname => 'SCOTT',orig_table => 'T',int_table => 'T_INTERIM',

  5                                            copy_indexes => dbms_redefinition.cons_orig_params,

  6                                            num_errors => error_count);

  7    dbms_output.put_line(to_char(error_count));

  8  end;

  9  /

0

PL/SQL procedure successfully completed

Finish過(guò)程主要完成六個(gè)步驟操作:

ü  執(zhí)行sysnc_interim_table命令,將中間表數(shù)據(jù)盡可能靠近源數(shù)據(jù)表;

ü  鎖定源數(shù)據(jù)表T,使之后不能有任何變化發(fā)生在這個(gè)數(shù)據(jù)表上;

ü  再次執(zhí)行sysnc_interim_table命令,這個(gè)時(shí)候執(zhí)行的時(shí)間不會(huì)很長(zhǎng);

ü  將源數(shù)據(jù)表和Interim數(shù)據(jù)表表名進(jìn)行置換;

ü  注銷(xiāo)unregistered物化視圖,并且刪除掉物化視圖日志;

ü  釋放開(kāi)在中間表上的鎖定;

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

PL/SQL procedure successfully completed

Executed in 1.953 seconds

SQL> select count(*) from mlog$_t;

select count(*) from mlog$_t

ORA-00942: 表或視圖不存在

檢查處理結(jié)果。

--按照原定計(jì)劃,數(shù)據(jù)表變化成功;

SQL> desc t;

Name          Type          Nullable Default Comments

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

OBJECT_ID     NUMBER        Y                        

OBJECT_NAME_2 VARCHAR2(128) Y                        

CREATED       TIMESTAMP(6)  Y                        

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true);

PL/SQL procedure successfully completed

Executed in 2.719 seconds

分區(qū)和主鍵對(duì)象實(shí)現(xiàn)成功。

SQL> select partition_name from user_tab_partitions where table_name='T';

PARTITION_NAME

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

P1

P2

P3

Executed in 0.062 seconds

SQL> select constraint_name, constraint_type from user_constraints where table_name='T';

CONSTRAINT_NAME                CONSTRAINT_TYPE

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

PK_T                           P

Executed in 0.062 seconds

我們之前討論的都是單表情況下的處理,如果是涉及到多表關(guān)系,例如外鍵關(guān)系表下的重定義,是怎么處理呢?

關(guān)于Oracle Online Redefinition在線重定義的示例分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


網(wǎng)站名稱(chēng):OracleOnlineRedefinition在線重定義的示例分析
當(dāng)前路徑:http://weahome.cn/article/peppcs.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部