專利名稱::異步信息共享系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本應(yīng)用涉及信息共享系統(tǒng)。
背景技術(shù):
:容易而及時地共享信息的能力對于任何商業(yè)環(huán)境都是非常重要的要求。因此,信息共享已被許多機(jī)制支持,諸如討論、郵件、書、期刊以及計算機(jī)技術(shù)。許多基于計算機(jī)的技術(shù)已發(fā)展來支持信息共享的目標(biāo),諸如報表/語句、復(fù)制和信息傳送。不幸地,大多數(shù)信息共享仍然通過應(yīng)用程序處理,這種應(yīng)用程序代表了一種由于與開發(fā)、配置、操作和維護(hù)提供信息共享服務(wù)的應(yīng)用程序有關(guān)的成本造成的相對昂貴的解決方案。另外,這種應(yīng)用程序提供的服務(wù)常常缺乏理想的功能,諸如對特別請求、用戶化和及時而靈活的傳送的支持。任何數(shù)據(jù)庫管理系統(tǒng)的重要特征是在多個數(shù)據(jù)庫和應(yīng)用程序之間共享信息的能力。傳統(tǒng)地,這已經(jīng)包括使用各種重疊技術(shù)將信息從數(shù)據(jù)庫中取出的用戶和應(yīng)用程序。目前,新的效率和商業(yè)模型要求一種更全面且自動化的方法。許多信息共享解決方案的目標(biāo)是解決特定的信息共享問題。雖然這種解決方案可以解決它們所針對的特定信息共享問題,但它們可能不可以應(yīng)用,甚至可能與其它的信息共享問題不兼容。綜上所述,希望提供一種以比目前的特定問題解決方案更靈活的方式的用于共享電子信息的系統(tǒng)和方法。本發(fā)明在附圖中以舉例而不是限制的方式加以闡明,附圖中相似的參考標(biāo)號指相似的元件,其中圖1是根據(jù)本發(fā)明的實施例配置的信息共享系統(tǒng)的框圖;圖2是示出根據(jù)本發(fā)明的實施例的當(dāng)數(shù)據(jù)條目流經(jīng)信息共享系統(tǒng)時所經(jīng)歷的三個一般階段的框圖;圖3是示出根據(jù)本發(fā)明的實施例的數(shù)據(jù)庫中變更的自動捕獲的框圖;圖4是示出根據(jù)本發(fā)明的實施例的從源隊列向目的隊列傳播的事件的框圖;圖5是示出根據(jù)本發(fā)明的實施例實施的有向網(wǎng)絡(luò)環(huán)境的框圖;圖6是示出根據(jù)本發(fā)明的實施例的在單一隊列中事件的顯式入列和出列的框圖;圖7是示出根據(jù)本發(fā)明的實施例的事件的顯式入列、傳播和出列的框圖;圖8是示出根據(jù)本發(fā)明的實施例的一個應(yīng)用過程的框圖;圖9是示出根據(jù)本發(fā)明的實施例的在應(yīng)用程序操作過程中轉(zhuǎn)換的框圖;圖10是示出使用信息共享系統(tǒng)將來自O(shè)racle數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)共享給非-Oracle數(shù)據(jù)庫系統(tǒng)的框圖;圖11是示出使用信息共享系統(tǒng)將來自非-Oracle數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)共享給Oracle數(shù)據(jù)庫系統(tǒng)的框圖;圖12是示出根據(jù)本發(fā)明的實施例的在單一數(shù)據(jù)庫內(nèi)實施的信息共享系統(tǒng)的框圖;圖13A和13B是示出根據(jù)本發(fā)明的實施例的用于在多個數(shù)據(jù)庫之間共享信息的信息共享系統(tǒng)的框圖;圖14是示出根據(jù)本發(fā)明的實施例的在一個規(guī)則集評價過程中的階段的框圖;圖15是示出根據(jù)本發(fā)明的實施例的一個規(guī)則集可以被規(guī)則引擎的多個客戶端使用的框圖;圖16是示出根據(jù)本發(fā)明的實施例的在捕獲過程中轉(zhuǎn)換的框圖;圖17是示出根據(jù)本發(fā)明的實施例的在傳播過程中轉(zhuǎn)換的框圖;圖18A、18B和18C是示出每個數(shù)據(jù)庫既是源數(shù)據(jù)庫也是目的數(shù)據(jù)庫的多節(jié)點(diǎn)系統(tǒng)的框圖;圖19是示出當(dāng)每個數(shù)據(jù)庫都是源數(shù)據(jù)庫又是目的數(shù)據(jù)庫時使用標(biāo)記的框圖;圖20是示出一個主數(shù)據(jù)庫與幾個從屬數(shù)據(jù)庫共享數(shù)據(jù)的的框圖;圖21是示出在主數(shù)據(jù)庫中使用標(biāo)記的框圖;圖22是示出在從屬數(shù)據(jù)庫中使用標(biāo)記的框圖;圖23是示出一個主數(shù)據(jù)庫和幾個擴(kuò)展的從屬數(shù)據(jù)庫的框圖;圖24是示出根據(jù)本發(fā)明的實施例的從源站點(diǎn)經(jīng)過一個中間站點(diǎn)至目的站點(diǎn)的在存儲器內(nèi)的變更信息流的框圖;圖25是示出根據(jù)本發(fā)明的實施例的由一應(yīng)用引擎執(zhí)行的步驟的流程圖,該應(yīng)用引擎使用持久儲存的LOWWATERMARK、持久儲存的識別ABOVE-MARKAPPLIED事務(wù)的數(shù)據(jù)以及非持久儲存的HIGHESTSOFARCSN來獲取恰好一次的行為;以及圖26是一個可以在其上實施本發(fā)明的實施例的計算機(jī)系統(tǒng)的框圖。具體實施例方式本發(fā)明描述了一種用于共享電子信息的方法和系統(tǒng)。在下面的描述中,出于解釋的目的,許多具體的細(xì)節(jié)被闡明以提供對本發(fā)明的徹底理解。然而,顯而易見,本發(fā)明可以在沒有這些具體細(xì)節(jié)的情況下進(jìn)行實施。在其它實施例中,已知的結(jié)構(gòu)和裝置以框圖的形式示出以避免對本發(fā)明不必要的混淆。觸發(fā)的活動鏈傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)技術(shù)常常將數(shù)據(jù)操作看作一種孤立的動作。然而,在許多現(xiàn)實方案中,情況不是這樣的。特別地,數(shù)據(jù)操作常常觸發(fā)活動序列或“鏈”。這樣觸發(fā)的動作分成多個種類,包括但不局限于·信息創(chuàng)建、修改、刪除或通過時間(thepassageoftime)這一類的活動可以構(gòu)成一個“商業(yè)事件”?!ば畔⒁蟮脑u價(evaluation)確定誰需要/喜歡被告知一個商業(yè)事件?!だ硐胄畔⒌膭?chuàng)建使用應(yīng)用程序查看和/或轉(zhuǎn)換,將信息創(chuàng)建為一種相互協(xié)定的形式?!そ?jīng)由理想傳輸將信息轉(zhuǎn)移到理想位置?!ぴ谀繕?biāo)位置的數(shù)據(jù)的修改吸收根據(jù)接收方的需要組織的目標(biāo)環(huán)境中的新信息?!ば聽顟B(tài)的通知為接收方或程序提供低潛伏期知識(latencyknowledge);通知可能激活應(yīng)用程序?!π畔⒌拇嫒】赡艿貫橐粋€反應(yīng)創(chuàng)建和/或修改信息(從而導(dǎo)致另一“商業(yè)事件”)。根據(jù)本發(fā)明的實施例,可以為各種活動建立規(guī)則,以自動地執(zhí)行某些數(shù)據(jù)修改事件想要的活動鏈。當(dāng)然,被任何給定數(shù)據(jù)操縱事件觸發(fā)的特定活動鏈將基于事件的性質(zhì)和已建立的規(guī)則變更。功能綜述下面描述了一種靈活的異步信息共享系統(tǒng)。該系統(tǒng)提供了可以單獨(dú)使用或結(jié)合使用以解決多種信息共享問題的許多特征。根據(jù)一實施例,信息共享系統(tǒng)包括用于儲存將被共享的信息的一個或多個中間存儲區(qū)。一個在此被稱作“捕獲過程”的軟件過程集將信息放置在中間存儲區(qū)中。另一在此被稱作“消費(fèi)過程”的軟件過程集消費(fèi)來自中間存儲區(qū)的信息。根據(jù)一實施例,通過中間存儲區(qū)執(zhí)行的信息共享是異步的。特別地,產(chǎn)生被捕獲過程捕獲的變更的過程不會暫停執(zhí)行來等待捕獲過程對變更的捕獲。相反地,捕獲過程不必返回向產(chǎn)生變更的過程報告。類似地,捕獲過程不暫停執(zhí)行以等待添加到中間存儲區(qū)的信息的進(jìn)一步處理。類似地,消費(fèi)過程不必返回向捕獲過程報告以提示捕獲過程繼續(xù)執(zhí)行。根據(jù)一個方面,信息共享系統(tǒng)支持多種捕獲過程,包括隱式捕獲過程和顯式捕獲過程。隱式捕獲過程是基于發(fā)生在與所述隱式捕獲過程有關(guān)的系統(tǒng)中的事件將信息添加到一個或多個中間存儲區(qū)的過程。日志捕獲過程是隱式捕獲過程的一個實例。日志捕獲過程讀取日志,諸如響應(yīng)于在數(shù)據(jù)庫系統(tǒng)內(nèi)發(fā)生的事件由數(shù)據(jù)庫系統(tǒng)產(chǎn)生的日志,基于日志的內(nèi)容將信息放入中間存儲區(qū)。顯式捕獲過程是添加信息到中間存儲區(qū)的過程,通過進(jìn)行顯式功能調(diào)用,經(jīng)由一個與中間存儲區(qū)有關(guān)的API,將信息添加到中間存儲區(qū)。根據(jù)另一方面,信息共享系統(tǒng)支持多種消費(fèi)過程,包括應(yīng)用過程、傳播過程和顯式出列過程。應(yīng)用過程是自動出列和根據(jù)包含在中間存儲區(qū)內(nèi)的信息動作的過程。傳播過程自動使信息出列并將信息從一個中間存儲區(qū)移動到一個指定的目的地。指定的目的地可以是例如另一中間存儲區(qū)。顯式出列過程從中間存儲區(qū)獲取信息,通過進(jìn)行顯式調(diào)用,經(jīng)由一個與中間存儲區(qū)有關(guān)的API,從中間存儲區(qū)獲取信息。消費(fèi)過程可以用于用它們消費(fèi)的信息執(zhí)行多種操作。例如,消費(fèi)過程可以用于將從隊列中提取出的消息傳送到之前已登記了對接收或被告知某種類型的信息或事件感興趣的“用戶過程”。在另一環(huán)境下,所提取的信息可以表示已在一數(shù)據(jù)庫系統(tǒng)內(nèi)已作出的變更,消費(fèi)過程可以用于在另一數(shù)據(jù)庫系統(tǒng)內(nèi)作出相應(yīng)變更。系統(tǒng)綜述圖1是根據(jù)本發(fā)明的實施例的用于異步共享信息的系統(tǒng)100的框圖。參考圖1,它包括多個中間存儲區(qū)102、104、106。信息被捕獲過程112、114和116分別添加到每個中間存儲區(qū)102、104、106。信息被消費(fèi)過程122、124和126分別從每個中間存儲區(qū)102、104、106消費(fèi)。捕獲過程112、114和116可以包括隱式捕獲過程和/或顯式捕獲過程。消費(fèi)過程122、124和126可以包括應(yīng)用過程和顯式出列過程。系統(tǒng)100還包括用于將信息從一個中間存儲區(qū)106提取出并添加到另一中間存儲區(qū)102的傳播過程118。以下將更加詳細(xì)地描述,傳播過程118的源和目標(biāo)不必總是中間存儲區(qū)。例如,傳播過程可以用于有選擇地從一中間存儲區(qū)提取信息并將所提取的信息發(fā)送到對該信息感興趣的另一過程。該另一過程可以是例如在與系統(tǒng)100相對遙遠(yuǎn)的系統(tǒng)內(nèi)運(yùn)行的過程。根據(jù)一實施例,中間存儲區(qū)102、104、106可以為不是特定類型的隊列。因為中間存儲區(qū)102、104、106不是特定類型的,相同的中間存儲區(qū)可以用于儲存大量不同類型的數(shù)據(jù)。因此,多條信息可以按順序或反映這些條信息之間關(guān)系的排列一起儲存在中間存儲區(qū)內(nèi),甚至當(dāng)這些條信息對應(yīng)于不同類型的數(shù)據(jù)時。在其它可選擇的實施例中,中間存儲區(qū)可以是特定類型的,其中,每個中間存儲區(qū)用于儲存特定類型的信息條目。信息共享系統(tǒng)100可以使用戶共享數(shù)據(jù)和事件。信息共享系統(tǒng)100可以將該信息在數(shù)據(jù)庫內(nèi)傳播或從一個數(shù)據(jù)庫傳播到另一數(shù)據(jù)庫。信息共享系統(tǒng)100將指定的信息傳送到指定的目的地。這個結(jié)果是一個新特征,這一特征提供了比傳統(tǒng)的用于捕獲和管理事件、以及與其它數(shù)據(jù)庫和應(yīng)用程序共享該事件的解決方案更強(qiáng)大的功能性和靈活性。信息共享系統(tǒng)100能夠使用戶中斷交替使用一個解決方案和其它解決方案的循環(huán)。信息共享系統(tǒng)100提供了需要建立和操作分布的企業(yè)和應(yīng)用程序、數(shù)據(jù)倉庫和高效解決方案的能力。用戶可以同時使用信息共享系統(tǒng)100的所有能力。如果需要變更,那么用戶可以實施信息共享系統(tǒng)100的一種新的功能而不必犧牲現(xiàn)有的功能。使用信息共享系統(tǒng)100,用戶控制將什么信息輸入信息共享系統(tǒng)100,信息如何從中間存儲區(qū)向中間存儲區(qū)或從數(shù)據(jù)庫向數(shù)據(jù)庫流動或傳送,當(dāng)信息共享系統(tǒng)100內(nèi)的事件流入每個數(shù)據(jù)庫時在信息共享系統(tǒng)100中會發(fā)生什么事情,以及信息共享系統(tǒng)100如何終止。通過配置信息共享系統(tǒng)100的具體功能,用戶可以提出具體要求?;谟脩舻木唧w要求,信息共享系統(tǒng)100可以自動地捕獲、儲存和管理數(shù)據(jù)庫內(nèi)的事件,包括但不局限于,數(shù)據(jù)操縱語言(DML)變更和數(shù)據(jù)定義語言(DDL)變更。用戶也可以將用戶定義的事件放入信息共享系統(tǒng)100中。然后,信息共享系統(tǒng)100可以將信息自動地傳播到其它數(shù)據(jù)庫或應(yīng)用程序。此外,基于用戶的具體要求,信息共享系統(tǒng)100可以在目的數(shù)據(jù)庫應(yīng)用事件。圖2示出了當(dāng)信息通過信息共享系統(tǒng)100被共享時信息通常流經(jīng)的階段。信息共享選項如上所述,響應(yīng)于一個事件,可以被系統(tǒng)100執(zhí)行的活動鏈可以形成多種形式。一般而言,活動鏈可以包括一個或多個數(shù)據(jù)捕獲、出站(out-bound)存儲、傳播、入站(in-bound)存儲和消費(fèi)。根據(jù)一實施例,系統(tǒng)100提供以多種方式實施這些活動中的每個活動的機(jī)制。表1列出了對于各種活動中的每個活動的一些特征的多個選項。表1關(guān)于被捕獲的信息的數(shù)據(jù)類型,“模式”選項指的是面向模式的數(shù)據(jù)查看。相反,“B”選項指的是面向商業(yè)文檔的數(shù)據(jù)查看。表1中給出的活動、元素和相應(yīng)選項的列表不是詳盡的。在此描述的信息共享框架可以以一種提供多種其它活動、元素和選項的方式被實現(xiàn)。例如,傳播活動的傳送元素的另一選項可以是“至少一次”。這樣,表1僅僅想要說明在此所述的信息共享系統(tǒng)的靈活性。表2舉例說明本文所述的信息系統(tǒng)的靈活性如何被利用以在多種環(huán)境下完成信息共享任務(wù)。特別地,表2列出了一種需要或要求信息共享的環(huán)境,并列出了當(dāng)使用系統(tǒng)100執(zhí)行那個環(huán)境下的信息共享活動時可能使用的選項。信息共享系統(tǒng)100的操作綜述根據(jù)一實施例,用戶可以使用信息共享系統(tǒng)100捕獲數(shù)據(jù)庫中的變更,使事件進(jìn)入一個隊列,將事件從一個隊列傳播到另一隊列,使事件出列,應(yīng)用數(shù)據(jù)庫中的事件,實現(xiàn)有向的網(wǎng)絡(luò),執(zhí)行自動沖突檢測和解析,執(zhí)行轉(zhuǎn)換,以及實現(xiàn)不同的信息共享。關(guān)于捕獲變更,用戶可以配置一個后臺日志捕獲過程以捕獲對表、模式或整個數(shù)據(jù)庫作出的變更。根據(jù)一實施例,日志捕獲過程從重做日志捕獲變更并將每個被捕獲的變更格式化成“邏輯變更記錄”(LCR)。在重做日志中產(chǎn)生變更的數(shù)據(jù)庫被稱作源數(shù)據(jù)庫。關(guān)于將事件放入一個隊列,至少兩種類型的事件可以儲存在信息共享系統(tǒng)100的隊列中LCR和用戶消息。捕獲過程使事件進(jìn)入用戶指定的隊列。然后該隊列在相同的數(shù)據(jù)庫內(nèi)共享事件或與其它的數(shù)據(jù)庫共享事件。用戶也可以顯式地用一個用戶應(yīng)用程序使用戶事件入列。這些顯示入列事件可以是LCR或用戶消息。關(guān)于將事件從一個隊列傳播到另一隊列,隊列可以在相同數(shù)據(jù)庫中或不同數(shù)據(jù)庫中。關(guān)于使事件出列,后臺應(yīng)用過程可以使事件出列。用戶也可以用一個用戶應(yīng)用程序使事件出列。關(guān)于在數(shù)據(jù)庫應(yīng)用事件,用戶可以配置一個應(yīng)用過程以應(yīng)用一個隊列中的所有事件或僅僅應(yīng)用用戶指定的事件。用戶也可以配置一個應(yīng)用過程以調(diào)用用戶創(chuàng)建的子程序(例如,用PL/SQL語言寫的子程序)處理事件。應(yīng)用事件或處理其它類型事件的數(shù)據(jù)庫被稱作目的數(shù)據(jù)庫。在一些配置中,源數(shù)據(jù)庫和目的數(shù)據(jù)庫可以相同。信息共享系統(tǒng)100的典型應(yīng)用程序信息共享系統(tǒng)100是靈活的,足以取得實際無限數(shù)量的信息共享對象。因此,放入信息共享系統(tǒng)100的應(yīng)用程序的數(shù)量非常大。為了舉例說明信息共享系統(tǒng)100的實用性和多功能性,將給出信息共享系統(tǒng)如何被應(yīng)用來實現(xiàn)消息排隊和數(shù)據(jù)復(fù)制的細(xì)節(jié)。關(guān)于消息排隊,信息共享系統(tǒng)100允許用戶應(yīng)用程序使不同類型的消息入列,將消息傳播到訂閱隊列,通知用戶應(yīng)用程序消息已準(zhǔn)備好用于消費(fèi),使目的數(shù)據(jù)庫的消息出列?;谝?guī)則的消息通知消費(fèi)過程可以與日志捕獲過程結(jié)合使用。利用這種組件的結(jié)合,捕獲過程可以將反映在數(shù)據(jù)庫的日志文件中反映的事件的LCR添加至中間存儲區(qū),消費(fèi)過程可以發(fā)送通知給那些表明對特定類型的數(shù)據(jù)庫事件感興趣的訂閱者。訂閱者感興趣的特定事件可以作為訂閱數(shù)據(jù)儲存起來,它可以使用一個或多個SQL語句識別訂閱者感興趣的數(shù)據(jù)。重要的是,這種通知可以直接發(fā)送給訂閱者,通過遠(yuǎn)程但兼容的信息傳送系統(tǒng)發(fā)送給用戶,或通過與最初產(chǎn)生LCR的系統(tǒng)不兼容的信息傳送系統(tǒng)的消息網(wǎng)關(guān)發(fā)送給訂閱者。根據(jù)一實施例,信息共享系統(tǒng)100使用一種儲存SYS.AnyData類型的消息的隊列實現(xiàn)中間存儲區(qū)102、104和106。幾乎所有類型的消息都可以打包成SYS.AnyData包,并儲存在SYS.AnyData隊列中。信息共享系統(tǒng)100用一種支持消息排隊系統(tǒng)的所有標(biāo)準(zhǔn)特征的排隊機(jī)制相互操作,包括多用戶隊列、公布和訂閱、基于內(nèi)容的傳送、Internet傳播、轉(zhuǎn)換和到其它信息傳送子系統(tǒng)的網(wǎng)關(guān)。關(guān)于數(shù)據(jù)復(fù)制,信息共享系統(tǒng)100可以有效地捕獲對數(shù)據(jù)庫對象進(jìn)行的數(shù)據(jù)操縱語言(DML)和數(shù)據(jù)定義語言(DDL)變更并將這些變更復(fù)制到一個或多個其它數(shù)據(jù)庫。捕獲過程(例如捕獲過程116)捕獲對源數(shù)據(jù)庫對象作出的變更并將它們格式化成LCR,LCR可以傳播到目的數(shù)據(jù)庫(例如經(jīng)由傳播過程118),然后被應(yīng)用過程(例如消費(fèi)過程122)應(yīng)用。目的數(shù)據(jù)庫可以允許對相同數(shù)據(jù)庫對象的DML和DDL變更,這些變更可以或不可以傳播到環(huán)境中的其它數(shù)據(jù)庫。換而言之,用戶可以配置具有傳播變更的數(shù)據(jù)庫的信息共享系統(tǒng)100,或用戶可以配置一種在其中可以在數(shù)據(jù)庫之間雙向傳播變更的環(huán)境。用于被共享的數(shù)據(jù)的表也不必在所有的數(shù)據(jù)庫都是相同的副本。這些表的結(jié)構(gòu)和內(nèi)容可以在不同的數(shù)據(jù)庫不同,這些表內(nèi)的信息可以在這些數(shù)據(jù)庫之間共享。核心服務(wù)系統(tǒng)100的組件提供了一個核心服務(wù)集。根據(jù)一實施例,那些核心服務(wù)包括事件捕獲、事件分配和事件消費(fèi)。事件捕獲一般指建立對發(fā)生在感興趣的系統(tǒng)中的事件的記錄。例如,感興趣的系統(tǒng)可以是一個數(shù)據(jù)庫系統(tǒng),事件捕獲可以由捕獲過程的集合執(zhí)行,這將在下文更加詳細(xì)地描述。事件分配一般指把有關(guān)事件的信息分配給對該事件感興趣的實體。這種實體可以駐留在創(chuàng)建感興趣的事件的系統(tǒng)內(nèi)部或駐留在系統(tǒng)外部。例如,事件分配可以包括把有關(guān)一個數(shù)據(jù)庫系統(tǒng)內(nèi)作出的變更的信息發(fā)送至另一數(shù)據(jù)庫系統(tǒng)。事件消費(fèi)一般指讀取捕獲的事件信息。通常,消費(fèi)過程將基于所捕獲的事件執(zhí)行某些活動,或開始某種活動鏈。例如,接收來自一個源數(shù)據(jù)庫系統(tǒng)的變更信息的目標(biāo)數(shù)據(jù)庫系統(tǒng)內(nèi)的過程可以讀取來自源數(shù)據(jù)庫系統(tǒng)的變更信息,并基于源數(shù)據(jù)庫系統(tǒng)內(nèi)作出的相應(yīng)變更開始目標(biāo)數(shù)據(jù)庫系統(tǒng)內(nèi)的變更。隱式捕獲過程實例如上所述,系統(tǒng)100支持顯式和隱式捕獲過程。日志捕獲過程是隱式捕獲過程的實例。根據(jù)一實施例,日志捕獲過程是用于讀取儲存在數(shù)據(jù)庫服務(wù)器的日志文件內(nèi)的信息,并基于日志文件中的信息將信息存入一個或多個中間存儲區(qū)的過程。這種日志文件可以包括例如由數(shù)據(jù)庫系統(tǒng)產(chǎn)生來記錄數(shù)據(jù)庫系統(tǒng)正作出的變更的重做日志文件。例如,一個重做日志文件可以包括表明在一個特定點(diǎn),數(shù)據(jù)庫服務(wù)器及時地將一特定表的特定行的特定列的值由X變更為Y的重做記錄。這種重做記錄中包含的信息通常由數(shù)據(jù)庫服務(wù)器使用來保證當(dāng)故障發(fā)生時丟失沒有提交的變更。然而,使用一個日志捕獲過程與其它過程有選擇地共享包含在重做記錄中的信息,通過將信息放入消費(fèi)過程可使用的一個或多個中間存儲區(qū)中,允許以除了開始產(chǎn)生日志的恢復(fù)目的之外的多種方式使用信息。例如,消費(fèi)過程可以有選擇地將來自中間存儲區(qū)的變更信息提供給駐留在產(chǎn)生日志的數(shù)據(jù)庫服務(wù)器的外部的過程。根據(jù)一實施例,日志捕獲過程有選擇地捕獲來自日志文件的信息。例如,響應(yīng)于對特定表作出的特定類型的變更,異步觸發(fā)器可以用于啟動。因此,當(dāng)事務(wù)對特定表作出特定類型的變更時,(1)數(shù)據(jù)庫服務(wù)器將產(chǎn)生重做記錄來響應(yīng)變更,以及(2)觸發(fā)器將啟動以及一個捕獲過程將捕獲新的重做記錄。由于觸發(fā)器是異步的,捕獲過程的執(zhí)行將不作為導(dǎo)致變更的事務(wù)的一部分被執(zhí)行。這樣,事務(wù)可以繼續(xù)進(jìn)行而不必等待捕獲過程,捕獲過程可以在作出變更之后的某一時間捕獲新的重做記錄。響應(yīng)于異步觸發(fā)器的啟動,執(zhí)行捕獲過程僅僅是捕獲過程操作的一個實例。另外,日志捕獲過程可以簡單地用于定期檢查新記錄的適當(dāng)日志。作為另一可選擇的方法,響應(yīng)于同步觸發(fā)器,日志捕獲過程可以被執(zhí)行。當(dāng)使用同步觸發(fā)器時,捕獲操作可由作為作出導(dǎo)致觸發(fā)器啟動的變更的事務(wù)的一部分的捕獲過程執(zhí)行。這樣,變更的捕獲相對于導(dǎo)致變更的事務(wù)是“同步的”。然而,與鏈(例如存儲、傳播、消費(fèi))有關(guān)的活動鏈中的任何其它活動仍然可以相對于那個事務(wù)異步執(zhí)行。根據(jù)一實施例,捕獲過程獲取從重做日志中抽取的變更數(shù)據(jù),將變更數(shù)據(jù)格式化成LCR。捕獲過程將LCR放入中間存儲區(qū)中用于進(jìn)一步處理。在一實施例中,對熱挖掘聯(lián)機(jī)重做日志和挖掘存檔的日志文件均提供了支持。當(dāng)執(zhí)行熱挖掘時,重做流可以在變更數(shù)據(jù)被寫入時同時被挖掘,從而減少了捕獲的潛伏期。如上所述,對典型數(shù)據(jù)庫內(nèi)的數(shù)據(jù)庫對象進(jìn)行的變更被記入重做日志以保證在用戶錯誤或介質(zhì)故障發(fā)生的情況下的可恢復(fù)性。在一實施例中,隱式捕獲過程是后臺過程,在正管理數(shù)據(jù)庫和讀取數(shù)據(jù)庫重做日志以捕獲對數(shù)據(jù)庫對象所作的DML和DDL變更的數(shù)據(jù)庫服務(wù)器內(nèi)執(zhí)行。在將這些變更格式化成LCR之后,隱式捕獲過程使它們排隊進(jìn)入中間存儲區(qū)。根據(jù)一實施例,存在幾種類型的LCR,包括行LCR,包括有關(guān)由DML操作引起的對表中行的變更的信息;以及DDLLCR,包括有關(guān)對數(shù)據(jù)庫對象的DDL變更的信息。用戶使用規(guī)則指定捕獲哪些變更。圖3示出了捕獲LCR的隱式捕獲過程。如下文將更加詳細(xì)地加以解釋的,用戶可以為由某一會話或應(yīng)用過程產(chǎn)生的重做實體指定“標(biāo)記”。然后這些標(biāo)記成為由捕獲過程捕獲的LCR的一部分。標(biāo)記可以被用于確定一個重做輸入或LCR是否包含產(chǎn)生于本地數(shù)據(jù)庫或不同數(shù)據(jù)庫的變更,這樣用戶可以避免將LCR發(fā)送回產(chǎn)生它們的數(shù)據(jù)庫。標(biāo)記也可以用于其它LCR跟蹤目的。用戶也可以使用標(biāo)記來為每個LCR指定目的數(shù)據(jù)庫集。根據(jù)已為信息共享系統(tǒng)100的各種組件建立的規(guī)則,與LCR有關(guān)的標(biāo)記值可以當(dāng)LCR流經(jīng)系統(tǒng)時在不同的點(diǎn)被設(shè)置、修改和/或轉(zhuǎn)換。例如,對于一個在日志文件中識別的變更創(chuàng)建的LCR,一個標(biāo)記值可以由捕獲過程設(shè)置來表明變更產(chǎn)生的數(shù)據(jù)庫。作為另一例子,用于LCR的標(biāo)記值可以由傳播過程設(shè)置來表明傳播過程正從其傳播LCR的系統(tǒng)。一個挖掘變更的日志的捕獲過程可以本地(其日志正被挖掘的系統(tǒng))或遠(yuǎn)程(其日志正被挖掘的系統(tǒng)的外部)地駐留。在捕獲過程正遠(yuǎn)程執(zhí)行的地方,日志可以從產(chǎn)生它們的系統(tǒng)輸出到捕獲過程正執(zhí)行的系統(tǒng)。例如,捕獲過程可以用于挖掘第一數(shù)據(jù)庫的日志,將用于在日志中表示的各種事件的LCR儲存在中間存儲區(qū)中。捕獲過程可能實際上正在第二數(shù)據(jù)庫系統(tǒng)中執(zhí)行。在這種情形下,日志文件可以從第一數(shù)據(jù)庫系統(tǒng)傳送到第二數(shù)據(jù)庫系統(tǒng),以便由第二數(shù)據(jù)庫系統(tǒng)的捕獲過程處理。捕獲過程儲存LCR的中間存儲區(qū)也可以駐留在第二數(shù)據(jù)庫系統(tǒng)中。以這種方式“卸載”與捕獲過程有關(guān)的開銷的能力可以用于裝載和資源平衡的目的。中間存儲區(qū)如圖1所示,中間存儲區(qū)可以用于暫時保存信息的捕獲、分配和消費(fèi)之間的信息。用于保存信息的中間存儲區(qū)的性質(zhì)可以根據(jù)信息和由信息觸發(fā)的活動鏈的性質(zhì)變更。例如,用于保存信息的捕獲、分配和消費(fèi)之間的信息的中間存儲區(qū)可以具有下面任何一種形式·無被捕獲的信息被直接傳送到傳播或消費(fèi)過程?!と罩净謴?fù)日志中的信息用于查找被捕獲的事件。·基本的信息被保存在本身不提供恢復(fù)機(jī)制的存儲區(qū)。·SQL信息被儲存,但不必被保留在一個可以使用數(shù)據(jù)庫語言諸如SQL查詢的數(shù)據(jù)容器中。·備有證明文件的與SQL選項相同,除了信息被保留在數(shù)據(jù)容器中。具有上述特征的中間存儲區(qū)可以多種方式實現(xiàn),本發(fā)明不局限于任何特定的實施。例如,SQL和備有證明文件的選項可以使用目前Oracle公司當(dāng)前可提供的Oracle9iR2數(shù)據(jù)庫系統(tǒng)中的高級排隊機(jī)制來實施。而且,高級排隊功能可以與Oracle公司提供的OracleWorkflow2.6結(jié)合使用來獲得檢查在其它事件的環(huán)境下的事件的能力。例如,一個顯式事件(例如從一個應(yīng)用程序接收到的消息,該應(yīng)用程序在應(yīng)用程序通過API作出的一個調(diào)用中)可以在其它顯式事件的描述體中被看到(例如,從相同應(yīng)用程序接收到的其它消息)。相似地,一個被隱式捕獲的事件(例如,對由數(shù)據(jù)庫服務(wù)器管理的數(shù)據(jù)的變更)可以在其它被隱式捕獲的事件(例如其它數(shù)據(jù)庫變更)的環(huán)境下被看到。在一實施例中,信息共享系統(tǒng)100使用隊列儲存用于傳播或消費(fèi)的事件。用戶可以使用信息共享系統(tǒng)100將事件從一個隊列傳播到另一隊列,這些隊列可以在相同的數(shù)據(jù)庫或不同的數(shù)據(jù)庫中。從其傳播事件的隊列被稱作源隊列,接收事件的隊列被稱作目的隊列。在源隊列和目的隊列之間可以有一對多、多對一或多對多的關(guān)系。儲存在一個隊列中的事件可以由一個或多個消費(fèi)過程(諸如應(yīng)用過程或用戶定義)的子程序消費(fèi)。如果用戶配置一個傳播過程(例如傳播過程118),將變更從源隊列傳播到目的隊列,那么用戶可以使用規(guī)則來指定哪些變更可以被傳播。圖4示出了從一個源隊列到目的隊列的傳播。有向網(wǎng)絡(luò)(directednetwork)綜述信息共享系統(tǒng)100能夠使用戶配置一種通過有向網(wǎng)絡(luò)(directednetwork)共享變更的環(huán)境。有向網(wǎng)絡(luò)是在其中被傳播的事件在到達(dá)目的數(shù)據(jù)庫之前可以通過一個或多個中間數(shù)據(jù)庫傳播的網(wǎng)絡(luò)。事件可以或不可以在中間數(shù)據(jù)庫被處理。使用信息共享系統(tǒng)100,用戶可以選擇哪些事件可以傳播到每個目的數(shù)據(jù)庫,用戶可以指定事件將到達(dá)目的數(shù)據(jù)庫所通過的路線。圖5示出了一個有向網(wǎng)絡(luò)環(huán)境的實例。在圖5示出的實例中,在芝加哥的中間數(shù)據(jù)庫上的隊列既是源隊列也是目的隊列。事件的顯式入列和出列用戶應(yīng)用程序可以顯式地使事件排隊進(jìn)入信息共享系統(tǒng)100的中間存儲區(qū)。用戶應(yīng)用程序可以將這些事件格式化成LCR,LCR允許應(yīng)用過程在目的數(shù)據(jù)庫應(yīng)用它們。另外,這些事件可以通過另一用戶應(yīng)用程序被格式化為用于消費(fèi)的用戶消息,另一用戶應(yīng)用程序使事件顯示地出列或者用來自應(yīng)用過程的調(diào)用返回處理事件。顯示地排隊進(jìn)入隊列的事件可以顯示地從相同的隊列出列。圖6示出了事件顯式入列和從相同的隊列出列。當(dāng)事件在隊列之間傳播時,顯式地進(jìn)入源隊列的事件可以由用戶應(yīng)用程序從目的隊列顯式地出列而不需要來自應(yīng)用過程的任何干預(yù)。圖7示出事件顯示地進(jìn)入源隊列、傳播到目的隊列、然后從目的隊列顯示出列。雖然本文給的許多實例包括LCR的捕獲、傳播和應(yīng)用,但那些實例中舉例說明的技術(shù)同樣適用于任何形式的共享數(shù)據(jù)。這種共享數(shù)據(jù)例如可以具有顯示入列的用戶消息,或甚至以一種不同于LCR的形式組織的被隱式捕獲的信息。應(yīng)用過程綜述根據(jù)一實施例,應(yīng)用過程是后臺過程,在數(shù)據(jù)庫服務(wù)器內(nèi)運(yùn)行,它使事件從隊列出列或者直接將每個事件應(yīng)用到數(shù)據(jù)庫對象或?qū)⑹录鳛橐粋€參數(shù)傳送到被稱作應(yīng)用處理程序(handler)的用戶定義的程序。這些應(yīng)用處理程序可以包括消息處理程序、DML處理程序、和DDL處理程序。根據(jù)一實施例,應(yīng)用過程被設(shè)計成可以意識到事務(wù)邊界。例如,應(yīng)用過程意識到以應(yīng)用過程正消費(fèi)的LCR中表示的哪些變更是最初作為相同事務(wù)的一部分。應(yīng)用過程將這些變更集合到事務(wù)中,以一種考慮到事務(wù)之間相關(guān)性的方式應(yīng)用這些變更。根據(jù)一實施例,應(yīng)用過程將這些變更并行地應(yīng)用到事務(wù)之間的相關(guān)性所允許的程度。通常應(yīng)用過程將事件應(yīng)用到正運(yùn)行的本地數(shù)據(jù)庫,但在不同的數(shù)據(jù)庫環(huán)境下,它可以被配置成在具有與本地數(shù)據(jù)庫不同類型的遠(yuǎn)程數(shù)據(jù)庫應(yīng)用事件。例如,本地數(shù)據(jù)庫可以是由一個公司生產(chǎn)的數(shù)據(jù)庫服務(wù)器創(chuàng)建的數(shù)據(jù)庫,遠(yuǎn)程數(shù)據(jù)庫可以是由另一公司生產(chǎn)的數(shù)據(jù)庫服務(wù)器創(chuàng)建的數(shù)據(jù)庫。用戶使用規(guī)則指定隊列中的哪些事件被應(yīng)用。圖8示出了處理LCR和用戶消息的應(yīng)用過程。根據(jù)一實施例,當(dāng)直接應(yīng)用LCR時應(yīng)用過程自動檢測沖突。通常當(dāng)源數(shù)據(jù)庫和目的數(shù)據(jù)庫的相同行幾乎同時被改變時發(fā)生沖突。當(dāng)沖突發(fā)生時,用戶需要一種機(jī)制保證沖突可根據(jù)用戶指定的商業(yè)規(guī)則被解決。根據(jù)一實施例,信息共享系統(tǒng)100包括多種預(yù)先建立的沖突解決處理程序。使用這些預(yù)先建立的處理程序,用戶可以為根據(jù)用戶指定的商業(yè)規(guī)則解決沖突的每個用戶數(shù)據(jù)庫定義一個沖突解決系統(tǒng)。如果用戶具有一種預(yù)先建立的沖突解決系統(tǒng)不能解決的獨(dú)特情況,那么用戶可以建立定制的沖突解決處理程序。根據(jù)一實施例,如果沖突沒有被解決,或如果處理程序過程產(chǎn)生錯誤,那么產(chǎn)生錯誤的事務(wù)中的所有事件被保存在異常隊列中以便以后分析和可能再執(zhí)行。如上所述,LCR僅僅是可以被應(yīng)用過程處理的共享信息類型的一個實例。應(yīng)用過程可以被配置成能夠“應(yīng)用”任何形式的共享信息,包括顯式入列的用戶消息和不作為LCR組織的自動捕獲的數(shù)據(jù)。規(guī)則驅(qū)動的信息共享如上所述,活動鏈中的每個活動都可以以多種方式執(zhí)行。例如,可以用“最大努力”和“開放式”特征,或“恰好一次”和“封閉式”特征執(zhí)行傳播。根據(jù)本發(fā)明的一實施例,規(guī)則登記機(jī)制被提供以允許用戶登記指定的規(guī)則·活動鏈響應(yīng)于特定事件執(zhí)行,以及·活動鏈中的每個活動如何被執(zhí)行。根據(jù)一實施例,登記機(jī)制在數(shù)據(jù)庫系統(tǒng)內(nèi)被實施。當(dāng)信息共享規(guī)則向數(shù)據(jù)庫系統(tǒng)登記時,數(shù)據(jù)庫系統(tǒng)產(chǎn)生和存儲反映該規(guī)則的元數(shù)據(jù)(本文稱作“規(guī)則元數(shù)據(jù)”)。另外,數(shù)據(jù)庫系統(tǒng)產(chǎn)生請求執(zhí)行該規(guī)則的任何機(jī)制。例如,假定用戶需要使用系統(tǒng)100在目標(biāo)數(shù)據(jù)庫復(fù)制一個存在于源數(shù)據(jù)庫中的表。為了使系統(tǒng)100執(zhí)行該復(fù)制,用戶可以登記規(guī)則集·識別將被復(fù)制的數(shù)據(jù)庫表·識別目標(biāo)數(shù)據(jù)庫,以及·指定用于執(zhí)行復(fù)制的數(shù)據(jù)捕獲、存儲、傳播和消費(fèi)選項響應(yīng)于該規(guī)則集的接收,數(shù)據(jù)庫系統(tǒng)將產(chǎn)生元數(shù)據(jù)來記錄該規(guī)則,產(chǎn)生任何支持機(jī)制來實施該規(guī)則。這種支持機(jī)制可以包括例如用于響應(yīng)于在數(shù)據(jù)庫表上執(zhí)行的變更觸發(fā)捕獲過程的執(zhí)行的異步觸發(fā)器。元數(shù)據(jù)可能包括例如(1)指示捕獲過程關(guān)于從哪個日志捕獲信息、捕獲哪個信息、要使用的捕獲選項、以及將捕獲的信息儲存在哪的元數(shù)據(jù);(2)指示傳播過程要傳播哪個信息、該信息在傳播之前如何轉(zhuǎn)換、以及在哪兒傳播數(shù)據(jù)等的元數(shù)據(jù)。(3)指示目標(biāo)數(shù)據(jù)庫系統(tǒng)中的應(yīng)用過程在哪兒接收被傳播的信息、如何處理被傳播的信息、以及如何應(yīng)用被傳播的信息來保持目標(biāo)數(shù)據(jù)庫系統(tǒng)中的表與被傳播的信息中反映的變更同步等的元數(shù)據(jù)。規(guī)則綜述信息共享系統(tǒng)100使用戶能夠控制共享哪個信息以及在哪兒使用規(guī)則共享它。規(guī)則被指定作為一個類似于SQL查詢的WHERE語句中的條件,用戶可以將相關(guān)的規(guī)則分類成規(guī)則集。根據(jù)一實施例,規(guī)則包括規(guī)則條件、規(guī)則評價環(huán)境、以及規(guī)則動作環(huán)境。規(guī)則條件結(jié)合了一個或多個表達(dá)式和運(yùn)算符并基于一個事件返回一個Boolean值,該Boolean值是TRUE、FALSE或NULL(未知)。規(guī)則評價環(huán)境(context)定義了可以在規(guī)則條件中被參考的外部數(shù)據(jù)。該外部數(shù)據(jù)可以作為外部變量、作為列表數(shù)據(jù)存在或者作為兩者存在。規(guī)則動作環(huán)境是與當(dāng)規(guī)則被評價時由規(guī)則引擎的客戶端解釋的規(guī)則有關(guān)的可選信息。例如,下面的規(guī)則條件可以用于信息共享系統(tǒng)100來指定為了使條件等于TRUE,擁有表的模式名必須是hr以及表名必須是departmentsdml.get_object_owner()=′hr′ANDdml.get_object_name()=′departments′在信息共享系統(tǒng)100內(nèi),該規(guī)則條件可以以下面的方式使用指示捕獲過程捕獲對hr.departments表的DML變更。指示傳播過程傳播對hr.departments表的DML變更。指示應(yīng)用過程應(yīng)用對hr.departments表的DML變更。信息共享系統(tǒng)100基于規(guī)則執(zhí)行任務(wù)。這些任務(wù)包括利用捕獲過程捕獲變更,利用傳播過程傳播變更,以及利用應(yīng)用過程應(yīng)用變更。根據(jù)一實施例,用戶可以為這些任務(wù)定義三個不同等級的規(guī)則表格規(guī)則、模式規(guī)則、和全局規(guī)則。當(dāng)用戶定義表格規(guī)則時,在用戶指定的表發(fā)生變更時執(zhí)行任務(wù)。例如,用戶可以定義指示捕獲過程捕獲對hr.employees表的變更的規(guī)則。給定這一規(guī)則,如果將一行插入到hr.employees表中,那么捕獲過程捕獲該插入,將它格式化成LCR,并使LCR排隊進(jìn)入一隊列。當(dāng)用戶定義模式規(guī)則時,在用戶指定的模式下的數(shù)據(jù)庫對象以及將來添加到模式的任何數(shù)據(jù)庫對象發(fā)生變更時執(zhí)行任務(wù)。例如,用戶可以定義兩個指示傳播過程將hr模式的DML和DDL變更從一個源隊列傳播到一個目的隊列的規(guī)則。給定這些規(guī)則,假設(shè)源隊列包含定義下面變更的LCRhr.loccity_ix索引被改變。在Hr.jobs表中的行被更新。傳播過程將這些變更從源隊列傳播到目的隊列,因為兩種變更都是用于hr模式的數(shù)據(jù)庫對象。當(dāng)用戶定義全局規(guī)則時,在數(shù)據(jù)庫中的任何數(shù)據(jù)庫對象發(fā)生變更時任務(wù)被執(zhí)行。如果它是一個全局DML捕獲規(guī)則,那么捕獲過程捕獲數(shù)據(jù)庫中的數(shù)據(jù)庫對象的所有DML變更。如果它是一個全局DDL傳播或應(yīng)用規(guī)則,那么執(zhí)行任務(wù)用于隊列中的所有DDL變更。規(guī)則引擎如上所述,系統(tǒng)100的各種組件可以設(shè)計默認(rèn)行為,該默認(rèn)行為可以由系統(tǒng)100的登記規(guī)則取代。當(dāng)一個規(guī)則被登記時,在系統(tǒng)100內(nèi)產(chǎn)生元數(shù)據(jù)以反映該規(guī)則。系統(tǒng)100的各種組件用于讀取元數(shù)據(jù)并根據(jù)反映在其中的任何規(guī)則((1)應(yīng)用它們和(2)應(yīng)用于它們目前正操作的環(huán)境)修改它們的行為。例如,一特定用戶可以登記一個規(guī)則,該規(guī)則為當(dāng)正被傳播的條目是一特定類型的消息時將傳播策略從默認(rèn)的“恰好一次”改變?yōu)橐粋€新值“最大努力”。負(fù)責(zé)傳播那種特定類型消息的過程用于讀取元數(shù)據(jù),并當(dāng)為那個特定用戶處理那種特定類型的消息時使用“最大努力”傳播方法。然而,當(dāng)為其它用戶傳播相同類型的消息時,傳播過程可以繼續(xù)使用默認(rèn)的“恰好一次”方法。除了取代組件放入默認(rèn)行為,規(guī)則可以用于補(bǔ)充行為。例如,一個特定的捕獲過程可以用于捕獲某些類型的信息并將該信息添加到中間存儲區(qū)。規(guī)則可以向系統(tǒng)100登記,該規(guī)則為捕獲過程指定了幾種額外的任務(wù),以在執(zhí)行由它的默認(rèn)行為提出的任務(wù)之前、過程中和/或之后執(zhí)行。例如,根據(jù)登記的規(guī)則,捕獲過程可以用于在將信息添加到中間存儲區(qū)時(諸如(1)在將信息放入中間存儲區(qū)之前給它添加標(biāo)記,以及(2)在將信息放入中間存儲區(qū)之后發(fā)送通知給各種實體時)執(zhí)行許多額外任務(wù)。登記和管理被系統(tǒng)100的組件使用的規(guī)則中包含的各種過程在本文被稱為“規(guī)則引擎”。轉(zhuǎn)換綜述基于規(guī)則的轉(zhuǎn)換是對當(dāng)規(guī)則評價為TRUE時產(chǎn)生的事件的任何修改。例如,當(dāng)用戶需要對事件變更表中特定列的數(shù)據(jù)類型時用戶可以使用基于規(guī)則的轉(zhuǎn)換。在這種情況下,轉(zhuǎn)換可以是一個PL/SQL函數(shù),該函數(shù)的輸入是一個包含一列為NUMBER數(shù)據(jù)類型的邏輯變更記錄(LCR)的SYS.AnyData對象,并返回一個包含相同列為VARCHAR2數(shù)據(jù)類型的LCR的SYS.AnyData對象。根據(jù)一實施例,轉(zhuǎn)換可以在下面的時間發(fā)生·在事件的入列過程中,它可以用于將事件格式化成適合所有目的數(shù)據(jù)庫的方式?!ぴ谑录膫鞑ミ^程中,它可以用于在將數(shù)據(jù)發(fā)送到遠(yuǎn)程站點(diǎn)之前使數(shù)據(jù)形成子集?!ぴ谑录隽羞^程中,它可以用于將事件格式化成適合特定的目的數(shù)據(jù)庫的方式。圖9示出了在應(yīng)用過程中基于規(guī)則的轉(zhuǎn)換。不同的信息共享綜述除了由相同公司生產(chǎn)的數(shù)據(jù)庫之間的信息共享之外,信息共享系統(tǒng)100支持不同公司的數(shù)據(jù)庫之間的信息共享。典型地,一個公司提供的數(shù)據(jù)庫系統(tǒng)支持的特征不同于其它公司提供的數(shù)據(jù)庫系統(tǒng)支持的特征。因此,在兩種不同類型的數(shù)據(jù)庫系統(tǒng)之間共享信息的任務(wù)可能是非常復(fù)雜的。下面將更加詳細(xì)地描述,信息共享系統(tǒng)100可以被利用來極大地便于這種不同的數(shù)據(jù)庫系統(tǒng)之間的信息共享。為了描述信息共享系統(tǒng)100如何用于在不同的數(shù)據(jù)庫之間共享數(shù)據(jù),應(yīng)該假定數(shù)據(jù)應(yīng)該在Oracle數(shù)據(jù)庫服務(wù)器和非-Oracle數(shù)據(jù)庫服務(wù)器之間被共享。然而,本文所述的方法不局限于這種情形。因此應(yīng)用這些方法的不同系統(tǒng)內(nèi)的數(shù)據(jù)庫的實際類型可以從一個實現(xiàn)到另一個實現(xiàn)變化。出于解釋的目的,初始產(chǎn)生將被傳送到其它數(shù)據(jù)庫系統(tǒng)的信息的數(shù)據(jù)庫系統(tǒng)本文被稱作“源”數(shù)據(jù)庫。相反,接收共享信息的數(shù)據(jù)庫系統(tǒng)被稱作“目的”數(shù)據(jù)庫。如果Oracle數(shù)據(jù)庫是源以及非-Oracle數(shù)據(jù)庫是目的地,那么非-Oracle數(shù)據(jù)庫目的地將通常缺乏信息共享系統(tǒng)100的以下組件接收事件的隊列、以及出列和應(yīng)用事件的應(yīng)用過程。為了與非-Oracle目的數(shù)據(jù)庫共享Oracle源數(shù)據(jù)庫的DML變更,Oracle數(shù)據(jù)庫作為代理并執(zhí)行一些通常在目的數(shù)據(jù)庫進(jìn)行的步驟。也就是,使用于非-Oracle目的數(shù)據(jù)庫的事件在Oracle數(shù)據(jù)庫本身內(nèi)出列,在Oracle數(shù)據(jù)庫的應(yīng)用過程使用不同服務(wù),通過網(wǎng)關(guān)、跨越一條網(wǎng)絡(luò)連接將事件應(yīng)用到非-Oracle數(shù)據(jù)庫。圖10示出了與非-Oracle數(shù)據(jù)庫共享數(shù)據(jù)的Oracle數(shù)據(jù)庫。根據(jù)一實施例,制定應(yīng)用程序(customappliaction)被用于捕獲和將變更從非-Oracle數(shù)據(jù)庫傳播到Oracle數(shù)據(jù)庫。該應(yīng)用程序通過使用觸發(fā)器或某種其它方法,從事務(wù)日志讀取對非-Oracle數(shù)據(jù)庫的變更。該應(yīng)用程序集合并將事務(wù)排序,將每個變更轉(zhuǎn)換成邏輯變更記錄(LCR)。然后,通過使用PL/SQL接口,該應(yīng)用程序使LCR排隊進(jìn)入Oracle數(shù)據(jù)庫中的一個隊列,在那兒它們可以被應(yīng)用過程處理。圖11示出了非-Oracle數(shù)據(jù)庫與Oracle數(shù)據(jù)庫共享數(shù)據(jù)。圖12示出了信息共享系統(tǒng)100如何用于在單一數(shù)據(jù)庫內(nèi)共享信息,而圖13A和13B示出了信息共享系統(tǒng)100如何用于在兩個不同的數(shù)據(jù)庫之間共享信息。應(yīng)該提到圖13A和13B中示出的信息共享操作中包含的各種組件中的每一個組件都可以根據(jù)儲存在規(guī)則引擎中的規(guī)則集操作。例如,用于捕獲源數(shù)據(jù)庫作出的變更的捕獲過程可以根據(jù)用戶登記的規(guī)則操作。在其它事情中,規(guī)則可以規(guī)定捕獲哪些變更、如何轉(zhuǎn)換這些變更、以及如何生成表示那些變更的LCR附加標(biāo)記。類似地,傳播過程、應(yīng)用過程和各種處理程序過程都可以被規(guī)則驅(qū)動。根據(jù)一實施例,這些不同的組件可以設(shè)計默認(rèn)動作,它們在沒有任何登記的規(guī)則集的情況下實施。復(fù)制實例如上所述,來自數(shù)據(jù)庫服務(wù)器(下文稱作“源服務(wù)器”)的重做日志的信息可以由捕獲過程有選擇地添加到中間存儲區(qū)。然后消費(fèi)過程有選擇地將這種來自中間存儲區(qū)的信息提供給源服務(wù)器外部的過程。變更信息可以例如被提供給不同的數(shù)據(jù)庫服務(wù)器(下文稱作“目標(biāo)”數(shù)據(jù)庫服務(wù)器)中的過程。然后目標(biāo)數(shù)據(jù)庫服務(wù)器中的過程使用來自源數(shù)據(jù)庫服務(wù)器的變更信息來保持駐留在目標(biāo)數(shù)據(jù)庫的信息與源數(shù)據(jù)庫服務(wù)器中的相應(yīng)信息同步。例如,過程可以基于源數(shù)據(jù)庫服務(wù)器中的表T2作出的變更更新目標(biāo)數(shù)據(jù)庫服務(wù)器中的表T1,因此T1可以作為T2的副本。基于Oracle的重做日志和捕獲過程的實例每個Oracle數(shù)據(jù)庫都有一個兩個或多個重做日志文件的集合。數(shù)據(jù)庫的重做日志文件統(tǒng)稱為數(shù)據(jù)庫重做日志。重做日志的主要功能是記錄數(shù)據(jù)庫的所有變更。重做日志用于保證在發(fā)生人為錯誤或介質(zhì)故障的情況下的可恢復(fù)性。根據(jù)一實施例,信息共享系統(tǒng)100的捕獲過程作為讀取數(shù)據(jù)庫重做日志以捕獲對數(shù)據(jù)庫對象作出的DML和DDL變更的可選的Oracle后臺過程來實現(xiàn)。當(dāng)捕獲過程用于從重做日志捕獲變更時,產(chǎn)生變更的數(shù)據(jù)庫被稱作源數(shù)據(jù)庫。邏輯變更記錄(LCR)捕獲過程將從重做日志中捕獲的變更重新格式化成LCR。LCR是描述數(shù)據(jù)庫變更的對象。根據(jù)一實施例,捕獲過程捕獲多種類型的LCR,包括行LCR和DDLLCR。在捕獲一個LCR之后,捕獲過程使包含該LCR的事件排隊進(jìn)入一個隊列。捕獲過程總是與單一的SYS.AnyData隊列關(guān)聯(lián),它僅僅使事件排隊進(jìn)入這個隊列。用戶可以創(chuàng)建多個隊列并使不同的捕獲過程與每個隊列相關(guān)聯(lián)。圖3示出了捕獲LCR的捕獲過程。行LCR描述了單一行中的數(shù)據(jù)的變更或行中單一LOB列的變更。變更產(chǎn)生于數(shù)據(jù)操縱語言(DML)語句或LOB的分段更新。例如,DML語句可以將多行插入或合并入一個表,可以更新表中的多個行,或可以從表中刪除多個行。因此,單一DML語句可以生成多個行LCR。也就是,捕獲過程為由DML語句變更的每行創(chuàng)建一個LCR。而且,DML語句本身可以是包括多條DML語句的事務(wù)的一部分。被捕獲的行LCR也可以包括事務(wù)控制語句。這些行LCR包含諸如COMMIT和ROLLBACK的指令。這些行LCR是內(nèi)部的,被應(yīng)用過程使用來保持源數(shù)據(jù)庫和目的數(shù)據(jù)庫之間的事務(wù)的一致性。根據(jù)一實施例,每行LCR都包含下面的信息·發(fā)生行變更的源數(shù)據(jù)庫的名稱·產(chǎn)生變更、或者INSERT、UPDATE、DELETE、LOBERASE、LOBWRITE或LOBTRIM的DML語句的類型·包含變更的行的表的模式名稱·包含變更的行的表的名稱·可以用于跟蹤LCR的原標(biāo)記·運(yùn)行DML語句的事務(wù)的標(biāo)識符·當(dāng)變更被寫入重做日志時的系統(tǒng)變更號(SCN)·與變更有關(guān)的舊值。如果DML語句的類型是UPDATE或DELETE,那么這些舊值包括在DML語句之前的變更行中的一些或所有列。如果DML語句的類型是INSERT,那么沒有舊值?!づc變更有關(guān)的新值。如果DML語句的類型是UPDATE或INSERT語句,那么這些新值包括在DML語句之后的變更行中的一些或所有列。如果DML語句的類型是DELETE,那么沒有新值。DDLLCR描述了數(shù)據(jù)定義語言(DDL)變更。DDL語句改變了數(shù)據(jù)庫的結(jié)構(gòu)。例如,DDL語句可以創(chuàng)建、改變或刪掉一個數(shù)據(jù)庫對象。根據(jù)一實施例,每個DDLLCR都包含下面的信息·發(fā)生DDL變更的源數(shù)據(jù)庫的名稱·生成變更(例如ALTERTABLE或CREATEINDEX)的DDL語句的類型·擁有運(yùn)行DDL語句的數(shù)據(jù)庫對象的用戶的模式名稱·在其上運(yùn)行DDL語句的數(shù)據(jù)庫對象的名稱·在其上運(yùn)行DDL語句的數(shù)據(jù)庫對象(例如TABLE或PACKAGE)的類型·DDL語句的文本·登錄用戶是其會話執(zhí)行DDL語句的用戶·如果沒有為DDL文本中的對象指定模式而使用的模式·基表所有者。如果DDL語句依賴于一個表,那么基表所有者是DDL語句依賴的表的所有者?!せ砻Q。如果DDL語句依賴于一個表,那么基表名稱是DDL語句依賴的表的名稱?!た梢员挥糜诟橪CR的原標(biāo)記·運(yùn)行DDL語句的事務(wù)的標(biāo)識符·當(dāng)變更寫入重做日志時的SCN捕獲規(guī)則根據(jù)一實施例,信息共享系統(tǒng)100內(nèi)的捕獲過程(例如捕獲過程116)基于用戶定義的規(guī)則捕獲變更。每個規(guī)則指定了數(shù)據(jù)庫對象,捕獲過程為數(shù)據(jù)庫對象捕獲變更以及要捕獲的變更的類型。在一實施例中,用戶可以指定下面幾個等級的捕獲規(guī)則·表格規(guī)則,捕獲特定表的DML或DDL變更。·模式規(guī)則,捕獲特定模式中的數(shù)據(jù)庫對象的DML或DDL變更?!と忠?guī)則,捕獲數(shù)據(jù)庫中的所有DML或所有DDL變更。捕獲過程規(guī)則評價一個正在運(yùn)行的捕獲過程完成下面一系列的動作以捕獲變更1.查找重做日志中的變更。2.執(zhí)行預(yù)過濾重做日志中的變更。在這一步驟過程中,捕獲過程評價在對象級和模式級的規(guī)則集中的規(guī)則,把重做日志中發(fā)現(xiàn)的變更分成兩類應(yīng)該轉(zhuǎn)換成LCR的變更和不應(yīng)該轉(zhuǎn)換成LCR的變更。預(yù)過濾是對不完整的信息所做的安全的最佳方法(safeoptimization)。這一步驟識別隨后將被處理的相關(guān)變更,使得如果一個或多個規(guī)則可以在轉(zhuǎn)換之后評價為TRUE,變更轉(zhuǎn)換成LCR。如果捕獲過程可以保證沒有規(guī)則在轉(zhuǎn)換之后評價為TRUE,變更不轉(zhuǎn)換成LCR。3.基于預(yù)過濾(prefiltering),將可以導(dǎo)致一個或多個規(guī)則評價為TRUE的變更轉(zhuǎn)換成LCR。4.執(zhí)行LCR過濾。在這一步驟過程中,捕獲過程評價有關(guān)每個LCR中的信息的規(guī)則,以將LCR分成兩類應(yīng)該入列的LCR和應(yīng)該刪除的LCR。5.刪除基于規(guī)則不應(yīng)該入列的LCR。6.使剩下被捕獲的LCR排隊進(jìn)入與捕獲過程有關(guān)的隊列。例如,假設(shè)為捕獲過程定義了下面的規(guī)則捕獲其中department-id為50的hr.employees表的變更。沒有為捕獲過程定義其它的規(guī)則,捕獲過程的對應(yīng)參數(shù)被設(shè)置為1。給定這一規(guī)則,假設(shè)在hr.employees表上的UPDATE語句改變了表中的50行。捕獲過程為每行變更執(zhí)行下面一系列的動作1.在重做日志中查找由UPDATE語句引起的下一次變更。2.確定由UPDATE語句引起的hr.employees表的變更必須被捕獲。如果不同的表發(fā)生變更,那么捕獲過程忽略這一變更。3.捕獲變更并把它轉(zhuǎn)換成LCR。4.過濾LCR以確定它是否包含departmentid為50的行。5.如果它包含department-id為50的行,使LCR排隊進(jìn)入與捕獲過程有關(guān)的隊列,或如果它包含department-id不為50或空白的行,刪除LCR。事件存儲和傳播綜述信息共享系統(tǒng)100使用類型為SYS.AnyData的隊列以儲存事件。有兩種類型的事件可以儲存在一個隊列中邏輯變更記錄(LCR)和用戶消息。LCR是包含關(guān)于數(shù)據(jù)庫對象的變更的信息的對象,而用戶消息是由用戶或應(yīng)用創(chuàng)建的定制消息(custommessages)。兩種類型的事件均為SYS.AnyData類型,可以用于單一數(shù)據(jù)庫內(nèi)或數(shù)據(jù)庫之間的信息共享。儲存的事件可以被消費(fèi)或傳播或者兩者均可。這些事件可以由一個應(yīng)用過程或一個使它們顯式出列的用戶應(yīng)用程序消費(fèi)。即使在一個事件被消費(fèi)之后,如果用戶也配置了信息共享系統(tǒng)100來將事件傳播到一個或多個其它隊列或者如果指定消息保持,它仍然可以保留在隊列中。這些其它的隊列可以駐留在相同數(shù)據(jù)庫或不同數(shù)據(jù)庫中。在任何一種情況下,從其傳播事件的隊列被稱作源隊列,接收事件的隊列被稱作目的隊列。在源隊列和目的隊列之間可以有一對多、多對一或多對多的關(guān)系。圖4示出了從源隊列到目的隊列的傳播。根據(jù)一實施例,信息條目的順序在數(shù)據(jù)條目的傳播過程中被保持。當(dāng)條目的順序具有功能分支時,保持順序是非常有用的。例如,如果正被傳播的條目是數(shù)據(jù)庫系統(tǒng)的變更,保持順序是重要的,以使在它們依賴的被傳播的變更之后,對目標(biāo)系統(tǒng)作出被傳播的變更。用戶可以創(chuàng)建、改變和刪掉一個傳播,用戶可以定義控制傳播哪些事件的傳播規(guī)則。擁有源隊列的用戶是傳播事件的用戶。該用戶必須擁有傳播事件所必要的特權(quán)。這些特權(quán)包括·在傳播使用的規(guī)則集上執(zhí)行特權(quán)·在規(guī)則集中使用的所有轉(zhuǎn)換功能上執(zhí)行特權(quán)(privilege)·如果目的隊列在相同的數(shù)據(jù)庫中,在目的隊列上使特權(quán)入列。被捕獲和被用戶入列的事件根據(jù)一實施例,事件可以以兩種方式入列·捕獲過程使被捕獲的變更以包含LCR的事件的形式入列。包含一個最初被捕獲過程捕獲和入列的LCR的事件被稱作被捕獲的事件?!び脩魬?yīng)用程序使類型為SYS.AnyData的用戶消息入列。這些用戶消息可以包括LCR或任何其它類型的消息。被用戶或應(yīng)用顯式入列的任何用戶消息或應(yīng)用程序被稱作被用戶入列的事件。通過從應(yīng)用過程調(diào)用的用戶程序入列的事件也是被用戶入列的事件。因此,每個被捕獲的事件都包含一個LCR,但被用戶入列的事件可以或不可以包含LCR。傳播一個被捕獲的事件或被用戶入列的事件使事件進(jìn)入目的隊列。根據(jù)一實施例,事件可以以兩種方式出列·應(yīng)用過程使被捕獲的或被用戶入列的事件出列。如果事件包括LCR,那么應(yīng)用過程可以直接應(yīng)用它或調(diào)用一個用戶指定的程序用于處理。如果事件不包括LCR,那么應(yīng)用過程可以調(diào)用被稱作消息處理程序的用戶指定的程序來處理它?!び脩魬?yīng)用程序顯式地使被用戶入列的事件出列并處理它們。用戶應(yīng)用程序不能使被捕獲的事件出列;它們必須通過應(yīng)用過程出列。然而,如果被應(yīng)用過程調(diào)用的用戶程序顯式地使一個事件入列,那么該事件是被用戶入列的事件且可以被顯式地出列,即使事件最初是一個被捕獲的事件。被出列的事件可能已經(jīng)在與它們被出列數(shù)據(jù)庫的相同的數(shù)據(jù)庫產(chǎn)生,或它們可以產(chǎn)生于不同的數(shù)據(jù)庫。隊列之間的事件傳播用戶可以使用信息共享系統(tǒng)100來配置在兩個隊列之間的事件傳播,兩個隊列可以駐留在不同的數(shù)據(jù)庫。信息共享系統(tǒng)100使用作業(yè)隊列來傳播事件。根據(jù)一實施例,傳播是在源隊列和目的隊列之間。雖然傳播是在兩個隊列之間,但單一隊列可以參與許多傳播過程。也就是,單一源隊列可以將事件傳播到多個目的隊列,且單一目的隊列可以接收來自多個源隊列的事件。根據(jù)一實施例,在特定的源隊列和特定的目的隊列之間僅允許存在一個傳播過程。單一隊列也可以是用于一些傳播過程的目的隊列以及是用于其它傳播過程的源隊列。傳播過程可以將源隊列中的所有事件傳播到目的隊列,或傳播過程可以僅僅傳播事件的一個子集。單一傳播過程也可以傳播被捕獲的和被用戶入列的事件。用戶可以使用規(guī)則來控制源隊列中的哪些事件被傳播到目的隊列。根據(jù)用戶如何建立信息共享系統(tǒng)100環(huán)境,可以將變更發(fā)送回它們產(chǎn)生的站點(diǎn)。用戶需要保證環(huán)境被配置來避免在無限循環(huán)中循環(huán)變更。用戶可以使用標(biāo)記來避免這種變更循環(huán)。傳播規(guī)則傳播過程基于用戶定義的規(guī)則傳播事件。對于事件,每個規(guī)則指定了傳播過程傳播的變更所針對的數(shù)據(jù)庫對象以及要傳播的變更的類型。用戶可以為事件指定下面幾個等級的傳播規(guī)則·表格規(guī)則,傳播特定表格的DML或DDL變更?!つJ揭?guī)則,傳播特定模式中的數(shù)據(jù)庫對象的DML或DDL變更?!と忠?guī)則,傳播源隊列中的所有DML或所有DDL變更。對于非-LCR事件和具有特殊需要的LCR事件,用戶可以創(chuàng)建它們自己的規(guī)則來控制傳播過程。指定一個條件的隊列訂閱者導(dǎo)致系統(tǒng)生成一個規(guī)則。一個隊列的所有訂閱者的規(guī)則集被結(jié)合進(jìn)單一系統(tǒng)生成的規(guī)則集,使訂閱更高效。應(yīng)用過程綜述根據(jù)一實施例,應(yīng)用過程是使邏輯變更記錄(LCR)和來自一特定隊列的用戶消息出列或直接應(yīng)用每一個或者將之作為參數(shù)傳送給用戶定義的程序的后臺過程。被應(yīng)用過程出列的LCR包含應(yīng)用過程可以應(yīng)用于目的數(shù)據(jù)庫中的數(shù)據(jù)庫對象的數(shù)據(jù)操縱語言(DML)變更或數(shù)據(jù)定義語言(DDL)變更。被應(yīng)用過程出列的用戶定義的消息屬于SYS.AnyData類型,可以包含任何用戶消息,包括用戶創(chuàng)建的LCR。應(yīng)用過程應(yīng)用的事件被應(yīng)用用戶應(yīng)用。該應(yīng)用用戶是應(yīng)用所有的DML語句和DDL語句以及運(yùn)行用戶定義的應(yīng)用處理程序的用戶。應(yīng)用規(guī)則應(yīng)用過程基于用戶定義的規(guī)則應(yīng)用變更。每個規(guī)則指定了應(yīng)用過程將變更應(yīng)用到其的數(shù)據(jù)庫對象以及所應(yīng)用的變更類型。用戶可以指定下面等級的應(yīng)用規(guī)則·表格規(guī)則,對特定表應(yīng)用DML或DDL變更。子集規(guī)則是包括對特定表格的變更子集的表格規(guī)則?!つJ揭?guī)則,對特定模式中的數(shù)據(jù)庫對象應(yīng)用DML或DDL變更?!と忠?guī)則,在與應(yīng)用過程相關(guān)聯(lián)的隊列中應(yīng)用所有DML或所有DDL變更。對于非-LCR事件和具有特殊需要的LCR事件,用戶可以創(chuàng)建它們自己的規(guī)則來控制應(yīng)用過程的行為。利用應(yīng)用過程的事件處理應(yīng)用過程是一種用于處理隊列中事件的靈活的機(jī)制。用戶具有選項,以考慮用戶何時為你的環(huán)境配置一個或多個應(yīng)用過程。這部分討論應(yīng)用過程可以應(yīng)用的事件的類型和它可以應(yīng)用它們的方式。根據(jù)一實施例,單一應(yīng)用過程可以應(yīng)用被捕獲的事件或被用戶入列的事件,但不是兩者。如果目的數(shù)據(jù)庫的隊列包含被捕獲的和被用戶入列的事件,那么目的數(shù)據(jù)庫必須具有至少兩個應(yīng)用過程來處理事件。根據(jù)一實施例,當(dāng)用戶創(chuàng)建應(yīng)用過程時,用戶使用應(yīng)用被捕獲的參數(shù)(aapplycapturedparameter)指定應(yīng)用過程是否應(yīng)用被捕獲的或被用戶入列的事件。產(chǎn)生事件的數(shù)據(jù)庫對于用于被捕獲的事件而不是用于被用戶入列的事件的應(yīng)用過程很重要。對于一個被捕獲的事件,源數(shù)據(jù)庫是重做日志中產(chǎn)生變更的數(shù)據(jù)庫。根據(jù)一實施例,對于被用戶入列的事件,應(yīng)用過程忽略關(guān)于事件產(chǎn)生的數(shù)據(jù)庫的信息,即使事件是被用戶入列的LCR。單一應(yīng)用過程可以應(yīng)用在不同數(shù)據(jù)庫產(chǎn)生的被用戶入列的事件。事件處理選項用于事件處理的選項依賴于應(yīng)用過程接收的事件的種類。圖8示出了應(yīng)用過程的事件處理選項。來自多個數(shù)據(jù)庫的捕獲的LCR可以被發(fā)送到單一目的隊列。如果單一隊列包含來自多個數(shù)據(jù)庫的捕獲的LCR,那么一個或多個應(yīng)用過程可以被用于獲取這些LCR。當(dāng)使用多個應(yīng)用過程時,這些應(yīng)用過程中的每一個應(yīng)用過程都可以用于使用規(guī)則接收來自恰好一個源數(shù)據(jù)庫的捕獲的LCR。如果在源數(shù)據(jù)庫上運(yùn)行多個捕獲過程,以及來自一個以上這些捕獲過程的LCR被應(yīng)用在目的數(shù)據(jù)庫,那么一個或多個應(yīng)用過程可以用于應(yīng)用變更。用戶可以配置應(yīng)用過程來以下面的方式處理包含LCR的被捕獲的或被用戶入列的事件直接應(yīng)用事件或?qū)⑹录鳛閰?shù)傳送給用戶程序用于處理。下面的部分解釋了這些選項。直接應(yīng)用LCR事件如果用戶使用這一選項,那么應(yīng)用過程應(yīng)用該事件而不必運(yùn)行用戶程序。應(yīng)用過程或者成功地將LCR中的變更應(yīng)用于數(shù)據(jù)庫對象,或者如果遇到?jīng)_突或應(yīng)用錯誤,設(shè)法利用沖突處理程序或被稱作錯誤處理程序的用戶指定的程序來解決錯誤。如果沖突處理程序可以解決沖突,那么它應(yīng)用LCR或者刪掉LCR中的變更。如果錯誤處理程序可以解決錯誤,那么如果適當(dāng)?shù)脑挘鼞?yīng)該應(yīng)用LCR。錯誤處理程序可以通過在應(yīng)用LCR之前修改它來解決錯誤。如果錯誤處理程序不能解決錯誤,那么應(yīng)用過程將事務(wù)以及與該事務(wù)有關(guān)的所有LCR放入異常隊列中。調(diào)用用戶程序來處理LCR事件如果用戶使用這一選項,那么應(yīng)用過程將該事件作為一個參數(shù)傳送給用戶程序用于處理。用戶程序然后可以以定制的方式處理事件。處理由DML語句產(chǎn)生的行LCR的用戶程序被稱作DML處理程序,而處理由DDL語句產(chǎn)生的DDLLCR的用戶程序被稱作DDL處理程序。應(yīng)用過程可以擁有許多DML處理程序和DDL處理程序。對于與應(yīng)用過程有關(guān)的每一個表格,用戶可以設(shè)置一個單獨(dú)的DML處理程序處理行LCR中每一個下面類型的操作INSERTUPDATEDELETELOBUPDATE例如,hr.employees表可以有一個DML處理程序處理INSERT操作以及一個不同的DML處理程序處理UPDATE操作。用戶程序可以用于任何定制的LCR處理。例如,如果用戶需要每次在源數(shù)據(jù)庫插入特定表都導(dǎo)致在目的數(shù)據(jù)庫插入多個表,那么用戶為完成這一目標(biāo)可以創(chuàng)建處理在處理表上的INSERT操作的用戶程序?;蛘?,如果用戶想要在應(yīng)用它們之前將DDL變更記入日志,那么用戶為完成這一目標(biāo)可以創(chuàng)建處理DDL操作的用戶程序。非-LCR用戶消息處理不包含LCR的被用戶入列的事件由被指定用于應(yīng)用過程的消息處理程序處理,如果被用戶入列的事件滿足用于應(yīng)用過程的規(guī)則集中的至少一個規(guī)則。消息處理程序是一個可以為你的環(huán)境以定制的方式處理非-LCR用戶消息的用戶定義的程序。消息處理程序在任何具有需要更新一個或多個遠(yuǎn)程數(shù)據(jù)庫或執(zhí)行某種其它遠(yuǎn)程動作的應(yīng)用的環(huán)境下提供優(yōu)勢。這些應(yīng)用程序可以使用戶消息進(jìn)入本地數(shù)據(jù)庫的隊列,信息共享系統(tǒng)100可以將每個用戶消息傳播到目的數(shù)據(jù)庫的適當(dāng)?shù)年犃?。如果存在多個目的地,那么信息共享系統(tǒng)100為自動傳播和處理這些目的地的消息提供基礎(chǔ)設(shè)施(infrastructure)。如果僅有一個目的地,那么信息共享系統(tǒng)100還在源數(shù)據(jù)庫的應(yīng)用程序和目的數(shù)據(jù)庫的應(yīng)用程序之間提供一層,因此,如果遠(yuǎn)程數(shù)據(jù)庫的應(yīng)用程序變得不可使用,那么源數(shù)據(jù)庫的應(yīng)用程序可以繼續(xù)正常起作用。例如,消息處理程序可以將用戶消息格式化成電子郵件消息。在這種情況下,用戶消息可以包含用戶將在電子郵件消息中期望的屬性,諸如從、到、主題、消息文本等。消息處理程序可以將這些用戶消息轉(zhuǎn)換成電子郵件消息并將它們通過電子郵件網(wǎng)關(guān)發(fā)送出去。應(yīng)用過程組件根據(jù)本發(fā)明的一實施例,應(yīng)用過程包括讀者服務(wù)器(readerserver)、協(xié)調(diào)過程(coordinatorprocess)和一個或多個應(yīng)用服務(wù)器。讀者服務(wù)器使事件出列。讀者服務(wù)器是計算LCR之間相關(guān)性以及將事件集合到事務(wù)中的并行執(zhí)行服務(wù)器。然后讀者服務(wù)器將集合的事務(wù)返回協(xié)調(diào)器,協(xié)調(diào)器將它們指定為空閑的應(yīng)用服務(wù)器。協(xié)調(diào)過程從讀者服務(wù)器獲得事務(wù)并將它們傳送給應(yīng)用服務(wù)器。應(yīng)用服務(wù)器將LCR作為DML或DDL語句應(yīng)用到數(shù)據(jù)庫對象或者將LCR傳送到它們適當(dāng)?shù)奶幚沓绦颉τ诜?LCR消息,應(yīng)用服務(wù)器將事件傳送給消息處理程序。每個應(yīng)用服務(wù)器都是并行執(zhí)行服務(wù)器。如果應(yīng)用服務(wù)器遇到錯誤,那么它試圖利用用戶指定的錯誤處理程序解決錯誤。如果應(yīng)用服務(wù)器不能解決錯誤,那么它回滾事務(wù)并將整個事務(wù)(包括事件的所有)放入異常隊列中。當(dāng)應(yīng)用服務(wù)器提交已完成的事務(wù)時,該事務(wù)已被應(yīng)用。當(dāng)應(yīng)用服務(wù)器將事務(wù)放入異常隊列以及提交時,該事務(wù)也已被應(yīng)用。如果正被應(yīng)用服務(wù)器處理的事務(wù)與另一不知已被應(yīng)用的事務(wù)存在相關(guān)性,那么應(yīng)用服務(wù)器聯(lián)系協(xié)調(diào)器并等候指示。協(xié)調(diào)器監(jiān)控所有的應(yīng)用服務(wù)器以保證事務(wù)以正確的順序被應(yīng)用和提交。例如,考慮這兩種事務(wù)1.一行被插入到表格中。2.相同的行被更新來變更某些列值。在這種情況下,事務(wù)2依賴于事務(wù)1,這是因為行在被插入到表中之后才能被更新。假設(shè)這些事務(wù)從源數(shù)據(jù)庫的重做日志被捕獲,傳播到目的數(shù)據(jù)庫并在目的數(shù)據(jù)庫應(yīng)用。應(yīng)用服務(wù)器A處理插入事務(wù),應(yīng)用服務(wù)器B處理更新事務(wù)。如果應(yīng)用服務(wù)器B在應(yīng)用服務(wù)器A已應(yīng)用插入事務(wù)之前準(zhǔn)備好應(yīng)用更新事務(wù),那么應(yīng)用服務(wù)器B等候來自協(xié)調(diào)器的指示。在應(yīng)用服務(wù)器A已應(yīng)用插入事務(wù)之后,協(xié)調(diào)過程指示應(yīng)用服務(wù)器B應(yīng)用更新事務(wù)。規(guī)則組件根據(jù)一實施例,規(guī)則是使客戶端能夠在事件發(fā)生以及一個條件被滿足時執(zhí)行一個動作的數(shù)據(jù)庫對象。規(guī)則由一個規(guī)則引擎來評價,根據(jù)一實施例,規(guī)則引擎內(nèi)置于管理信息共享系統(tǒng)100的數(shù)據(jù)庫服務(wù)器中。用戶創(chuàng)建的應(yīng)用和信息共享系統(tǒng)100可以是規(guī)則引擎的客戶端。根據(jù)一實施例,規(guī)則由下面的組件組成·規(guī)則條件·規(guī)則評價環(huán)境(可選的)·規(guī)則動作環(huán)境(可選的)每個規(guī)則被指定作為一個類似于SQL查詢的WHERE語句中的條件。用戶可以將相關(guān)的規(guī)則分成規(guī)則集。單一規(guī)則可以在一個規(guī)則集中、多個規(guī)則集中或不在規(guī)則集中。規(guī)則條件結(jié)合了一個或多個表達(dá)式和運(yùn)算符并返回一個布爾(Boolean)值,該布爾值是TRUE、FALSE或NULL(未知)值。表達(dá)式是一個或多個值和求出值的運(yùn)算符的結(jié)合。值可以是表中的數(shù)據(jù)、變量中的數(shù)據(jù)或被SQL函數(shù)或PL/SQL函數(shù)返回的數(shù)據(jù)。例如,下面的條件由兩個表達(dá)式(department-id和30)以及一個運(yùn)算符(-)組成departmentid=30當(dāng)department-id列為30時,對于給定行,該邏輯條件評價為TRUE。在此,該值是表格的departmentid列中的數(shù)據(jù)。單一規(guī)則條件可以包括一個以上與AND、OR和NOT條件運(yùn)算符結(jié)合的條件來形成復(fù)合條件。例如,考慮下面的復(fù)合條件departmentid=30ORjob_title=′Programmer′該規(guī)則條件包含由OR條件運(yùn)算符加入的兩個條件。如果兩個條件的任何一個評價為TRUE,那么規(guī)則條件評價為TRUE。如果條件運(yùn)算符是AND而不是OR,那么為了使整個規(guī)則條件評價為TRUE,兩個條件需要都評價為TRUE。規(guī)則條件中的變量規(guī)則條件可以包含變量。根據(jù)一實施例,規(guī)則條件中的變量之前有一個冒號()。下面是規(guī)則條件中使用的變量的實例x=55變量使用戶能夠指示未儲存在表中的數(shù)據(jù)。一個變量也可以通過代替一個常發(fā)生的表達(dá)式提高性能。性能可以提高,這是因為變量被評價一次而不是對相同的表達(dá)式評價多次。規(guī)則條件也可以包含對一個子程序的調(diào)用的評價。這些條件以與其它條件相同的方式被評價。也就是,它們評價的值為TRUE、FALSE或未知值。下面是一個包含確定一個雇員是否為經(jīng)理的名稱為is_Manager的簡單函數(shù)調(diào)用的條件的實例is_manager(employeeid)=′Y′在此,employee_id的值由employee_id是一個列的表中的數(shù)據(jù)確定。用戶可以使用用戶定義的類型用于變量。所以,變量可以具有屬性。當(dāng)變量具有屬性時,每個屬性都包含變量的部分?jǐn)?shù)據(jù)。在規(guī)則條件中,用戶使用圓點(diǎn)符號來指定屬性。例如,如果變量y的屬性z的值為9,下面的條件評價為TRUEy.z=9簡單規(guī)則條件一個簡單規(guī)則條件是具有下面形式之一的條件·簡單-規(guī)則-表達(dá)式運(yùn)算符常數(shù)·常數(shù)運(yùn)算符簡單-規(guī)則-表達(dá)式規(guī)則組件在一個簡單規(guī)則條件中,簡單規(guī)則表達(dá)式是下面之一·表列·變量·變量屬性·方法結(jié)果,其中方法沒有自變量,方法結(jié)果可以由變量方法函數(shù)返回,因此表達(dá)式是數(shù)字類型或字符類型對于表列、變量和變量屬性,支持所有數(shù)字(NUMBER、FLOAT、DOUBLE、INTEGER)和字符(CHAR、VARCHAR2)類型。其它類型的表達(dá)式的使用導(dǎo)致非簡單規(guī)則條件。在簡單規(guī)則條件中,運(yùn)算符是下面之一=,<=,或>=其它運(yùn)算符的使用導(dǎo)致非簡單規(guī)則條件。常數(shù)是固定值。常數(shù)可以是數(shù)字,諸如12或5.4,字符,諸如x或$字符串,諸如“thisisastring”。所以,下面的條件是簡單規(guī)則條件tabl.col=5·v1>′aaa′·v2.al<10.0l·v3.m()=10規(guī)則集評價規(guī)則引擎基于事件評價規(guī)則集。事件是由規(guī)則引擎的客戶端定義的事件??蛻舳送ㄟ^調(diào)用DBMS-RULE.EVALUATE程序發(fā)起對事件的評價。當(dāng)客戶端調(diào)用DBMS-RULE.EVALUATE程序時客戶指定的信息包括如下包含用于評價事件的規(guī)則的規(guī)則集的名稱。評價環(huán)境用于評價。僅僅評價使用指定的評價環(huán)境的規(guī)則。表值和變量值表值包含指示表行中的數(shù)據(jù)的行標(biāo)識符,變量值包含用于顯式變量的數(shù)據(jù)。為隱式變量指定的值取代可能使用變量值評價函數(shù)得到的值。如果一個被指定的變量具有屬性,那么客戶端可以發(fā)送用于整體變量的值,或客戶端可以發(fā)送用于任意數(shù)量的變量屬性的值。然而,如果整體變量的值被指定,客戶端不能指定屬性值??蛇x的事件環(huán)境事件環(huán)境是類型為SYS.RE$NV_LIST的可變長度陣列,它包含具有相關(guān)事件的信息的名稱-值對。這個可選的信息不直接被規(guī)則引擎使用或解釋。而是它被傳送到客戶端返回調(diào)用,諸如評價函數(shù)、變量值評價函數(shù)(對于隱式變量)和可變方法函數(shù)??蛻舳艘部梢园l(fā)送其它有關(guān)事件以及如何使用DBMS-RULE.EVALUATE程序評價事件的信息。例如,調(diào)用者可以指定評價是否在發(fā)現(xiàn)第一TRUE規(guī)則或第一MAYBE規(guī)則(如果沒有TRUE規(guī)則)時就必須停止。規(guī)則引擎使用被指定的規(guī)則集中的規(guī)則評價事件。然后規(guī)則引擎將結(jié)果返回給客戶端。規(guī)則引擎使用EVALUATE程序中的兩個OUT參數(shù)返回規(guī)則true-rules和maybe_rules。也就是,true-rules參數(shù)返回評價為TRUE的規(guī)則,可選地,maybe_rules參數(shù)返回給定更多信息時下可能評價為TRUE的規(guī)則。圖14示出了規(guī)則集評價過程1.客戶端定義的事件發(fā)生。2.客戶端通過運(yùn)行DBMS-RULE.EVALUATE程序?qū)⑹录l(fā)送至規(guī)則引擎。3.規(guī)則引擎基于規(guī)則集中的規(guī)則和相關(guān)的評價環(huán)境評價事件??蛻舳嗽趯BMS-RULE.EVALUATE程序的調(diào)用中指定規(guī)則集和評價環(huán)境。僅僅在指定的規(guī)則集中和使用指定的評價環(huán)境的規(guī)則被用于評價。4.規(guī)則引擎獲得評價的結(jié)果。每個規(guī)則都評價為TRUE、FALSE或NULL(未知)。5.規(guī)則引擎將評價為TRUE的規(guī)則返回至客戶端。每個返回的規(guī)則和它的整體動作環(huán)境一起返回,其可能包含信息或者可以為NULL。6.客戶端基于規(guī)則引擎返回的結(jié)果執(zhí)行動作。規(guī)則引擎不執(zhí)行基于規(guī)則評價的動作。規(guī)則如何用于信息共享系統(tǒng)100綜述在信息共享系統(tǒng)100中,當(dāng)機(jī)制與一個規(guī)則集相關(guān)時,下面的每個機(jī)制是一個規(guī)則引擎的客戶端捕獲過程、傳播過程和應(yīng)用過程。在一實施例中,這些機(jī)制的每一個可以與至多一個規(guī)則集相關(guān)聯(lián)。然而,單一規(guī)則集可以在相同的數(shù)據(jù)庫內(nèi)被多個捕獲過程、傳播過程和應(yīng)用過程使用。圖15舉例說明了規(guī)則引擎的多個客戶端可以使用一個規(guī)則集。特別地,用戶使用信息共享系統(tǒng)100中的規(guī)則集做下面的事情(1)指定一個捕獲過程從重做日志捕獲的變更。也就是,如果重做日志中發(fā)現(xiàn)的變更導(dǎo)致與捕獲過程相關(guān)的規(guī)則集中的任何規(guī)則評價為TRUE,那么該變更由捕獲過程捕獲。(2)指定傳播過程從一個隊列傳播到另一隊列的事件。也就是,如果隊列中的事件導(dǎo)致與傳播過程相關(guān)的規(guī)則集中的任何規(guī)則評價為TRUE,那么該事件由傳播過程傳播。(3)指定應(yīng)用過程從一個隊列中獲取的事件。也就是,如果隊列中的事件導(dǎo)致與應(yīng)用過程相關(guān)的規(guī)則集中的任何規(guī)則評價為TRUE,那么該事件由應(yīng)用過程獲取和處理。在傳播過程或應(yīng)用過程的情況下,對比規(guī)則集評價的事件可以是被捕獲的事件或被用戶入列的事件。如果存在與一種機(jī)制相關(guān)的沖突規(guī)則,那么如果任一規(guī)則評價為TRUE,該機(jī)制執(zhí)行該任務(wù)。例如,如果與捕獲過程相關(guān)的規(guī)則集包含一個指示捕獲過程捕獲hr.employees表的DML變更的規(guī)則,但規(guī)則集中的另一規(guī)則指示捕獲過程不捕獲hr.employees表的DML變更,那么捕獲過程捕獲hr.employees表的DML變更。系統(tǒng)創(chuàng)建的規(guī)則信息共享系統(tǒng)100基于規(guī)則執(zhí)行三種任務(wù)利用捕獲過程捕獲變更,利用傳播過程傳播變更,以及利用應(yīng)用過程應(yīng)用變更。用戶創(chuàng)建的規(guī)則和系統(tǒng)創(chuàng)建的規(guī)則均可以用于控制如何執(zhí)行這些任務(wù)中的每個任務(wù)。而且,這些任務(wù)的任何一個可以被包括系統(tǒng)創(chuàng)建的規(guī)則和用戶創(chuàng)建的規(guī)則的單一規(guī)則集控制。系統(tǒng)創(chuàng)建的規(guī)則為一個任務(wù)指定了下面的粒度級(granularity)之一表格、模式或全局。這部分描述了這些等級中的每一個。用戶可以為特定任務(wù)指定一個以上等級。例如,用戶可以指示單一應(yīng)用過程對oe模式中的表執(zhí)行表-級應(yīng)用以及對整個hr模式執(zhí)行模式-級的應(yīng)用。圖6-1示出了對于每個信息共享系統(tǒng)100任務(wù)每個等級的規(guī)則的含義。任務(wù)類型和規(guī)則等級基于規(guī)則的轉(zhuǎn)換和捕獲過程如果捕獲過程使用一個規(guī)則集,那么為了在捕獲過程中執(zhí)行轉(zhuǎn)換必須滿足下面的兩個條件對于重做日志中發(fā)現(xiàn)的特定變更,規(guī)則評價為TRUE。動作環(huán)境包含一個具有一個特定的系統(tǒng)識別的名稱的名稱-值對。當(dāng)規(guī)則被評價時TRANSFORMFUNCTION返回至捕獲過程。給定這些條件,捕獲過程完成下面的步驟1.將重做日志中的變更格式化成LCR2.將LCR轉(zhuǎn)換成SYS.AnyData對象3.運(yùn)行名稱-值對中的PL/SQL函數(shù)以轉(zhuǎn)換SYS.AnyData對象4.使被轉(zhuǎn)換的SYS.AnyData對象進(jìn)入與捕獲過程相關(guān)聯(lián)的隊列圖16示出了捕獲過程中的轉(zhuǎn)換。例如,如果一個事件在捕獲過程中被轉(zhuǎn)換,那么被轉(zhuǎn)換的事件排隊進(jìn)入源隊列。所以,如果這樣被捕獲的事件被從dbs1.net數(shù)據(jù)庫傳播到dbs2.net和dbs3.net數(shù)據(jù)庫,那么在dbs2.net和dbs3.net的隊列將在傳播之后包含被轉(zhuǎn)換的事件。在捕獲過程中執(zhí)行轉(zhuǎn)換的好處如下如果轉(zhuǎn)換除去或改變私人信息,那么可以提高安全性,這是因為該私人信息不會在源隊列中出現(xiàn)且不會傳播到任何目的隊列。根據(jù)所執(zhí)行的轉(zhuǎn)換的類型,可以減少空間消費(fèi)。例如,減少數(shù)據(jù)量的轉(zhuǎn)換導(dǎo)致入列、傳播和應(yīng)用的數(shù)據(jù)更少。當(dāng)對于一個被轉(zhuǎn)換的事件存在多個目的隊列時,轉(zhuǎn)換開銷減少,這是因為在源隊列執(zhí)行轉(zhuǎn)換僅僅一次,而不是在多個目的隊列執(zhí)行轉(zhuǎn)換。在捕獲過程中執(zhí)行轉(zhuǎn)換的可能缺點(diǎn)如下·所有站點(diǎn)接收被轉(zhuǎn)換的事件?!ぴ谠磾?shù)據(jù)庫中發(fā)生轉(zhuǎn)換開銷?!ぴ诓东@過程中發(fā)生基于規(guī)則的轉(zhuǎn)換錯誤。如果在捕獲過程中運(yùn)行轉(zhuǎn)換函數(shù)時發(fā)生錯誤,那么變更不被捕獲,錯誤返回至捕獲過程,捕獲過程失效。在捕獲過程啟動之前,用戶必須變更或除去基于規(guī)則的轉(zhuǎn)換以避免錯誤?;谝?guī)則的轉(zhuǎn)換和傳播如果傳播過程使用規(guī)則集,那么對于在傳播過程中將要執(zhí)行的轉(zhuǎn)換必須滿足下面的條件·對于源隊列中用于傳播的事件,規(guī)則評價為TRUE。該事件可以是被捕獲的事件或者是一個被用戶入列的事件?!幼鳝h(huán)境包含具有特定的、系統(tǒng)識別的名稱的名稱-值對。·當(dāng)規(guī)則被評價時,TRANSFORM-FUNCTION返回傳播過程。給定這些條件,傳播過程完成下面的步驟1.開始使事件從源隊列出列2.運(yùn)行名稱-值對中的PL/SQL函數(shù)以轉(zhuǎn)換事件3.完成使被轉(zhuǎn)換的事件出列4.將被轉(zhuǎn)換的事件傳播到目的隊列圖17示出了傳播過程中的轉(zhuǎn)換。在下文給出的幾個實例中,正在被轉(zhuǎn)換的信息具有LCR的形式。然而,如上面所解釋的,LCR僅僅是一種可以使用系統(tǒng)100被共享的信息的類型。這樣,在此所述的各種技術(shù),包括基于規(guī)則的轉(zhuǎn)換,同樣適用,而不管正被共享的信息的形式。再次參照圖17,假設(shè)用戶使用基于規(guī)則的轉(zhuǎn)換,用于從dbs1.net數(shù)據(jù)庫到dbs2.net數(shù)據(jù)庫的傳播,但用戶不使用基于規(guī)則的轉(zhuǎn)換,用于從dbs1.net數(shù)據(jù)庫到dbs3.net數(shù)據(jù)庫的傳播。在這種情況下,在dbs1.net的隊列中的事件可以在它傳播到dbs2.net之前轉(zhuǎn)換,但相同的事件可以在它傳播到dbs3.net時保留它的原始形式。在這種情況下,在傳播之后,在dbs2.net的隊列包含被轉(zhuǎn)換的事件,在dbs3.net的隊列包含原始事件。傳播過程中執(zhí)行轉(zhuǎn)換的優(yōu)點(diǎn)如下如果轉(zhuǎn)換在傳播事件之前除去或變更私人信息,可以提高安全性。一些目的隊列可以接收被轉(zhuǎn)換的事件,而其它的目的隊列可以接收原始事件。不同的目的地可以接收相同事件的不同變量。傳播過程中執(zhí)行轉(zhuǎn)換可能的缺點(diǎn)如下一旦事件被轉(zhuǎn)換,在第一個傳播之后事件被傳播到的任何數(shù)據(jù)庫接收被轉(zhuǎn)換的事件。例如,如果dbs2.net將事件傳播到dbs4.net,那么dbs4.net接收被轉(zhuǎn)換的事件。當(dāng)有向網(wǎng)絡(luò)中的第一傳播過程執(zhí)行轉(zhuǎn)換時,在源數(shù)據(jù)庫上發(fā)生轉(zhuǎn)換開銷。當(dāng)多個目的數(shù)據(jù)庫需要相同的轉(zhuǎn)換時,相同的轉(zhuǎn)換可以進(jìn)行多次。如果在傳播過程中運(yùn)行轉(zhuǎn)換函數(shù)時發(fā)生錯誤,那么導(dǎo)致錯誤的事件不會出列,事件不會被傳播,以及錯誤被返回傳播過程。在事件可以被傳播之前,用戶必須改變或除去基于規(guī)則的轉(zhuǎn)換以避免錯誤?;谝?guī)則的轉(zhuǎn)換和應(yīng)用過程如果應(yīng)用過程使用規(guī)則集,那么在應(yīng)用過程中將要執(zhí)行的轉(zhuǎn)換必須滿足下面的兩個條件·對于與應(yīng)用過程相關(guān)聯(lián)的隊列中的事件,規(guī)則評價為TRUE。該事件可以是被捕獲的事件或者是被用戶入列的事件?!幼鳝h(huán)境包含具有特定的、系統(tǒng)識別的名稱的名稱-值對。·當(dāng)規(guī)則被評價時,TRANSFORM_FUNCTION返回應(yīng)用過程。給定這些條件,應(yīng)用過程完成下面的步驟1.開始使事件從隊列出列2.運(yùn)行名稱-值對中的PL/SQL函數(shù),以在出列過程中轉(zhuǎn)換事件3.完成使被轉(zhuǎn)換的事件出列4.應(yīng)用被轉(zhuǎn)換的事件例如,假設(shè)事件以它的原始形式從dbs1.net數(shù)據(jù)庫傳播到dbs2.net數(shù)據(jù)庫。當(dāng)應(yīng)用過程使事件從dbs2.net的隊列出列時,事件被轉(zhuǎn)換。在應(yīng)用期間執(zhí)行轉(zhuǎn)換的可能優(yōu)點(diǎn)如下在第一傳播過程之后,事件被傳播到的任何數(shù)據(jù)庫可以接收原始形式事件。例如,如果dbs2.net將事件傳播到dbs4.net,那么dbs4.net可以接收原始事件。當(dāng)源數(shù)據(jù)庫和目的數(shù)據(jù)庫不同時,在源數(shù)據(jù)庫上不會發(fā)生轉(zhuǎn)換開銷。在應(yīng)用過程中執(zhí)行轉(zhuǎn)換可能的缺點(diǎn)如下如果事件包含私人信息,安全性可能是一個值得關(guān)注的事,這是因為事件被傳播到的所有數(shù)據(jù)庫接收原始事件。當(dāng)多個目的數(shù)據(jù)庫需要相同的轉(zhuǎn)換時,相同的轉(zhuǎn)換可以進(jìn)行多次。在應(yīng)用過程出列過程中的基于規(guī)則的轉(zhuǎn)換錯誤如果在應(yīng)用過程出列過程中運(yùn)行轉(zhuǎn)換函數(shù)時發(fā)生錯誤,那么導(dǎo)致錯誤的事件不會出列,包含事件的事務(wù)不會被應(yīng)用,錯誤返回應(yīng)用過程,以及應(yīng)用過程失效。在應(yīng)用過程啟動之前,用戶必須變更或除去基于規(guī)則的轉(zhuǎn)換以避免錯誤。與網(wǎng)關(guān)集成根據(jù)一實施例,通過(1)讀取LCR來識別LCR中反映的變更,(2)構(gòu)造一個將導(dǎo)致需要的變更的數(shù)據(jù)庫命令(例如一個SQL命令),以及(3)對數(shù)據(jù)庫執(zhí)行數(shù)據(jù)庫命令,應(yīng)用過程可以用于將LCR的集合“應(yīng)用”到數(shù)據(jù)庫。根據(jù)一實施例,應(yīng)用過程可以用于為不同于最初作出反映在LCR中的變更的數(shù)據(jù)庫構(gòu)造一個遠(yuǎn)程SQL語句。當(dāng)在遠(yuǎn)程數(shù)據(jù)庫內(nèi)執(zhí)行時,SQL語句將導(dǎo)致在遠(yuǎn)程數(shù)據(jù)庫上作出需要的變更。一旦這種遠(yuǎn)程SQL語句被構(gòu)造,SQL語句可以通過網(wǎng)關(guān)發(fā)送到遠(yuǎn)程數(shù)據(jù)庫。例如,必要時,當(dāng)遠(yuǎn)程數(shù)據(jù)庫是一種不同于源數(shù)據(jù)庫類型的數(shù)據(jù)庫時,網(wǎng)關(guān)可以用于轉(zhuǎn)換查詢。例如,響應(yīng)于Oracle數(shù)據(jù)庫中作出的變更,創(chuàng)建LCR的集合?;贚CR,應(yīng)用過程可以構(gòu)造一個遠(yuǎn)程SQL查詢,將SQL查詢發(fā)送給網(wǎng)關(guān)。然后必要時,網(wǎng)關(guān)可以在將查詢轉(zhuǎn)發(fā)給非-Oracle數(shù)據(jù)倉庫之前轉(zhuǎn)換SQL。然后,響應(yīng)于最初基于Oracle數(shù)據(jù)庫作出的變更的LCR,非-Oracle數(shù)據(jù)倉庫可以執(zhí)行查詢,以異步地和遠(yuǎn)程地實現(xiàn)變更。與閃回集成各種數(shù)據(jù)庫語言,諸如SQL(結(jié)構(gòu)化查詢語言),支持在本文稱作“指針(cursors)”的特殊目的的結(jié)構(gòu)。在獲取特定的查詢語句的結(jié)果之前,DBMS可以為語句(諸如句法分析、語義分析和查詢計劃產(chǎn)生)執(zhí)行大量的預(yù)備工作。指針儲存這個預(yù)備工作多數(shù)的結(jié)果。因此,當(dāng)查詢語句到達(dá)時,DBMS先試圖使該語句與已經(jīng)為其創(chuàng)建指針的語句匹配。如果發(fā)現(xiàn)匹配,指針被查詢語句共享,開銷工作被避免?!伴W回指針”是用于存取過去數(shù)據(jù)的特定類型的指針。響應(yīng)于“閃回查詢”的接收,創(chuàng)建閃回指針。不像傳統(tǒng)的查詢,閃回查詢指定閃回時間,并在指定的閃回時間數(shù)據(jù)存在時返回數(shù)據(jù)。一項用于處理閃回查詢的技術(shù)在JONATHAND.KLEIN等人于2000年9月29日提交的標(biāo)題為“用于提供精細(xì)度的暫時數(shù)據(jù)庫存取的系統(tǒng)和方法(SYSTEMANDMETHODFORPROVIDINGFINE-GRAINEDTEMPORALDATABASEACCESS)”的第No.09/676,305號專利申請中加以描述,該申請的內(nèi)容結(jié)合于此作為參考。根據(jù)一實施例,閃回查詢和指針可以與信息共享系統(tǒng)100結(jié)合使用,以確定如何以下面的方式處理變更(1)與變更異步,以及(2)在變更的同時考慮系統(tǒng)的狀態(tài)。例如,假設(shè)用戶在時刻T10對源數(shù)據(jù)庫作出變更,該變更反映在源數(shù)據(jù)庫的重作日志中。最終,捕獲過程讀取日志以及產(chǎn)生對應(yīng)于該變更的LCR。然后將LCR儲存在中間存儲區(qū)。根據(jù)一實施例,在源數(shù)據(jù)庫保持(提交)變更的時刻被儲存在LCR中。最終,應(yīng)用過程讀取LCR并將之傳送給更新處理程序。到更新處理程序接收LCR的時刻,系統(tǒng)的狀態(tài)相對于時刻T10的系統(tǒng)的狀態(tài)發(fā)生了極大地改變。更新處理程序可以從LCR讀取變更時間T10并執(zhí)行閃回查詢,以查看數(shù)據(jù)庫系統(tǒng)在初始發(fā)生變更的時刻(在時刻T10)存在的狀態(tài)。然后,響應(yīng)于基于在T10的數(shù)據(jù)庫系統(tǒng)的條件的變更,更新處理程序可以決定采取什么動作。閃回查詢一般能夠?qū)⑾嗤愋偷牟僮髦付闃?biāo)準(zhǔn)查詢。因此,更新處理程序查看系統(tǒng)的前面狀態(tài)所使用的閃回查詢可以包括利用在那個前面的時刻存在的值執(zhí)行復(fù)雜的操作。例如,閃回查詢可以執(zhí)行復(fù)雜的結(jié)合和比較,這些結(jié)合和比較均將根據(jù)前一個時刻存在的數(shù)據(jù)值執(zhí)行,以確定響應(yīng)于識別在該前一時刻所作的變更的LCR采取什么動作。標(biāo)記和循環(huán)避免如上所述,可以配置信息共享系統(tǒng)100的各種組件,使得特定的事件主要啟動一個復(fù)雜的活動鏈。由于鏈中的每個活動(例如,事件從一個中間存儲區(qū)到另一中間存儲區(qū)的傳播)本身可以啟動另一活動鏈,循環(huán)有可能形成。例如,假設(shè)信息共享系統(tǒng)100的組件用于將對第一數(shù)據(jù)庫作出的變更傳播到第二數(shù)據(jù)庫,并將對第二數(shù)據(jù)庫作出的變更傳播到第一數(shù)據(jù)庫。在這種情形下,與第一數(shù)據(jù)庫中的變更相關(guān)聯(lián)的事件將被傳播并應(yīng)用到第二數(shù)據(jù)庫。然而,第二數(shù)據(jù)庫的事件的應(yīng)用程序?qū)⒔M成對第二數(shù)據(jù)庫的變更。用于第二數(shù)據(jù)庫的該變更的事件將(沒有用于循環(huán)避免的機(jī)制)被傳播回以及應(yīng)用于第一數(shù)據(jù)庫。第二數(shù)據(jù)庫的事件的應(yīng)用程序?qū)⒔M成對第一數(shù)據(jù)庫的“變更”,這將導(dǎo)致整個過程自我重復(fù)。根據(jù)一實施例,信息共享系統(tǒng)100的各種組件以避免延續(xù)這種循環(huán)的方式設(shè)置標(biāo)記并檢查標(biāo)記。對標(biāo)記的介紹根據(jù)一實施例,重作日志中的每個重作輸入有一個與之相關(guān)聯(lián)的標(biāo)記。標(biāo)記的數(shù)據(jù)類型是RAW。默認(rèn)地,當(dāng)用戶或應(yīng)用程序產(chǎn)生重作輸入時,對于每個重作輸入,標(biāo)記的值為NULL。NULL標(biāo)記不占用重作輸入的空間。機(jī)制被提供以允許用戶配置信息共享系統(tǒng)100的組件來定制組件在信息共享操作中的各種階段如何(1)設(shè)置標(biāo)記值、(2)檢查標(biāo)記值、以及(3)解釋和使用標(biāo)記值。例如,標(biāo)記可以用于決定LCR是否包含產(chǎn)生于本地數(shù)據(jù)庫或不同數(shù)據(jù)庫的變更,因此用戶可以避免變更循環(huán)(把LCR發(fā)送回產(chǎn)生它的數(shù)據(jù)庫)。標(biāo)記也可以用于其它LCR跟蹤目的。用戶也可以使用標(biāo)記為每個LCR指定目的數(shù)據(jù)庫集合。根據(jù)一實施例,各種機(jī)制被提供以允許用戶控制重作日志中產(chǎn)生的標(biāo)記值。這些機(jī)制包括但不局限于下文稱作SET_TAG、CREATE_APPLY以及ALTER_APPLY的程序。SET_TAG程序用于指定目前會話中產(chǎn)生的重作日志的值。當(dāng)在會話中作出數(shù)據(jù)庫變更時,標(biāo)記成為記錄變更的重作輸入的一部分。不同的會話可以有相同的標(biāo)記設(shè)置或不同的標(biāo)記設(shè)置。CREATE_APPLY以及ALTER_APPLY程序用于控制在應(yīng)用過程運(yùn)行時產(chǎn)生的重作標(biāo)記的值。被應(yīng)用過程協(xié)調(diào)器協(xié)調(diào)的所有會話使用這一標(biāo)記設(shè)置。默認(rèn)地,由應(yīng)用過程產(chǎn)生的重作輸入有一個為十六進(jìn)制的′00′(雙零)的標(biāo)記值。這些標(biāo)記成為被捕獲過程從重作日志獲取變?yōu)樗东@的LCR的一部分。基于用于捕獲過程的規(guī)則集中的規(guī)則,用于變更的重作輸入中的標(biāo)記值可以確定是否捕獲變更。類似地,一旦標(biāo)記是LCR的一部分,標(biāo)記值可以確定傳播過程是否傳播LCR以及應(yīng)用過程是否應(yīng)用LCR。轉(zhuǎn)換、DML處理程序或錯誤處理程序的行為也可以根據(jù)標(biāo)記值作出。另外,用戶可以使用用于LCR的SETTAG組成程序為現(xiàn)有的LCR設(shè)置標(biāo)記值。例如,用戶可以在轉(zhuǎn)換過程中在LCR中設(shè)置標(biāo)記。根據(jù)一實施例,用戶創(chuàng)建規(guī)則,默認(rèn)地只有標(biāo)記為NULL時,每個規(guī)則包含一個評價為TRUE的條件。在DML規(guī)則中,條件如下dml.isnulltag()=′Y′在DDL規(guī)則中,條件如下ddl.isnulltagO=′Y′考慮具有單一規(guī)則的規(guī)則集,并假設(shè)該規(guī)則包含這一條件。在這種情況下,捕獲過程、傳播過程和應(yīng)用過程表現(xiàn)為如下方式·只要重做日志中用于變更的標(biāo)記為NULL以及其它規(guī)則條件對該變更評價為TRUE,捕獲過程捕獲該變更。·只要LCR中的標(biāo)記為NULL以及其它規(guī)則條件對LCR評價為TRUE,傳播過程傳播包含LCR的事件。·只要LCR中的標(biāo)記為NULL以及其它規(guī)則條件對LCR評價為TRUE,應(yīng)用過程應(yīng)用包含LCR的事件。特別地,下面的程序被提供以默認(rèn)地創(chuàng)建包含下面條件之一的規(guī)則·ADD_GLOBAL_PROPAGATION_RULES·ADD_GLOBAL_RULES·ADD_SCHEMA_PROPAGATION_RULES·ADD_SCHEMA_RULES·ADD_SUBSET_RULES·ADD_TABLE_PROPAGATION_RULES·ADD_TABLE_RULES如果用戶不需要創(chuàng)建的規(guī)則包含這一條件,那么他們可以當(dāng)用戶運(yùn)行這些程序時,設(shè)置include_tagged_lcr參數(shù)為真。這種設(shè)置導(dǎo)致沒有與規(guī)則中的標(biāo)記相關(guān)的條件。所以,LCR的規(guī)則評價不依賴于標(biāo)記的值。例如,考慮將在dbs1.net源數(shù)據(jù)庫產(chǎn)生的hr.locations表的所有的DML變更評價為TRUE的表-級規(guī)則。假設(shè)運(yùn)行ADD_TABLE_RULES程序產(chǎn)生該規(guī)則BEGINDBMS_STREAMS_ADM.ADD_TABLE_RULES(Table_name=>′hr.locations′,streams_type=>′capture′,streams_name=>′capture′,queue_name=>′streams_queue′,include_tagged_lcr=>false,--注意參數(shù)設(shè)置source_database=>′dbs1.net′,include_dml=>true,include_ddl=>false);END;注意include_tagged_lcr參數(shù)被設(shè)置為假,該設(shè)置是默認(rèn)的。ADD_TABLE_RULES程序利用類似于下面的規(guī)則條件生成一個規(guī)則(((dml.get_object_owner()=′HR′anddml.get_object__name()=′LOCATIONS′))anddml.is_null_tag()=′Y′anddml.get_source_database_name()=′DBS1.NET′)如果捕獲過程使用包含該規(guī)則的規(guī)則集,那么如果用于重做輸入中的變更的標(biāo)記是非-NULL值,諸如′0′或′1′,該規(guī)則評價為FALSE。因此,如果重做輸入包含對hr.locations表的行變更,那么只要用于重做輸入的標(biāo)記為NULL,該變更被捕獲。然而,假設(shè)當(dāng)運(yùn)行ADD_TABLE_RULES時,include_tagged_lcr參數(shù)被設(shè)置為TRUEBEGINDBMS_STREAMS_ADM.ADD_TABLE_RULES(table_name=>′hr.locations′,streams_type=>′capture′,streams_name=>′capture′,queue_name=>′streams_queue′,include_tagged_lcr=>true,--注意參數(shù)設(shè)置source_database=>′dbs1.net′,include_dml=>true,include_ddl=>false);END;在這種情況下,ADD_TABLE_RULES程序利用類似于下面的規(guī)則條件生成一個規(guī)則(((dml.get_object_owner()=′HR′anddml.get_object_name()=′LOCATIONS′))anddml.get_source_database_name()=′DBS1.NET′)注意沒有與該標(biāo)記有關(guān)的條件。如果捕獲過程使用包含該規(guī)則的規(guī)則集,那么如果hr.locations表的DML變更的重做輸入中的標(biāo)記是非-NULL值,諸如′0′或′1′,該規(guī)則評價為TRUE。如果標(biāo)記為NULL,該規(guī)則也評價為TRUE。因此,如果一個重做輸入包含對hr.locations表的DML變更,那么該變更被捕獲而不管標(biāo)記的值。如果用戶正使用全局規(guī)則捕獲和應(yīng)用整個數(shù)據(jù)庫的DDL變更,那么聯(lián)機(jī)備份語句將默認(rèn)地被捕獲、傳播和應(yīng)用。典型地,數(shù)據(jù)庫管理員不需要復(fù)制聯(lián)機(jī)備份語句。相反,他們僅僅需要聯(lián)機(jī)備份語句在它們最初被執(zhí)行的數(shù)據(jù)庫上運(yùn)行。為避免復(fù)制聯(lián)機(jī)備份語句,用戶可以使用下面策略之一·包括一個或多個對在用戶聯(lián)機(jī)備份程序中的SETTAG程序的調(diào)用,將會話標(biāo)記設(shè)置為一個將導(dǎo)致聯(lián)機(jī)備份語句被捕獲過程忽略的值?!な褂脩?yīng)用過程的DDL處理程序以避免應(yīng)用聯(lián)機(jī)備份語句。標(biāo)記和應(yīng)用過程當(dāng)應(yīng)用過程應(yīng)用DML或DDL變更時,它在目的數(shù)據(jù)庫的重做日志中生成輸入。例如,如果應(yīng)用過程應(yīng)用更新表中一行的變更,那么該變更被記錄在目的數(shù)據(jù)庫的重做日志中。用戶可以通過設(shè)置在DBMS_APPLY_ADM包中的CREATE_APPLY或ALTER_APPLY程序中的apply_tag參數(shù)控制這些重做輸入中的標(biāo)記。例如,應(yīng)用過程可以生成等于十六進(jìn)制值′0′(零)或′1′的重做標(biāo)記。由應(yīng)用過程在重做日志中生成的默認(rèn)標(biāo)記值是′00′(雙零)。如果用戶使用程序創(chuàng)建應(yīng)用過程,該值是應(yīng)用過程的默認(rèn)的標(biāo)記值。除了該值是非-NULL值之外,該值沒有特殊之處。該值是非-NULL值是重要的,這是因為由某些過程默認(rèn)地創(chuàng)建的規(guī)則包含一個條件,只有標(biāo)記在重做輸入或LCR中為NULL,該條件才評價為TRUE。用戶在使用ALTER_APPLY程序中可以為現(xiàn)有的應(yīng)用過程變更標(biāo)記值。如果DML處理程序、DDL處理程序或消息處理程序調(diào)用SET_TAG程序,那么由處理程序生成的任何隨后的重做輸入將包括在SET_TAG調(diào)用中指定的標(biāo)記,即使用于應(yīng)用過程的標(biāo)記不同。當(dāng)處理程序退出時,由應(yīng)用過程生成的任何隨后的重做輸入具有為應(yīng)用過程指定的標(biāo)記。利用標(biāo)記避免變更循環(huán)在包括一個以上雙向共享數(shù)據(jù)的數(shù)據(jù)庫的環(huán)境中,用戶可以使用標(biāo)記避免變更循環(huán)。變更循環(huán)意味著將變更發(fā)送回產(chǎn)生變更的數(shù)據(jù)庫。通常,變更循環(huán)應(yīng)該被避免,這是因為它可以導(dǎo)致每個變更通過無限循環(huán)返回到產(chǎn)生它的數(shù)據(jù)庫。這種循環(huán)可以導(dǎo)致數(shù)據(jù)庫中產(chǎn)生的不需要數(shù)據(jù),并給網(wǎng)絡(luò)和環(huán)境的計算機(jī)資源增加負(fù)擔(dān)。使用標(biāo)記和適當(dāng)?shù)囊?guī)則用于捕獲過程、傳播過程和應(yīng)用過程,用戶可以避免這種變更循環(huán)。下面的部分描述各種環(huán)境以及標(biāo)記和規(guī)則如何可以被用于避免在這些環(huán)境中的變更循環(huán)·每個數(shù)據(jù)庫都是用于共享的數(shù)據(jù)的源和目的數(shù)據(jù)庫·主數(shù)據(jù)庫與幾個從屬數(shù)據(jù)庫共享數(shù)據(jù)·主數(shù)據(jù)庫與幾個擴(kuò)展的從屬數(shù)據(jù)庫共享數(shù)據(jù)每個數(shù)據(jù)庫都是用于共享的數(shù)據(jù)的源和目的數(shù)據(jù)庫該情形包括一種環(huán)境,在該環(huán)境下,每個數(shù)據(jù)庫都是對于每個其它數(shù)據(jù)庫的源數(shù)據(jù)庫,每個數(shù)據(jù)庫都是每個其它數(shù)據(jù)庫的目的數(shù)據(jù)庫。每個數(shù)據(jù)庫都與每個其它數(shù)據(jù)庫直接通信。例如,考慮一種在三個Oracle數(shù)據(jù)庫mult1.net、mult2.net和mult3.net之間復(fù)制hr模式中的數(shù)據(jù)庫對象和數(shù)據(jù)的環(huán)境。對hr模式中的表的DML和DDL作出的變更在該環(huán)境中的所有三個數(shù)據(jù)庫被捕獲并傳播到環(huán)境中的每個其它數(shù)據(jù)庫。圖18A-18C舉例說明了一個其中每個數(shù)據(jù)庫都是源數(shù)據(jù)庫的環(huán)境的實例。用戶可以通過以下面的方式配置這種環(huán)境來避免變更循環(huán)在每個數(shù)據(jù)庫配置一個應(yīng)用過程來為來自每個源數(shù)據(jù)庫的變更生成非-NULL重做標(biāo)記。如果用戶使用一個程序創(chuàng)建應(yīng)用過程,那么應(yīng)用過程默認(rèn)地在重做日志中生成具有一個值′00′的非-NULL標(biāo)記。在這種情況下,應(yīng)用過程不要求進(jìn)一步的動作以生成非-NULL標(biāo)記。如果用戶使用CREATE_APPLY程序,那么不設(shè)置應(yīng)用標(biāo)記參數(shù)。此外,應(yīng)用過程默認(rèn)地在重做日志中生成具有值′00′的非-NULL標(biāo)記,且不要求進(jìn)一步的動作。只要用于該變更的重做輸入中的標(biāo)記為NULL,在每個數(shù)據(jù)庫配置捕獲過程以捕獲變更。用戶通過保證捕獲過程使用的規(guī)則集中的每個DML規(guī)則都具有下面的條件來實現(xiàn)這一目標(biāo)dml.isis_null_tag′Y′每個DDL規(guī)則應(yīng)該具有下面的條件ddl.is_null_tag()=′Y′這些規(guī)則條件表明,只要變更的標(biāo)記為NULL,捕獲過程就捕獲一個變更。該配置阻止了變更循環(huán),這是因為應(yīng)用過程所應(yīng)用的所有變更決不會被重新捕獲(它們初始在源數(shù)據(jù)庫被捕獲)。每個數(shù)據(jù)庫都將它對hr模式的所有變更發(fā)送到每個其它數(shù)據(jù)庫。因此,在這種環(huán)境下,沒有變更被丟失,使所有數(shù)據(jù)庫同步。圖19舉例說明了標(biāo)記如何可以被用于多源環(huán)境中的數(shù)據(jù)庫中。主數(shù)據(jù)庫與幾個從屬數(shù)據(jù)庫共享數(shù)據(jù)該情形包含一種信息共享系統(tǒng)100環(huán)境,在該環(huán)境下,一個數(shù)據(jù)庫是主數(shù)據(jù)庫,該主數(shù)據(jù)庫與幾個從屬數(shù)據(jù)庫共享數(shù)據(jù)。從屬數(shù)據(jù)庫僅僅與主數(shù)據(jù)庫共享數(shù)據(jù)。從屬數(shù)據(jù)庫不直接互相共享數(shù)據(jù),但相反,通過主數(shù)據(jù)庫間接地互相共享數(shù)據(jù)。該類型的環(huán)境有時被稱作“輪軸和輪輻”環(huán)境,主數(shù)據(jù)庫是輪軸,從屬數(shù)據(jù)庫是輪輻。在這種環(huán)境下,變更以下面的方式被捕獲、傳播和應(yīng)用主數(shù)據(jù)庫捕獲對共享數(shù)據(jù)的本地變更并將這些變更傳播到所有的從屬數(shù)據(jù)庫,其中,這些變更被本地應(yīng)用在每個從屬數(shù)據(jù)庫。每個從屬數(shù)據(jù)庫捕獲對共享數(shù)據(jù)的本地變更并將這些變更僅僅傳播到主數(shù)據(jù)庫,其中,這些變更被本地應(yīng)用在主數(shù)據(jù)庫。主數(shù)據(jù)庫本地應(yīng)用來自每個從屬數(shù)據(jù)庫的變更。那么,這些變更在主數(shù)據(jù)庫被捕獲并傳播到所有的從屬數(shù)據(jù)庫(除了產(chǎn)生變更的那個數(shù)據(jù)庫)。在這些變更已經(jīng)通過主數(shù)據(jù)庫之后,每個從屬數(shù)據(jù)庫本地應(yīng)用來自其它從屬數(shù)據(jù)庫變更。該配置是應(yīng)用轉(zhuǎn)遞的一個實例。一個可供替換的情形可以使用隊列轉(zhuǎn)發(fā)。如果該環(huán)境使用隊列轉(zhuǎn)發(fā),那么應(yīng)用在主數(shù)據(jù)庫的來自從屬數(shù)據(jù)庫的變更不會在主數(shù)據(jù)庫上被捕獲。相反,這些變更被從主數(shù)據(jù)庫的隊列轉(zhuǎn)發(fā)到所有從屬數(shù)據(jù)庫(除了那個產(chǎn)生該變更的從屬數(shù)據(jù)庫)。例如,考慮在名稱為ps1.net的主數(shù)據(jù)庫和三個名稱為ps2.net、ps3.net和ps3.net的從屬數(shù)據(jù)庫之間復(fù)制hr模式中的數(shù)據(jù)庫對象和數(shù)據(jù)的環(huán)境。hr模式中的表的DML和DDL變更被捕獲于環(huán)境中的主數(shù)據(jù)庫和三個從屬數(shù)據(jù)庫。那么,這些變更如之前所描述的被傳播和應(yīng)用。該環(huán)境使用應(yīng)用轉(zhuǎn)發(fā),不是隊列轉(zhuǎn)發(fā),以通過主數(shù)據(jù)庫在從屬數(shù)據(jù)庫之間共享數(shù)據(jù)。圖20舉例說明了一個具有一個主數(shù)據(jù)庫和多個從屬數(shù)據(jù)庫的環(huán)境的實例。用戶可以通過以下方式配置環(huán)境來避免變更循環(huán)在主數(shù)據(jù)庫ps1.net配置每個應(yīng)用過程,以生成表明它正接收的變更來自的站點(diǎn)的非-NULL重做標(biāo)記。在這個環(huán)境下,主數(shù)據(jù)庫具有至少一個它接收的變更來自的每個從屬數(shù)據(jù)庫的應(yīng)用過程。例如,如果主數(shù)據(jù)庫上的應(yīng)用過程接收來自ps2.net從屬站點(diǎn)的變更,那么該應(yīng)用過程可以為它應(yīng)用的所有變更生成一個等于十六進(jìn)制′2′的原始值。用戶通過把DBMS_APPLY_ADM包中的CREATE_APPLY或ALTER_APPLY程序中的應(yīng)用標(biāo)記參數(shù)設(shè)置為非-NULL值實現(xiàn)這一目標(biāo)。例如,運(yùn)行下面的程序以創(chuàng)建一個生成具有等于十六進(jìn)制值′2′的標(biāo)記的重做輸入的應(yīng)用過程。BEGINDBMS_APPLY_ADM.CREATE_APPLY(queue_name=>′strmadmin.streams_queue′,apply_name=>′apply_ps2′,rule_set_name=>′strmadmin.apply_rules-ps2′,applytag=>HEXTORAW(′2′),apply_captured=>true);END;在每個從屬數(shù)據(jù)庫配置應(yīng)用過程以生成非-NULL重做標(biāo)記。只要標(biāo)記的確切值為非-NULL,則它是無關(guān)緊要的。在該環(huán)境下,每個從屬數(shù)據(jù)庫具有一個應(yīng)用來自主數(shù)據(jù)庫的變更的應(yīng)用過程。如果用戶使用在DBMSINFORMATIONSHARINGSYSTEM100ADM包中的一個程序來創(chuàng)建應(yīng)用過程,那么該應(yīng)用過程默認(rèn)地在重做日志中生成具有值′00′的非-NULL標(biāo)記。在這種情況下,應(yīng)用過程不要求進(jìn)一步的動作來生成非-NULL標(biāo)記。例如,假設(shè)在從屬數(shù)據(jù)庫不存在應(yīng)用過程,在每個從屬數(shù)據(jù)庫運(yùn)行ADD_SCHEMA_RULES程序以創(chuàng)建一個生成具有等于十六進(jìn)制值′00′的標(biāo)記的非-NULL重做輸入的應(yīng)用過程。BEGINDBMS_STREAMS_ADM.ADD_SCHEMA_RULES(schema_name=>′hr′,streams_type=>′apply′,streams_name=>′apply′,queue_name=>′strmadmin.streams_queue′,include_dml=>true,include_dml=>true,sourcedatabase=>′ps1.net′);END;配置主數(shù)據(jù)庫的捕獲過程以捕獲對共享數(shù)據(jù)的變更而不考慮標(biāo)記。當(dāng)用戶運(yùn)行生成捕獲規(guī)則的程序之一時,用戶通過將include_tagged_lcr參數(shù)設(shè)置為真(true)實現(xiàn)這一目標(biāo)。如果用戶為主數(shù)據(jù)庫的捕獲過程創(chuàng)建規(guī)則,那么保證這些規(guī)則不包含is_null_tag條件,這是因為這些條件包含重做日志中的標(biāo)記。例如,在主數(shù)據(jù)庫運(yùn)行下面的程序以產(chǎn)生DML捕獲過程規(guī)則和DDL捕獲過程規(guī)則,這兩個規(guī)則的每一個都具有評價hr模式中的變更為TRUE的條件,而不管該變更的標(biāo)記BEGINDBMS_STREAMS_ADM.ADD_SCHEMA_RULES(schema_name=>′hr′,streams_type=>′capture′,streams_name=>′capture′,queue_name=>′strmadmin.streams_queue′,include_tagged_lcr=>true,--注意參數(shù)設(shè)置include_dml=>true,includeddl=>true);END;只要重做輸入中變更的標(biāo)記為NULL,就在每個從屬數(shù)據(jù)庫配置捕獲過程以捕獲變更。用戶通過保證從屬數(shù)據(jù)庫上的捕獲過程使用的規(guī)則集中的每個DML規(guī)則具有下面的條件實現(xiàn)這一目標(biāo)dml.is_null_tag()=′Y′DDL規(guī)則應(yīng)該具有下面的條件ddl.is_null_tag()=′Y′這些規(guī)則表明只要用于變更的標(biāo)記為NULL,捕獲過程就捕獲一個變更。如果用戶使用DBMSINFORMATIONSHARINGSYSTEM100ADM包生成規(guī)則,那么每個規(guī)則默認(rèn)地具有這些條件之一。如果用戶使用DBMSRULEADM包為從屬數(shù)據(jù)庫上的捕獲過程創(chuàng)建規(guī)則,那么保證每個規(guī)則包含這些條件之一。配置一個從主數(shù)據(jù)庫上的隊列到每個從屬數(shù)據(jù)庫上的隊列的傳播過程。每個傳播過程都應(yīng)該使用規(guī)則集,該規(guī)則集包含指示該傳播過程把主數(shù)據(jù)庫上的隊列中的所有LCR(除了產(chǎn)生于從屬數(shù)據(jù)庫的變更)傳播到從屬數(shù)據(jù)庫上的隊列的規(guī)則。例如,如果傳播過程傳播對從屬數(shù)據(jù)庫ps2.net的變更,這些變更的標(biāo)記等于十六進(jìn)制值′2′,那么用于傳播的規(guī)則應(yīng)該把與hr模式有關(guān)的所有LCR傳播到從屬數(shù)據(jù)庫(除了具有標(biāo)記為′2′的LCR)。對于行LCR,這種規(guī)則應(yīng)該包括下面的條件dml.get_tag()?。紿EXTORAW(′2′)對于DDLLCR,這種規(guī)則應(yīng)該包括下面的條件ddl.get_tag()?。紿EXTORAW(′2′)用戶可以使用CREATE_RULE程序創(chuàng)建具有這些條件的規(guī)則。配置一個從每個從屬數(shù)據(jù)庫上的隊列到主數(shù)據(jù)庫上的隊列的傳播過程。在從屬數(shù)據(jù)庫之一上的一個隊列僅僅包含由從屬數(shù)據(jù)庫上的用戶會話和應(yīng)用程序所作的本地變更,而不是由應(yīng)用過程作的變更。所以,這些傳播不需要進(jìn)一步的配置。這種配置以下面的方式阻止變更循環(huán)·產(chǎn)生于從屬數(shù)據(jù)庫的變更決不會被傳播回那個從屬數(shù)據(jù)庫?!ぎa(chǎn)生于主數(shù)據(jù)庫的變更決不會被傳播回主數(shù)據(jù)庫?!Νh(huán)境中任何數(shù)據(jù)庫上的共享數(shù)據(jù)的所有變更被傳播到環(huán)境中的每個其它數(shù)據(jù)庫。因此,在該環(huán)境下,沒有變更被丟失,所有的數(shù)據(jù)庫是同步。主數(shù)據(jù)庫與幾個擴(kuò)充的從屬數(shù)據(jù)庫共享數(shù)據(jù)在該環(huán)境下,一個主數(shù)據(jù)庫與幾個從屬數(shù)據(jù)庫共享數(shù)據(jù),但從屬數(shù)據(jù)庫有其它的從屬數(shù)據(jù)庫與它們相連,這些其它的從屬數(shù)據(jù)庫將被稱作遠(yuǎn)程從屬數(shù)據(jù)庫。該環(huán)境是一種在“主數(shù)據(jù)庫與幾個從屬數(shù)據(jù)庫共享數(shù)據(jù)”中描述的環(huán)境的擴(kuò)充。遠(yuǎn)程從屬數(shù)據(jù)庫不直接與主數(shù)據(jù)庫共享數(shù)據(jù),但相反,間接地通過一個從屬數(shù)據(jù)庫與主數(shù)據(jù)庫共享數(shù)據(jù)。因此,所共享的數(shù)據(jù)存在于主數(shù)據(jù)庫、每個從屬數(shù)據(jù)庫和每個遠(yuǎn)程從屬數(shù)據(jù)庫。在這些數(shù)據(jù)庫的任何一個上的變更都被捕獲和傳播到所有的其它數(shù)據(jù)庫。圖23舉例說明了一種具有一個主數(shù)據(jù)庫和多個擴(kuò)充的從屬數(shù)據(jù)庫的環(huán)境。在這種環(huán)境下,用戶可以以下面的方式避免變更循環(huán)以在“一個主數(shù)據(jù)庫與幾個從屬數(shù)據(jù)庫共享數(shù)據(jù)”中描述的實例中配置相同的方式配置主數(shù)據(jù)庫。以類似于在“一個主數(shù)據(jù)庫與幾個從屬數(shù)據(jù)庫共享數(shù)據(jù)”中描述的例子中配置每個從屬數(shù)據(jù)庫的方式配置每個遠(yuǎn)程從屬數(shù)據(jù)庫。僅有的區(qū)別是遠(yuǎn)程從屬數(shù)據(jù)庫直接與從屬數(shù)據(jù)庫而不是主數(shù)據(jù)庫共享數(shù)據(jù)。在每個從屬數(shù)據(jù)庫,配置一個應(yīng)用過程以應(yīng)用來自主數(shù)據(jù)庫的具有重作標(biāo)記值等價于十六進(jìn)制值′00′的變更。該值是用于應(yīng)用過程的默認(rèn)標(biāo)記值。在每個從屬數(shù)據(jù)庫,配置一個應(yīng)用過程以應(yīng)用來自每個具有一個用于該遠(yuǎn)程從屬數(shù)據(jù)庫唯一的重作標(biāo)記值的遠(yuǎn)程從屬數(shù)據(jù)庫的變更。在每個從屬數(shù)據(jù)庫配置捕獲過程以捕獲所有對重作日志中的共享數(shù)據(jù)的變更,而不管用于該變更的標(biāo)記值。配置一個從每個從屬數(shù)據(jù)庫上的隊列到主數(shù)據(jù)庫上的隊列的傳播過程。該傳播過程應(yīng)該使用一個規(guī)則集,該規(guī)則集具有指示該傳播過程將從屬數(shù)據(jù)庫上的隊列中的所有LCR(除了產(chǎn)生于主數(shù)據(jù)庫的變更)傳播到主數(shù)據(jù)庫上的隊列的規(guī)則。只要LCR中的標(biāo)記不等于′00′,用戶通過把一個條件添加到評價為TRUE的規(guī)則上,來實現(xiàn)這一目標(biāo)。例如,為行LCR輸入一個類似于下面的條件dml.get_tag()?。紿EXTORAW(′00′)配置一個從每個從屬數(shù)據(jù)庫上的隊列到每個遠(yuǎn)程從屬數(shù)據(jù)庫上的隊列的傳播過程。該傳播過程應(yīng)該使用一個規(guī)則集,該規(guī)則集具有指示該傳播過程將從屬數(shù)據(jù)庫上的隊列中的所有LCR(除了產(chǎn)生于遠(yuǎn)程從屬數(shù)據(jù)庫的變更)傳播到遠(yuǎn)程從屬數(shù)據(jù)庫上的隊列的規(guī)則。只要LCR中的標(biāo)記不等于遠(yuǎn)程從屬數(shù)據(jù)庫的標(biāo)記值,用戶通過把一個條件添加到評價為TRUE的規(guī)則上,來實現(xiàn)這一目標(biāo)。例如,如果遠(yuǎn)程從屬數(shù)據(jù)庫的標(biāo)記值等于十六進(jìn)制值′19′,那么為行LCR輸入一個類似于下面的條件dml.get_tag()!=HEXTORAW(′19′)通過以這種方式配置環(huán)境,用戶阻止變更循環(huán),產(chǎn)生于任何數(shù)據(jù)庫的任何變更不會丟失。具有從數(shù)據(jù)庫重做流捕獲的消息的磁盤備份和恢復(fù)的存儲器內(nèi)的流數(shù)據(jù)庫以穩(wěn)定的和可恢復(fù)的方式在持久電子數(shù)據(jù)存儲介質(zhì)(例如,軟盤、硬盤或磁帶)上儲存和組織信息。數(shù)據(jù)庫也為它對存儲介質(zhì)所做的每個變更生成重做和撤銷信息流。重做/撤銷流主要用于在崩潰之后將數(shù)據(jù)庫恢復(fù)到一個一致(consistent)的點(diǎn)。然而,如上所述,重做和撤銷信息可以用于其它目的。例如,重做日志可以用于創(chuàng)建一個數(shù)據(jù)庫(或在數(shù)據(jù)庫內(nèi)的所選對象)的副本以及保持該副本與原始副本一致。創(chuàng)建副本的一個原因是出于在原物被破壞的情況下備份的目的。用于創(chuàng)建副本的另一原因是通過創(chuàng)建“更接近于”將要查詢或修改它的用戶的副本允許數(shù)據(jù)更快地被存取。為創(chuàng)建一個副本,初始復(fù)制由原本(initial)構(gòu)成,從那一點(diǎn)起對原物的任何變更被傳輸和應(yīng)用到該副本。該變更可以被直接傳輸或經(jīng)由中間站點(diǎn)傳輸。該傳輸通常通過一個數(shù)據(jù)網(wǎng)絡(luò)電子傳送數(shù)據(jù)或在一些情況下通過物理地傳送存儲介質(zhì)來進(jìn)行。類似地,任何對副本的變更被傳輸和應(yīng)用于原本。如果由于同時對不同站點(diǎn)上的數(shù)據(jù)條目修改而出現(xiàn)差異,該差異需要由內(nèi)置于數(shù)據(jù)庫或由數(shù)據(jù)庫管理員提供的沖突解決功能來解決。基于對原始數(shù)據(jù)庫對象的變更創(chuàng)建和更新一個副本僅僅是變更如何被“應(yīng)用”的一個實例。然而,變更的應(yīng)用程序可以包含任何類型的動作,或可以發(fā)起一個長的活動鏈。例如,變更的應(yīng)用程序可以包括給對被變更的數(shù)據(jù)庫對象感興趣的訂閱者生成一個消息。一個數(shù)據(jù)庫系統(tǒng)僅僅是一個被變更以及變更被記入日志的系統(tǒng)的實例。本文描述的方法不局限于任何特定類型的變更-生成系統(tǒng)。然而,出于解釋的目的,將給出實例,其中最初生成該變更的系統(tǒng)和被應(yīng)用變更的系統(tǒng)都是數(shù)據(jù)庫。出于解釋的目的,最初作出變更的系統(tǒng)被稱作源站點(diǎn),被應(yīng)用變更的系統(tǒng)被稱作目的站點(diǎn)。然而,應(yīng)該提到一個變更可以由最初被變更的相同系統(tǒng)應(yīng)用。在這些情況下,源站點(diǎn)和目的站點(diǎn)是相同的站點(diǎn)。典型地,對數(shù)據(jù)庫對象的變更在變更應(yīng)用于目的站點(diǎn)之前被存儲在持久存儲介質(zhì)上。存儲可以在源站點(diǎn)、中間站點(diǎn)、目的站點(diǎn)或上面所有站點(diǎn)上。不幸地,在應(yīng)用變更之前持久地儲存變更易于阻礙應(yīng)用操作的性能。性能的降低是由于自從發(fā)明計算機(jī)以來,持久存儲介質(zhì)通常在儲存和取回數(shù)據(jù)方面比暫時存儲介質(zhì)慢10-100倍。為避免在應(yīng)用變更之前由持久存儲變更造成的延遲,下文描述的方法允許在源站點(diǎn)生成它們的時刻和在目的站點(diǎn)應(yīng)用它們的時刻之間將變更儲存在暫時存儲介質(zhì),諸如RAM存儲器中。根據(jù)一實施例,其中源站點(diǎn)和目的站點(diǎn)是數(shù)據(jù)庫系統(tǒng),通過讀取源數(shù)據(jù)庫系統(tǒng)的重做/撤銷流以及在暫時存儲器中儲存的變更來捕獲變更。然后變更數(shù)據(jù)被傳輸?shù)搅硪粩?shù)據(jù)庫系統(tǒng)上的暫時存儲器,在那里,它被應(yīng)用或轉(zhuǎn)發(fā)到另一數(shù)據(jù)庫系統(tǒng),或者被應(yīng)用和轉(zhuǎn)發(fā)到另一數(shù)據(jù)庫系統(tǒng)。暫時存儲器的內(nèi)容以一種先進(jìn)先出(FIFO)的方式被組織。出于解釋的目的,用于以這種方式儲存變更數(shù)據(jù)的存儲器組件應(yīng)在下文被稱作“FIFO緩沖器”?,F(xiàn)代的計算機(jī)裝配多個處理單元(或CPU)。出于解釋的目的,被指定完成捕獲變更、傳播變更和應(yīng)用變更的任務(wù)的CPU應(yīng)分別被稱作捕獲引擎、傳播引擎和應(yīng)用引擎。參照圖24,它是一個舉例說明變更信息從源站點(diǎn)2400通過一個中間站點(diǎn)2404到目的站點(diǎn)2402的存儲器內(nèi)的流的框圖。如上面所提到的,可以沒有或有幾個中間站點(diǎn)。這樣,其中有一個中間站點(diǎn)2404的實施例僅僅是出于解釋的目的加以舉例說明。如圖24中所示,對源站點(diǎn)2400上的原始表的更新導(dǎo)致生成反映變更被插入一個日志文件的數(shù)據(jù)。捕獲引擎讀取日志文件并生成流進(jìn)源站點(diǎn)的易失存儲器2410的變更數(shù)據(jù)。傳播引擎(未示出)把變更數(shù)據(jù)從源站點(diǎn)的易失存儲器2410傳播到中間站點(diǎn)2404的易失性存儲器2414。傳播引擎(未示出)將變更數(shù)據(jù)從中間站點(diǎn)2404的易失性存儲器2414傳播到目的站點(diǎn)2402的易失性存儲器2412。然后應(yīng)用引擎從目的站點(diǎn)2402上的易失性存儲器2412讀取變更數(shù)據(jù),并應(yīng)用在目的站點(diǎn)2402。在圖24中舉例說明的情形中,基于對源站點(diǎn)上的原始表的更新,位于目的站點(diǎn)2402變更數(shù)據(jù)通過修改一個副本被應(yīng)用。應(yīng)用變更的序列通常應(yīng)該基于初始進(jìn)行變更的序列。根據(jù)一實施例,圖24中示出的各種組件采取下面的措施以保證變更的順序不會丟失·重做流中的每個變更被分配一個唯一且遞增的號碼,本文被稱作變更序號(或CSN)?!げ东@引擎以CSN順序?qū)⒆兏砑拥紽IFO緩沖器中?!鞑ヒ?zhèn)鬏斪兏鼤r保持CSN順序?!?yīng)用引擎使用該序列確定應(yīng)用變更的順序。因為在生成變更數(shù)據(jù)的時刻和應(yīng)用過程消費(fèi)變更數(shù)據(jù)的時刻之間變更數(shù)據(jù)不被儲存到持久存儲器,示出的復(fù)制操作的性能極大地被改進(jìn)。然而,在復(fù)制操作過程中將變更數(shù)據(jù)儲存到持久存儲器的故障有某些恢復(fù)結(jié)果,這在下文中將被提到。使用CSN以取得“恰好一次”行為不幸地,儲存在暫時存儲器中的信息可以在故障發(fā)生時被從那個存儲器永久地刪除。這種信息損失可以在要求變更被應(yīng)用在目的站點(diǎn)恰好一次的系統(tǒng)中產(chǎn)生災(zāi)難性影響。特別地,如果不采取預(yù)防措施,捕獲引擎和應(yīng)用引擎都不知道在發(fā)生故障之前哪些變更被發(fā)送但還未被應(yīng)用。這樣,存在很大的危險,即捕獲引擎將重新發(fā)送以及應(yīng)用引擎將重新應(yīng)用已被應(yīng)用的變更。相反地,存在一個危險,即捕獲引擎將不重發(fā)送,以及應(yīng)用引擎將決不應(yīng)用已被發(fā)送但還未在故障之前被應(yīng)用的變更。根據(jù)一實施例,除了保證正確的應(yīng)用順序,CSN被用于保證在故障之后變更被應(yīng)用恰好一次。根據(jù)一實施例,通過使應(yīng)用引擎持久地記錄最近應(yīng)用的變更的原始CSN來取得恰好一次的行為。當(dāng)新變更被應(yīng)用時,在圖24中作為LAST-APPLIEDCSN示出的值連續(xù)地被應(yīng)用引擎更新。由于LAST-APPLIEDCSN被儲存在非易失性存儲器上,在故障之后將可使用,甚至當(dāng)故障包括存儲LAST-APPLIEDCSN的站點(diǎn)。如將在下文更為詳細(xì)地描述的,故障之后發(fā)現(xiàn)LAST-APPLIEDCSN的能力保證應(yīng)用引擎不會重新應(yīng)用之前已應(yīng)用的變更。根據(jù)一實施例,除了儲存LAST-APPLIEDCSN,應(yīng)用引擎定期地通知傳播引擎目前的LAST-APPLIEDCSN。用于傳輸該信息的消息本文被稱作確認(rèn),或“ACK”。參照圖24,ACK從目的站點(diǎn)2402發(fā)送到中間站點(diǎn)2404,從中間站點(diǎn)2404發(fā)送到源站點(diǎn)2400。雖然源站點(diǎn)2400以這種方式獲知LAST-APPLIEDCSN,到源站點(diǎn)2400接收ACK的時刻,ACK中識別的LAST-APPLIEDCSN值將通常是過時的。換句話說,到ACK消息被源站點(diǎn)2400接收到的時刻,應(yīng)用引擎將已應(yīng)用除了與ACK消息中顯示的LAST-APPLIEDCSN值相關(guān)的變更的變更。雖然過時,在源站點(diǎn)2400接收到的LAST-APPLIEDCSN值仍有價值,這是因為源站點(diǎn)2400了解等于那個CSN值的所有變更被保證已被應(yīng)用引擎應(yīng)用。所以,根據(jù)一實施例,以少見的間隔(infrequentintervals),源站點(diǎn)2400持久地儲存最近已在ACK消息中接收到的CSN值。以這種方式儲存的最近的CSN在此被稱作LASTACKCSN,因為它是最新的CSN(1)在ACK消息中在該站點(diǎn)被接收,以及(2)持久地被儲存在該站點(diǎn)。為了避免與頻繁的磁盤存取相關(guān)的開銷,LASTACKCSN被儲存到持久存儲器的頻率可以極大地低于ACK消息被接收的頻率。這樣,持久儲存的LASTACKCSN可能實際上不是最近ACK消息中接收到的CSN。在發(fā)生故障的情況下,源站點(diǎn)2400需要僅僅重新發(fā)送CSN值大于儲存在源站點(diǎn)的LASTACKCSN值的變更。特別地,如果捕獲數(shù)據(jù)庫出現(xiàn)故障,F(xiàn)IFO緩沖器2410的內(nèi)容丟失。在這種情況下,捕獲引擎使從源站點(diǎn)2400上被記錄的LASTACKCSN開始的變更重新排隊進(jìn)入FIFO緩沖器2410。這樣,捕獲引擎將重新發(fā)送(1)所有之前被發(fā)送但還未被應(yīng)用的變更,以及潛在地(2)一些之前被發(fā)送和應(yīng)用的變更。然而,通常屬于第二類的變更的數(shù)量很小,因為它將僅僅包括那些被應(yīng)用以及CSN大于儲存在源站點(diǎn)的LASTACKCSN的變更。根據(jù)一實施例,源站點(diǎn)和目的站點(diǎn)之間的一個或多個中間站點(diǎn)以一種類似于源站點(diǎn)的方式用于儲存LASTACKCSN。特別地,除了向上轉(zhuǎn)發(fā)任何它們接收的ACK消息,以少見的間隔在轉(zhuǎn)發(fā)ACK中包含的傳播引擎持久地記錄ACK中包含的CSN。例如,在圖24中,中間站點(diǎn)2404被示出持久地儲存一個LASTACKCSN。在一實施例中,LASTACKCSN被儲存在一中間站點(diǎn),LASTACKCSN被用于響應(yīng)于中間站點(diǎn)的故障以限制必須做的工作。特別地,如果中間站點(diǎn)2404崩潰,那么中間站點(diǎn)2404讀取儲存在中間站點(diǎn)2404的LASTACKCSN,以及請求中間相鄰上游站點(diǎn)(在這種情況下,源站點(diǎn)2400)僅僅重新發(fā)送那些表示LASTACKCSN之后的時刻的變更。如上所述,一個站點(diǎn)可能碰巧停止對已被應(yīng)用的重新傳播變更。根據(jù)一實施例,下游站點(diǎn)有責(zé)任通過記住它們已傳播和/或應(yīng)用的最高CSN來忽略與這種完全相同的CSN相關(guān)的變更。例如,假設(shè)源站點(diǎn)2400(1)記錄一個值為30的LASTACKCSN,以及(2)把具有CSN為50的變更傳播到一中間站點(diǎn)2404之后發(fā)生故障。進(jìn)一步假設(shè)具有CSN為50的變更最終被傳播和應(yīng)用于目的站點(diǎn)2402。在這種情形下,當(dāng)源站點(diǎn)2400被重新啟動時,源站點(diǎn)2400將開始重新發(fā)送在CSN30之后開始的變更。這樣,在那些變更已被傳播和應(yīng)用之后,中間站點(diǎn)2404將接收與CSN31至CSN50相關(guān)的變更。然而,由于中間站點(diǎn)2404知道它已傳播的最后的變更的CSN,中間站點(diǎn)2404知道不用重新傳播與CSN31至CSN50相關(guān)的變更。作為另一實例,假設(shè)在中間站點(diǎn)2404崩潰之前,中間站點(diǎn)2404(1)記錄一個值為30的LASTACKCSN,以及(2)將具有CSN為50的變更傳播到一目的站點(diǎn)2402。進(jìn)一步假設(shè)具有CSN為50的變更被應(yīng)用于目的站點(diǎn)2402。在這種情形下,當(dāng)中間站點(diǎn)2404被重新啟動時,中間站點(diǎn)2404將請求源站點(diǎn)2400重新發(fā)送在CSN30之后開始的變更。中間站點(diǎn)2404將接收和重新發(fā)送給目的站點(diǎn)2402與CSN31至CSN50相關(guān)的變更,在這之前那些變更已被應(yīng)用。然而,由于目的站點(diǎn)2402知道LASTAPPLIEDCSN,目的站點(diǎn)2402知道不用重新應(yīng)用與CSN31至CSN50相關(guān)的變更。根據(jù)一實施例,如果目的數(shù)據(jù)庫不能像變更進(jìn)入以及內(nèi)存用完一樣快速地應(yīng)用變更,那么目的數(shù)據(jù)庫可以將單獨(dú)的一組CPU專門用于將變更溢出到持久存儲器并釋放用于這些變更的內(nèi)存。這些CPU這兒被稱作“溢出引擎”。變更以CSN遞增的順序被溢出,一個被溢出的CSN被ACK(確認(rèn))至傳播引擎,好像它已被應(yīng)用。在這些情況下,應(yīng)用引擎首先查看持久隊列中的變更(如果該持久隊列不是空的),然后一旦持久隊列是空的,就應(yīng)用來自FIFO緩沖器的變更。過程故障恢復(fù)在一些發(fā)生故障的情形下,不是易失性存儲器中的所有信息都丟失。例如,在圖24中所示的系統(tǒng)中,捕獲引擎可能發(fā)生故障但不丟失儲存在源站點(diǎn)2400的易失性存儲器中的所有數(shù)據(jù)。為了從這種故障中快速恢復(fù),LASTPROCESSEDCSN可以保存在易失性存儲器中。由一個引擎儲存的LASTPROCESSEDCSN表明被該引擎最近處理過的變更的CSN。例如,源站點(diǎn)2400上的捕獲過程可以儲存一個表明應(yīng)用引擎最近放入FIFO緩沖器2410中的變更的CSN的LASTPROCESSEDCSN。類似地,在中間站點(diǎn)2404上的傳播引擎可以儲存一個表明最近傳播到目的站點(diǎn)2402的變更的CSN的LASTPROCESSEDCSN。在引擎發(fā)生故障而不丟失相應(yīng)LASTPROCESSEDCSN的情況下,該LASTPROCESSEDCSN(一般將比LASTACKCSN更新)可以用于確定該引擎在重新啟動時應(yīng)該從何處開始工作。例如,當(dāng)重新啟動時,源站點(diǎn)2400的捕獲引擎可以檢查LASTPROCESSEDCSN來確定哪些變更已排隊進(jìn)入FIFO緩沖器2410?!扒『靡淮巍毙袨楹褪聞?wù)在一些環(huán)境下,被捕獲、傳播和應(yīng)用的變更可以屬于事務(wù)。事務(wù)是作為單個原子操作的“持久”操作的集合。在變更屬于事務(wù)的環(huán)境下,用于各種事務(wù)的變更可以相對于CSN順序互相交錯。例如,用于第一事務(wù)TX1的變更可以被賦值為10、11、15和17的CSN,而用于第二事務(wù)TX2的變更可以被賦值為12、13、14、16、18和20的CSN。在大多數(shù)系統(tǒng)中,整個事務(wù)將被指定一個表明該事務(wù)何時被認(rèn)為已完成的CSN。指定給一個事務(wù)、在本文被稱作“提交CSN”的“完成時間”號通常是與事務(wù)中最后一次變更相關(guān)的CSN。例如,事務(wù)TX1的提交CSN是17,而事務(wù)TX2的提交CSN是20。根據(jù)一實施例,被應(yīng)用引擎持久儲存的LASTAPPLIEDCSN是通過應(yīng)用引擎提交的最后事務(wù)的提交CSN,不僅僅是應(yīng)用引擎應(yīng)用的最后變更的CSN。這樣,在這種情況下,LASTAPPLIEDCSN可以被稱作LASTCOMMITTEDCSN。通過僅僅持久地保存LASTCOMMITTEDCSN,而不是最近變更的CSN,需要被更新的持久儲存的信息的頻率極大地降低。這樣,當(dāng)應(yīng)用引擎完成對TX1的執(zhí)行,應(yīng)用引擎將更新LASTCOMMITTEDCSN來反映值為17的CSN。然而,應(yīng)用引擎不將在應(yīng)用與CSN18相關(guān)的TX2的變更之后更新LASTCOMMITTEDCSN為18。更確切地說,一旦TX2完全被應(yīng)用,LASTCOMMITTEDCSN將僅僅從17變更,在該時刻,LASTCOMMITTEDCSN將被變更為20。在一以這種方式持久保存LASTCOMMITTEDCSN的實施例中,該LASTCOMMITTEDCSN反映了已被應(yīng)用引擎完全應(yīng)用的最后事務(wù)的提交時間。除LASTCOMMITTEDCSN以外,引用引擎可以為每個還未被完全應(yīng)用的事務(wù)保存一個HIGHEST-SO-FARCSN在易失性存儲器中。用于事務(wù)的HIGHEST-SO-FARCSN是該應(yīng)用引擎已用于那個事務(wù)的最近變更的CSN。這樣,雖然應(yīng)用引擎將不在應(yīng)用與CSN18相關(guān)的TX2的變更之后,將LASTCOMMITTEDCSN更新為18,但應(yīng)用引擎將在應(yīng)用與CSN18相關(guān)的TX2的變更之后將用于TX2的HIGHEST-SO-FAR更新為18。基于LASTAPPLIEDCSN和HIGHEST-SO-FARCSN,應(yīng)用引擎可以容易地識別和刪掉任何已被應(yīng)用的變更的副本。特別地,應(yīng)用引擎刪掉已被應(yīng)用的變更,通過刪掉(1)那些屬于已提交小于或等于LASTCOMMITTEDCSN的CSN的事務(wù)的變更,以及(2)那些具有小于或等于變更所屬的事務(wù)的HIGHEST-SO-FARCSN的CSN的變更。例如,假設(shè)LASTCOMMITTEDCSN是17。如果應(yīng)用引擎接收一個與TX1和CSN15相關(guān)的變更,那么應(yīng)用引擎將刪掉該變更,這是因為TX1的提交CSN不大于LASTCOMMITTEDCSN(也就是17)。另一方面,如果TX2的提交CSN是20,以及應(yīng)用引擎接收與TX2和CSN12相關(guān)的變更,那么應(yīng)用引擎將把12與TX2的HIGHEST-SO-FARCSN相比較。如果TX2的HIGHEST-SO-FARCSN等于或大于12,那么應(yīng)用引擎將刪掉與CSN12相關(guān)的變更。另一方面,如果TX2的HIGHEST-SO-FARCSN小于12,那么應(yīng)用引擎將應(yīng)用該變更。最老的CSN根據(jù)一實施例,當(dāng)正被應(yīng)用的變更是事務(wù)的一部分時,被應(yīng)用引擎向上游發(fā)送的ACK消息包括一個OLDESTCSN值,而不是一個LASTAPPLIEDCSN。該OLDESTCSN是所有未被提交的事務(wù)的最老的變更CSN。根據(jù)一實施例,OLDESTCSN值持久地被應(yīng)用引擎存儲,并定期地使用ACK消息向上游傳送。用于事務(wù)的最老的變更CSN將通常是與該事務(wù)所作的第一變更相關(guān)的CSN。為了使OLDESTCSN保持最新,當(dāng)與當(dāng)前的OLDESTCSN相關(guān)的事務(wù)完全被應(yīng)用時,應(yīng)用引擎“增加”O(jiān)LDESTCSN。例如,考慮下面的三個事務(wù)具有在CSN12、13、17、20的變更的TX1具有在CSN11、14、15、18、19和23的變更的TX2具有在CSN16、21、22、24和25的變更的TX3如果TX1、TX2和TX3僅僅是該應(yīng)用程序接收的變更所針對的未被提交的事務(wù),那么OLDESTCSN將是11(來自任何未被提交的事務(wù)的最老的變更CSN)。假設(shè)應(yīng)用引擎先結(jié)束應(yīng)用TX1。在那一點(diǎn),LASTCOMMITTEDCSN將被變更為20,但OLDESTCSN不會變更,這是因為TX1不是與OLDESTCSN相關(guān)的事務(wù)。如果應(yīng)用引擎然后結(jié)束應(yīng)用TX2,那么OLDESTCSN將被更新為16,因為唯一未被提交的事務(wù)將是TX3,TX3的最老的變更CSN是16。在這一點(diǎn),LASTCOMMITTEDCSN也將變更為23。通過以這種方式保存OLDESTCSN,所有與小于OLDESTCSN的變更CSN相關(guān)的變更被保證已被應(yīng)用。這樣,在發(fā)生故障的情況下,應(yīng)用引擎讀取持久存儲的OLDESTCSN,并請求上游組件重新發(fā)送從OLDESTCSN處開始的變更信息是安全的。事務(wù)的無序應(yīng)用程序在上面給出的描述中,假設(shè)事務(wù)按照它們提交CSN的順序被應(yīng)用。這樣,如果變更是用于具有CSN高于LASTCOMMITTEDCSN的事務(wù),可以假設(shè)該變更還未被應(yīng)用。然而,根據(jù)一實施例,應(yīng)用引擎能夠并行地按能夠保證一致性而不保證所有事務(wù)將被按照它們提交CSN的順序應(yīng)用的順序應(yīng)用變更。例如,假設(shè)事務(wù)TX1、TX2和TX3分別具有提交CSN17、20和25。根據(jù)一實施例,如果TX3不依賴于TX2,那么應(yīng)用引擎可以在提交TX2之前提交TX1和TX3。當(dāng)TX3提交時,LASTCOMMITTEDCSN將被更新到25。然而,TX2還未被提交。所以,如果發(fā)生崩潰,那么與TX2相關(guān)的變更將在崩潰之后被刪掉,即使那些變更在崩潰之前未被提交。另一方面,假設(shè)在TX3被應(yīng)用之后沒有崩潰。更確切地說,假設(shè)應(yīng)用引擎繼續(xù)應(yīng)用TX2,然后崩潰發(fā)生。在TX2被應(yīng)用之后,LASTCOMMITTEDCSN將被更新到20,因為20是將被應(yīng)用的最后事務(wù)(TX2)的被提交的CSN。基于LASTCOMMITTEDCSN為20以及TX3具有一個為25的提交CSN,應(yīng)用引擎將在崩潰之后重新應(yīng)用TX3,即使TX3在崩潰之前已被完全應(yīng)用。這樣,在事務(wù)可以不按提交CSN順序被應(yīng)用的環(huán)境下,LASTCOMMITTEDCSN可以不為應(yīng)用引擎提供足夠的信息來確定變更是否應(yīng)該被應(yīng)用或刪掉。這樣,根據(jù)事務(wù)可以無序地被應(yīng)用的實施例,保存LOWWATERMARKCSN和OLDESTCSN。這些值的每一個的含義和使用將在下文更加詳細(xì)地加以描述。低水位標(biāo)CSN(LOWWATERMARKCSN)根據(jù)一實施例,LOWWATERMARKCSN是CSN,使得所有具有低于或等于LOWWATERMARKCSN的提交CSN的事務(wù)被保證已被應(yīng)用。在事務(wù)總是按CSN提交順序應(yīng)用的系統(tǒng)中,LOWWATERMARKCSN與LASTWATERMARKCSN相同。然而,在事務(wù)不總是按CSN提交順序應(yīng)用的系統(tǒng)中,LOWWATERMARKCSN有可能小于最近被應(yīng)用的事務(wù)的提交CSN。為了使LOWWATERMARKCSN保持最新,當(dāng)(1)應(yīng)用引擎結(jié)束應(yīng)用具有高于當(dāng)前LOWWATERMARKCSN的提交CSN的事務(wù),以及(2)未被應(yīng)用的事務(wù)具有一個低于剛被應(yīng)用的事務(wù)的提交CSN的提交CSN,應(yīng)用引擎“增加”LOWWATERMARKCSN。例如,假設(shè)事務(wù)TX1、TX2和TX3分別具有為17、20和25的提交CSN。假設(shè)(1)TX1已被應(yīng)用,(2)當(dāng)前的LOWWATERMARKCSN是17,以及(3)應(yīng)用引擎在TX2之前應(yīng)用TX3。當(dāng)TX3被完全應(yīng)用時,LOWWATERMARKCSN不被更新,這是因為未被應(yīng)用的事務(wù)(TX2)具有一個比TX3的提交CSN更低的提交CSN。在TX2被應(yīng)用之后,LOWWATERMARKCSN被更新到25,由于所有具有提交次數(shù)在或低于25的事務(wù)已被應(yīng)用。高于標(biāo)記應(yīng)用的事務(wù)(ABOVE-MARKAPPLIEDTRANSACTIONS)已被應(yīng)用的具有提交CSN高于LOWWATERMARK的事務(wù)在這兒被稱作ABOVE-MARKAPPLIED事務(wù)。在上面給出的實施例中,當(dāng)TX3在TX2之前被完全應(yīng)用時,TX3變成一個ABOVE-MARKAPPLIED事務(wù)。根據(jù)一實施例,除LOWWATERMARKCSN以外,應(yīng)用引擎持久地儲存關(guān)于ABOVE-MARKAPPLIED事務(wù)的信息。根據(jù)一實施例,關(guān)于ABOVE-MARKAPPLIED事務(wù)的信息被保存在易失性存儲器中的散列表中,散列表在持久存儲器上被備份。使用低水位標(biāo)、最老的CSN以及高于標(biāo)記的信息以確定在何處刪掉變更在將LOWWATERMARKCSN、關(guān)于ABOVE-MARKAPPLIED事務(wù)的信息以及OLDESTCSN保存在持久存儲器上的實施例中,應(yīng)用引擎刪掉已被應(yīng)用的變更,通過刪掉(1)那些與低于OLDESTCSN的CSN相關(guān)的變更,(2)那些屬于具有提交CSN小于LOWWATERMARKCSN的事務(wù)的變更,(3)那些具有CSN小于或等于該變更所屬的事務(wù)的HIGHEST-SO-FAR的變更,以及(4)那些屬于ABOVE-MARKAPPLIED事務(wù)的變更。例如,假設(shè)LOWWATERMARKCSN是18,以及TX3(具有為25的提交時間)是ABOVE-MARKAPPLIED事務(wù)。在這些條件下,應(yīng)用引擎刪掉任何與具有提交CSN小于18的事務(wù)相關(guān)的變更。類似地,即使許多與TX3相關(guān)的變更可能與在為18的LOWWATERMARKCSN以上的CSN相關(guān),所有與TX3相關(guān)的變更都將被刪掉,這是由于TX3是ABOVE-MARKAPPLIED事務(wù)。另一方面,如果應(yīng)用引擎接收與未被提交的事務(wù)TX2相關(guān)的變更以及該變更具有為12的CSN,那么應(yīng)用引擎將12與HIGHEST-SO-FARCSN相比較。如果TX2的HIGHEST-SO-FARCSN等于或大于12,那么應(yīng)用引擎將刪掉與CSN12相關(guān)的變更。另一方面,如果TX2的HIGHEST-SO-FARCSN小于12,那么應(yīng)用引擎將應(yīng)用該變更。當(dāng)應(yīng)用引擎繼續(xù)應(yīng)用事務(wù)時,LOWWATERMARK值將增加。當(dāng)LOWWATERMARKCSN增加時,它可以傳送之前已是ABOVE-MARKAPPLIED事務(wù)的事務(wù)的提交CSN。根據(jù)一實施例,用于跟蹤ABOVE-MARKAPPLIED事務(wù)的散列表定期地被刪除,以除去所有用于之前ABOVE-MARKAPPLIED事務(wù)的信息,以上LOWWATERMARKCSN已隨后增加超過該事務(wù)的提交CSN。在保存OLDESTCSN的實施例中,ACK消息將OLDESTCSN傳送到上游實體。例如,再次參照圖24,定期從目的站點(diǎn)2402發(fā)送到中間站點(diǎn)2404的ACK消息包含當(dāng)前的OLDESTCSN。中間站點(diǎn)2404定期地保存該信息并將它以ACK消息的形式轉(zhuǎn)發(fā)到源站點(diǎn)2400。源站點(diǎn)2400也定期地將該信息儲存到持久存儲器。應(yīng)用引擎的流程圖參照圖25,它是示出根據(jù)本發(fā)明的實施例的應(yīng)用引擎執(zhí)行的步驟的流程圖,該應(yīng)用引擎使用持久儲存的LOWWATERMARK、持久存儲的OLDESTCSN、識別ABOVE-MARKAPPLIED事務(wù)的持久儲存的數(shù)據(jù)、非持久儲存的HIGHEST-SO-FARCSN,以完成恰好一次的行為。在步驟2502,應(yīng)用引擎接收一個條目。該條目具有CSN且屬于一個事務(wù)。在步驟2503,應(yīng)用引擎確定該條目是否具有小于OLDESTCSN的CSN。如果該條目具有小于OLDESTCSN的CSN,那么該條目在步驟2510被刪掉。另一方面,如果該條目具有等于或大于OLDESTCSN的CSN,那么控制進(jìn)行到步驟2504。在步驟2504,應(yīng)用引擎確定該條目是否屬于具有執(zhí)行時間小于或等于當(dāng)前LOWWATERMARK的事務(wù)。如果該條目屬于具有執(zhí)行時間小于當(dāng)前LOWWATERMARK的事務(wù),那么該條目在步驟2510被刪掉。另一方面,如果CSN屬于具有執(zhí)行時間大于當(dāng)前LOWWATERMARK的事務(wù),那么控制進(jìn)行到步驟2506。在步驟2506,應(yīng)用引擎確定該條目是否屬于ABOVE-MARKAPPLIED事務(wù)。如果該條目屬于ABOVE-MARKAPPLIED事務(wù),那么在步驟2510該條目被刪掉。如果該條目不屬于ABOVE-MARKAPPLIED事務(wù),那么控制進(jìn)行到步驟2508。在步驟2508,應(yīng)用引擎確定該條目的CSN是否小于或等于用于該條目所屬的事務(wù)的HIGHEST-SO-FARCSN。如果該條目的CSN小于或等于用于該條目所屬的事務(wù)的HIGHEST-SO-FARCSN,那么該條目在步驟2510被刪掉。如果該條目的CSN大于用于該條目所屬的事務(wù)的HIGHEST-SO-FARCSN,那么該條目在步驟2512被應(yīng)用。在該條目被應(yīng)用之后,在步驟2514,應(yīng)用引擎更新用于該事務(wù)的HIGHEST-SO-FARCSN。在步驟2516,應(yīng)用引擎確定該條目所屬的事務(wù)是否已被完全應(yīng)用。如果該條目所屬的事務(wù)已被完全應(yīng)用,那么控制進(jìn)行到步驟2518。如果該條目所屬的事務(wù)還未被完全應(yīng)用,那么進(jìn)行該條目的處理(步驟2524)。在步驟2518,應(yīng)用引擎確定LOWWATERMARK是否需要被更新。如果不存在具有提交CSN小于剛被應(yīng)用的事務(wù)的提交CSN的未被應(yīng)用的事務(wù),那么更新LOWWATERMARK??刂频讲襟E2520。在步驟2520,如果合適,OLDESTCSN被更新。特別地,如果剛被應(yīng)用的事務(wù)包含最老的還未被應(yīng)用的變更,那么OLDESTCSN被更新,以反映剩余的未被應(yīng)用的事務(wù)的最老的變更CSN。在步驟2522,如果合適,ABOVE-MARKAPPLIED事務(wù)信息被更新。特別地,如果剛被應(yīng)用的事務(wù)高于當(dāng)前的LOWWATERMARK,以及在步驟2518,LOWWATERMARK未被增加到或超過事務(wù)的提交時間,那么該事務(wù)是ABOVE-MARKAPPLIED事務(wù),ABOVE-MARKAPPLIED事務(wù)信息被更新以包括該事務(wù)。在ABOVE-MARKAPPLIED事務(wù)信息被更新之后,進(jìn)行該條目的處理(步驟2524)。雖然上述的實例在基于從另一站點(diǎn)接收到的變更信息在目的站點(diǎn)進(jìn)行變更的應(yīng)用引擎的環(huán)境下被給出,但本文描述的技術(shù)不局限于任何特定的環(huán)境。例如,被應(yīng)用引擎接收的“條目”可以是需要恰好一次被處理的任何形式的信息。而且,被應(yīng)用引擎“應(yīng)用”該條目的實際步驟將根據(jù)實現(xiàn)到實現(xiàn)的不同而不同。例如,該“條目”可以是獨(dú)立的條目的訂單,“事務(wù)”可以相當(dāng)于包括一組條目訂單的購買訂單,條目的“應(yīng)用”可以包括為購買訂單生成帳單。利用信息共享系統(tǒng)100復(fù)制DDL如上所述,存在許多有利于保存一個數(shù)據(jù)庫對象幾個副本的情況。上面給出的許多實施例描述了信息共享系統(tǒng)100如何可以用于保證每個副本中包含的數(shù)據(jù)與同一數(shù)據(jù)庫對象的所有其它副本中包含的數(shù)據(jù)一致。特別地,信息共享系統(tǒng)100可以用于將對任一副本的變更傳播和應(yīng)用到其它每個副本駐留的站點(diǎn)。除了保持一個對象的副本內(nèi)包含數(shù)據(jù)的一致性之外,信息共享系統(tǒng)100可以用于保持副本本身結(jié)構(gòu)的一致性。特別地,數(shù)據(jù)定義語言(DDL)語句是定義、變更數(shù)據(jù)庫的結(jié)構(gòu)以及刪除數(shù)據(jù)庫對象(諸如表)的數(shù)據(jù)庫命令。當(dāng)DDL語句在對象的副本上執(zhí)行時,那個副本的結(jié)構(gòu)將被變更,將不在與相同對象的其它副本的結(jié)構(gòu)保持一致。根據(jù)一實施例,信息共享系統(tǒng)100用于以允許其它副本的結(jié)構(gòu)與被變更的副本保持一致的方式把DDL語句傳播和應(yīng)用到其它副本。而且,信息共享系統(tǒng)100可以用于自動創(chuàng)建初始副本。例如,假設(shè)一個用戶發(fā)布一個DDL語句以在數(shù)據(jù)庫A中創(chuàng)建表T1。根據(jù)本發(fā)明的一實施例,該DDL語句的記錄被生成并儲存到數(shù)據(jù)庫A的重做日志中。用于挖掘數(shù)據(jù)庫A的重做日志的捕獲過程可以從重做日志捕獲DDL語句并基于DDL語句生成一個事件。然后將該事件儲存到中間存儲區(qū),最終被傳播到一個或多個其它數(shù)據(jù)庫。在那些其它數(shù)據(jù)庫的每個數(shù)據(jù)庫,應(yīng)用引擎可以用于通過在那些數(shù)據(jù)庫內(nèi)發(fā)布一個相應(yīng)的DDL語句“應(yīng)用”該事件。那些DDL語句的執(zhí)行將導(dǎo)致表T1的副本的創(chuàng)建在每個數(shù)據(jù)庫內(nèi)進(jìn)行。應(yīng)該提到以這種方式復(fù)制DDL不要求在信息共享系統(tǒng)之間的任何停頓,以及不存在信息共享系統(tǒng)上所做的行為的限制。特別地,以這種方式復(fù)制DDL不要求對象/系統(tǒng)上的用戶行為的暫停且不考慮DDL的復(fù)雜性或性質(zhì)。生成關(guān)于DDL操作的信息在生成用于DDL操作重做信息的系統(tǒng)中,仍可以有作為DDL操作結(jié)果而生成的重做信息。例如,假設(shè)一個DDL操作導(dǎo)致在數(shù)據(jù)庫內(nèi)的表的創(chuàng)建。表的創(chuàng)建可以包括將一行或多行數(shù)據(jù)插入到現(xiàn)有系統(tǒng)表的DML操作,該現(xiàn)有系統(tǒng)表用于儲存關(guān)于數(shù)據(jù)庫不同表的元數(shù)據(jù)。響應(yīng)于對那些系統(tǒng)表內(nèi)的數(shù)據(jù)作出的變更,可以生成DML重做信息。然而,如果可能,僅僅基于響應(yīng)于對那些系統(tǒng)表的更新而生成的重做信息,試圖重構(gòu)導(dǎo)致對系統(tǒng)表的內(nèi)容的變更的特定DDL操作將是極端困難的。這樣,生成有關(guān)那些DDL操作的特定信息在需要DDL操作異步復(fù)制的情況下提供了極大的好處。根據(jù)一實施例,為DDL操作生成的重做信息包括相關(guān)性信息(也就是被DDL依賴/影響的對象)。一般而言,這種相關(guān)性信息不能從作為DDL操作的結(jié)果生成的DML重做操作重構(gòu)。在上面給出的實例中,初始執(zhí)行DDL操作的數(shù)據(jù)庫(“源”數(shù)據(jù)庫)用于生成用于DDL操作的重做信息。由于生成用于DDL操作的重做,DDL操作能夠精確地被挖掘源數(shù)據(jù)庫的重做日志的捕獲過程捕獲。由于DDL操作精確地被捕獲,它可以精確地被應(yīng)用于理想的目標(biāo)數(shù)據(jù)庫。根據(jù)一實施例,其中,為DDL操作生成的重做信息包括反映被源數(shù)據(jù)庫執(zhí)行的DDL語句的字符串。在重做日志內(nèi)儲存關(guān)于DDL操作的特定信息僅僅是一個DDL操作如何在源數(shù)據(jù)庫內(nèi)被記錄的實例。本文描述的復(fù)制方法不局限于任何特定的DDL操作記錄方法。只要DDL操作的精確描述可以被重構(gòu),信息共享系統(tǒng)100就可以用于異步地將DDL變更傳播和應(yīng)用于其它數(shù)據(jù)庫系統(tǒng)。多向的DDL復(fù)制信息共享系統(tǒng)100可以用于在使用信息共享系統(tǒng)100來共享信息的任何系統(tǒng)之間執(zhí)行DDL復(fù)制。因此,雙向和多向DDL復(fù)制是可能的。例如,信息共享系統(tǒng)100可以用于在五個數(shù)據(jù)庫之間復(fù)制DDL,使得在五個數(shù)據(jù)庫系統(tǒng)的任一系統(tǒng)上執(zhí)行的DDL語句將導(dǎo)致相應(yīng)的DDL語句在其它四個數(shù)據(jù)庫系統(tǒng)上被執(zhí)行。在這種五-路(five-way)復(fù)制的情形下,在第一數(shù)據(jù)庫系統(tǒng)上創(chuàng)建的表可以在第二數(shù)據(jù)庫系統(tǒng)上被添加一列,在第三數(shù)據(jù)庫系統(tǒng)上被刪除一列。當(dāng)進(jìn)行這些變更的每個變更時,在其它四個數(shù)據(jù)庫系統(tǒng)的每一個系統(tǒng)上進(jìn)行相應(yīng)的變更。特別地,在第一數(shù)據(jù)庫系統(tǒng)上的表的創(chuàng)建可以導(dǎo)致在其它四個數(shù)據(jù)庫系統(tǒng)上的表的副本的創(chuàng)建。隨后在第二數(shù)據(jù)庫系統(tǒng)上添加一列將導(dǎo)致對其它四個數(shù)據(jù)庫系統(tǒng)的每一個系統(tǒng)上的表的副本添加相應(yīng)的一列。隨后從第三數(shù)據(jù)庫系統(tǒng)上刪除一列將導(dǎo)致從其它四個數(shù)據(jù)庫系統(tǒng)的每一個系統(tǒng)上的表的副本上刪除相應(yīng)的列。雖然這些所有的DDL操作正在不同的數(shù)據(jù)庫之間被復(fù)制,行為(包括DDL和DML操作)可以不受任何限制地繼續(xù)在數(shù)據(jù)庫上發(fā)生,甚至在DDL操作的目標(biāo)的表上發(fā)生。在上面給出的五-路復(fù)制情形下,所有的DDL變更以與變更在產(chǎn)生它們的數(shù)據(jù)庫系統(tǒng)內(nèi)被執(zhí)行的變更完全相同的方式被傳播和在數(shù)據(jù)庫系統(tǒng)的每個系統(tǒng)上執(zhí)行。然而,不需要這樣。如上面所詳細(xì)解釋的,復(fù)制過程中包含的每個組件的操作包括捕獲引擎、傳播引擎和應(yīng)用引擎,可以利用規(guī)則引擎登記規(guī)則定制。那些規(guī)則在精細(xì)粒度級別可以指定每個組件如何操作。例如,該規(guī)則可以指定一個選擇標(biāo)準(zhǔn),其中僅僅那些滿足該選擇標(biāo)準(zhǔn)的DDL變更被捕獲、傳播和/或應(yīng)用。而且,那些規(guī)則可以指定在DDL變更信息上執(zhí)行的轉(zhuǎn)換,其中該轉(zhuǎn)換可以在DDL變更的捕獲、傳播和/或應(yīng)用過程中應(yīng)用。表之外的其它對象的DDL復(fù)制在上面給出的實例中,被復(fù)制的DDL操作是包括一個表的操作。然而,信息共享系統(tǒng)100可以用于復(fù)制任何形式的DDL操作。例如,響應(yīng)于添加到一特定的數(shù)據(jù)庫系統(tǒng)的用戶,信息共享系統(tǒng)100可以用于在一個或多個數(shù)據(jù)庫系統(tǒng)中創(chuàng)建一個新用戶。類似地,響應(yīng)于添加到一特定的數(shù)據(jù)庫系統(tǒng)的用戶,信息共享系統(tǒng)100可以用于在一個或多個數(shù)據(jù)庫系統(tǒng)中創(chuàng)建新的權(quán)限。被DDL命令創(chuàng)建和/或變更的其它類型的數(shù)據(jù)庫對象包括但不局限于查看、觸發(fā)、程序、索引、序列、同義詞、回滾段、大綱、數(shù)據(jù)庫鏈接、物化的查看、物化的查看日志等。在此描述的方法可以用于復(fù)制創(chuàng)建或變更任一這種類型的對象的DDL。如上面提到的,對數(shù)據(jù)庫的活動沒有限制,而DDL正被復(fù)制用于任一這些其它類型的數(shù)據(jù)庫對象。應(yīng)用被復(fù)制的DDL變更考慮一種情形,其中(1)作出對一個對象的DML變更的第一集合,然后(2)在該對象上執(zhí)行DDL操作,然后(3)作出對該對象的DML變更的第二集合。如果對該對象的DML變更和DDL變更正被復(fù)制,那么在對副本進(jìn)行DDL變更之前,目的地應(yīng)用DML變更的第一集合,以及在對副本進(jìn)行DDL變更之后,應(yīng)用DML變更的第二集合。根據(jù)一實施例,一種機(jī)制被提供用于跟蹤DML變更和DDL變更之間的相關(guān)性。例如,在上面給出的情形下,DDL操作依賴于第一集合的DML變更,第二集合的DML變更依賴于DDL操作。通過跟蹤該相關(guān)性信息,并把相關(guān)性信息傳送給復(fù)制DML和DDL變更的目的站點(diǎn),目的站點(diǎn)可以保證變更以適當(dāng)?shù)捻樞驁?zhí)行。值得注意地,在一個數(shù)據(jù)庫對象上執(zhí)行的DDL可以在另一數(shù)據(jù)庫上產(chǎn)生影響。在這些情況下,第二對象具有在第一對象上的相關(guān)性。在第二對象上執(zhí)行的DML操作可以受到在第一對象上執(zhí)行的DDL操作的影響。因此,相關(guān)性跟蹤機(jī)制使用關(guān)于對象之間的相關(guān)性的信息,來確定DDL和DML操作之間的相關(guān)性以正確的順序應(yīng)用于目的站點(diǎn),如所表示的相關(guān)性關(guān)系。另外,該相關(guān)性信息可以用于確定其它哪些動作可以與DDL操作同時實施。例如,數(shù)據(jù)庫服務(wù)器可以用于并行地執(zhí)行操作,諸如復(fù)制DDL和DML操作,只要操作之間不存在相關(guān)性。變更信息的XML模式在上面給出的許多實例中,信息共享系統(tǒng)100用于與一個或多個“目的”系統(tǒng)共享關(guān)于在一個“源”系統(tǒng)內(nèi)作出的變更的信息。用于傳送變更信息的記錄的結(jié)構(gòu)可以從一個實現(xiàn)到另一個實現(xiàn)變化。本文描述的方法不依賴于用于記錄的任何特定的結(jié)構(gòu)。根據(jù)一實施例,不同條變更信息(看標(biāo)題為“邏輯變更記錄”的部分)被存儲在符合XML模式的結(jié)構(gòu)中。在一實施例中,LCR的結(jié)構(gòu)符合下面的XML模式schemaxmlns=″http//www.w3.org/2001/XMLSchema″targetNamespace=″http//xmlns.oracle.com/streams/schemas/lcr″xmlnslcr=″http//xmlns.oracle.com/streams/schemas/lcr″xmlnsxdb=″http//xmlns.oracle.com/xdb″version=″1.0″><simpleTypename=″short_name″><restrictionbase=″string″><maxLengthvalue=″30″/></restriction></simpleType><simpletypename=″long_name″><restrictionbase=″string″><maxLengthvalue=″4000″/></restriction></simpleType><simpleTypename=″db_name″><restrictionbase=″string″><maxLengthvalue=″128″/></restriction></simpleType><!--Defaultsessionparameterisusedifformatisnotspecified--><complexTypename=″datetime_format″><sequence><elementname=″value″type=″string″/><elementname=″format″type=″string″minOccurs=″0″/></sequence></complexType><complexTypename=″anydata″><choice><elementname=″varchar2″type=″string″xdbSQLType=″VARCHAR2″/><!--Representcharasvarchar2.xdbCHARblankpadsupto2000bytes!--><elementname=″char″type=″string″xdbSQLType=″VARCHAR2″/><elementname=″nchar″type=″string″xdbSQLType=″NVARCHAR2″/><elementname=″nvarchar2″type=”string″xdbSQLType=″NVARCHAR2″/><elementname=″number″type=″double″xdbSQLType=″NUMBER″/><elementname=″raw″type=″hexBinary″xdbSQLType=″RAW″/><elementname=″date″type=″lcrdatetime_format″/><elementname=″timestamp″type=″lcrdatetime_format″/><elementname=″timestamp_tz″type=″lcrdatetime_format″/><elementname=″timestamp_ltz″type=″lcrdatetime_format″/><!--IntervalYMshouldbeaccordingtoformatallowedbySQL--><elementname=″interval_ym″type=″string″/><!--IntervalDSshouldbeaccordingtoformatallowedbySQL--><elementname=″interval_ds″type=″string″/></choice></complexType><complexTypename=″column_value″><sequence><elementname=″column_name″type=″lcrlong_name″/><elementname=″data″type=″lcranydata″/><elementname=″lob_information″type=″string″miOccurs=″0″/><elementname=″lob_offset″type=″nonNegativeInteger″minOccurs=″0″/><elementname=″lob_operation_size″type=″nonNegativeInteger″minOccurs=″0″/></sequence></complexType><elementname=″ROW_LCR″><complexType><sequence><elementname=″source_database_name″type=″lcrdb_name″/><elementname=″command_type″type=″string″/><elementname=″object_owner″type=″lcrshort_name″/><elementname=″object_name″type=″lcrshort_name″/><elementname=″tag″type=″hexBinary″xdbSQLType=″RAW″minOccurs=″0″/><elementname=″transaction_id″type=”string″minOccurs=″0″/><elementname=″scn″type=″double″xdbSQLType=″NUMBER″minOccurs=″0″/><elementname=″old_values″minOccurs=″0″><complexType><sequence><elementname=″old_value″type=″lcrcolumn_value″maxOccurs=″unbounded″/></sequence></complexType></element><elementname=″new_values″minOccurs=″0″><complexType><sequence><elementname=″new_value″type=″lcrcolumn_value″maxOccurs=″unbounded″/></sequence></complexType></element></sequence></complexType></element><elementname=″DDL_LCR″><complexType><sequence><elementname=″source_database_name″type=″lcrdb_name″/><elementname=″command_type″type=″string″/><elementname=″current_schema″type=″lcrshort_name″/><elementname=″ddl_text″type=″string″/><elementname=″object_type″type=″string″minOccurs=″0″/><elementname=″object_owner″type=″lcrshort_name″minOccurs=″0″/><elementname=″object_name″type=″lcrshort_name″minOccurs=″0″/><elementname=″logon_user″type=″lcrshort_name″minOccurs=″0″/><elementname=″base_table_owner″type=″lcrshort_name″minOccurs=″0″/><elementname=″base_table_name″type=″lcrshort_name″minOccurs=″0″/><elementname=″tag″type=″hexBinary″xdbSQLType=″RAW″minOccurs=″0″/><elementname=″transaction_id″type=″string″minOccurs=″0″/><elementname=″scn″type=″double″xdbSQLType=″NUMBER″minOccurs=″0″/></sequence></complexType></element></schema>該典型的XML模式包含用于每一種不同類型的變更信息的部分。例如,根據(jù)本發(fā)明的一實施例,緊跟標(biāo)記<elementname=″DDL_LCR″>的部分指定了與DDL變更相關(guān)的記錄的結(jié)構(gòu)。類似地,根據(jù)本發(fā)明的一實施例,緊跟標(biāo)記<elementname=″ROW_LCR″>的部分指定了與對表的一行進(jìn)行的DML變更相關(guān)的記錄的結(jié)構(gòu)。硬件綜述圖26是一個示出在其上可以實施本發(fā)明的一實施例的計算機(jī)系統(tǒng)2600的框圖。計算機(jī)系統(tǒng)2600包括總線2602或其它用于傳送信息的通信機(jī)制,以及一個與總線2602相連用于處理信息的處理器2604。計算機(jī)系統(tǒng)2600也包括主存儲器2606,諸如隨機(jī)存取存儲器(RAM)或其它動態(tài)存儲設(shè)備,該主存儲器2606連接到總線2602用于儲存信息和被處理器2604執(zhí)行的指令。主存儲器2606也可以用于在處理器2604執(zhí)行指令過程中儲存暫時變量或其它中間信息。計算機(jī)系統(tǒng)2600還包括一個只讀存儲器(ROM)2608或其它連接到總線2602用于儲存靜態(tài)信息和用于處理器2604的指令的靜態(tài)存儲設(shè)備。存儲設(shè)備2610諸如磁盤或光盤被提供并連接到總線2602用于儲存信息和指令。計算機(jī)系統(tǒng)2600可以經(jīng)由總線2602連接到顯示器2612,諸如陰極射線管(CRT)用于將信息顯示給計算機(jī)用戶。輸入裝置2614包括文字鍵、數(shù)字鍵和其它鍵,被連接到總線2602用于將信息和命令選擇傳送給處理器2604。另一類型的用戶輸入裝置是光標(biāo)控制器2616,諸如鼠標(biāo)、跟蹤球或用于將方向信息和命令選擇傳送給處理器2604以及控制光標(biāo)在顯示器2612上移動的光標(biāo)方向鍵。該輸入裝置通常具有兩個軸向的自由度,第一個軸(例如x)和第二個軸(例如y),這兩個自由度允許裝置在平面上指定位置。本發(fā)明涉及了使用計算機(jī)系統(tǒng)2600實施本文所述的方法。根據(jù)本發(fā)明的一實施例,那些方法由計算機(jī)系統(tǒng)2600實施來響應(yīng)處理器2604執(zhí)行主存儲器2606中包含的一個或多個指令的一個或多個序列。這種指令可以從另一計算機(jī)可讀介質(zhì)諸如存儲裝置2610讀進(jìn)主存儲器2606。對主存儲器2606中包含的指令序列的執(zhí)行導(dǎo)致處理器2604實施本文所述的過程步驟。在另外的實施例中,硬件電路可以用于取代或與軟件指令結(jié)合來實施本發(fā)明。這樣,本發(fā)明的實施例不局限于硬件電路和軟件的任何特定結(jié)合。本文使用的術(shù)語“計算機(jī)可讀介質(zhì)”指的是任何參與提供指令給處理器2604以便執(zhí)行的介質(zhì)。這種介質(zhì)可以采取許多形式,包括但不局限于非-易失性介質(zhì)、易失性介質(zhì)和傳輸介質(zhì)。非-易失性介質(zhì)包括例如光盤或磁盤,諸如存儲裝置2610。易失性介質(zhì)包括動態(tài)存儲器,諸如主存儲器2606。傳輸介質(zhì)包括同軸電纜、銅線和光纖,包括包含總線2602的電線。傳輸介質(zhì)也可以采取聲波或光波的形式,諸如那些在無線電波和紅外線數(shù)據(jù)通信過程中生成的波。計算機(jī)可讀介質(zhì)的常見形式包括例如軟盤、軟磁盤、硬盤、磁帶、或任何其它的磁介質(zhì)、CD-ROM、任何其它的光學(xué)介質(zhì)、穿孔卡片、紙帶、任何其它帶空結(jié)構(gòu)的物理介質(zhì)、RAM、PROM、以及EPROM、FLASH-EPROM、任何其它的存儲芯片或錄音帶盒、下文所述的載波、或計算機(jī)可以讀取的任何其它的介質(zhì)。各種形式的計算機(jī)可讀介質(zhì)可以參與傳送一個或多個指令的一個或多個序列給處理器2604以便執(zhí)行。例如,該指令可以初始存放在遠(yuǎn)程計算機(jī)的磁盤上。遠(yuǎn)程計算機(jī)可以將指令裝入它的動態(tài)存儲器并使用一個調(diào)制解調(diào)器通過電話線發(fā)送指令。計算機(jī)系統(tǒng)2600本地的調(diào)制解調(diào)器可以接收電話線上的數(shù)據(jù)并使用紅外線發(fā)射器將數(shù)據(jù)轉(zhuǎn)換成紅外線信號。一個紅外線探測器可以接收紅外線信號中傳送的數(shù)據(jù),適當(dāng)?shù)碾娐房梢詫?shù)據(jù)放在總線2602上??偩€2602將數(shù)據(jù)傳送到主存儲器2606,處理器2604從主存儲器2606取回并執(zhí)行指令。主存儲器2606接收到的指令在處理器2604執(zhí)行之前或之后可選地存儲在存儲裝置2610。計算機(jī)系統(tǒng)2600還包括一個連接到總線2602的通信接口2618。通信接口2618提供到網(wǎng)絡(luò)鏈路2620的雙向數(shù)據(jù)通信連接,網(wǎng)絡(luò)鏈路2620連接到本地網(wǎng)絡(luò)2622。例如,通信接口2618可以是一個綜合業(yè)務(wù)數(shù)字網(wǎng)(ISDN)卡或調(diào)制解調(diào)器來提供到相應(yīng)類型的電話線的數(shù)據(jù)通信連接。作為另一實施例,通信接口2618可以是一個局域網(wǎng)(LAN)卡來提供到兼容的LAN的數(shù)據(jù)通信連接。無線線路也可以被實現(xiàn)。在任何這種實現(xiàn)中,通信接口2618發(fā)送和接收傳送描述各種類型信息的數(shù)字?jǐn)?shù)據(jù)信息共享系統(tǒng)100的電信號、電磁信號或光信號。網(wǎng)絡(luò)鏈路2620通常提供通過一個或多個網(wǎng)絡(luò)到其它數(shù)據(jù)裝置的數(shù)據(jù)通信。例如,網(wǎng)絡(luò)鏈路2620可以提供通過本地網(wǎng)絡(luò)2622到主機(jī)計算機(jī)2624或到由Internet服務(wù)提供商(ISP)2626操作的數(shù)據(jù)裝置的連接。ISP2626反過來提供通過現(xiàn)在通常稱為“Internet”2628的世界范圍的分組數(shù)據(jù)通信網(wǎng)絡(luò)的數(shù)據(jù)通信服務(wù)。本地網(wǎng)絡(luò)2622和Internet2628都使用攜帶數(shù)字?jǐn)?shù)據(jù)信息共享系統(tǒng)100的電信號、電磁信號或光信號。傳送數(shù)字?jǐn)?shù)據(jù)到和來自計算機(jī)系統(tǒng)2600的通過各種網(wǎng)絡(luò)的信號和網(wǎng)絡(luò)鏈路2620上以及通過通信接口2618的信號是傳輸信息的載波的典型形式。計算機(jī)系統(tǒng)2600可以通過網(wǎng)絡(luò)、網(wǎng)絡(luò)鏈路2620和通信接口2618發(fā)送消息和接收數(shù)據(jù),包括程序代碼。在Internet的實施例中,服務(wù)器2630可以通過Internet2628、ISP2626、本地網(wǎng)絡(luò)2622以及通信接口2618傳送被請求的應(yīng)用程序代碼。被接收的代碼可以在接收時由處理器2604執(zhí)行,和/或儲存在存儲裝置2610或其它非-易失性存儲器以用于以后的執(zhí)行。以這種方式,計算機(jī)系統(tǒng)2600可以獲得載波形式的程序代碼。在上述的說明書中,本發(fā)明的實施例已參照許多根據(jù)實現(xiàn)的不同而不同的特定細(xì)節(jié)被描述。這樣,什么是發(fā)明以及申請人打算使什么成為發(fā)明的唯一指標(biāo)是從本申請以這種權(quán)利要求發(fā)布的特定形式發(fā)布包括任何隨后的糾正的權(quán)利要求集。這兒明確闡述的任何對這種權(quán)利要求中包含的術(shù)語的定義將決定權(quán)利要求中使用的這種術(shù)語的含義。所以,無局限性、組成部分、屬性、特征、在權(quán)利要求中未被明確陳述的優(yōu)點(diǎn)或?qū)傩詰?yīng)該以任何方式限制這種權(quán)利要求的范圍。相應(yīng)地,該說明書和附圖以一種舉例說明而不是局限性的方式被看待。權(quán)利要求1.一種用于共享信息的方法,所述方法包括以下步驟顯式捕獲過程,通過作出經(jīng)過與中間存儲區(qū)相關(guān)的API的顯式調(diào)用,將一個或多個信息條目的第一集合添加到所述中間存儲區(qū);隱式捕獲過程,基于發(fā)生在與所述隱式捕獲過程相關(guān)的系統(tǒng)中的事件,自動地將一個或多個信息條目的第二集合添加到所述中間存儲區(qū)中;以及消費(fèi)過程,消費(fèi)儲存在所述中間存儲區(qū)中的信息條目。2.根據(jù)權(quán)利要求1所述的方法,其中,所述自動地添加一個或多個信息條目的第二集合的步驟由基于在數(shù)據(jù)庫系統(tǒng)內(nèi)生成的日志文件的內(nèi)容,將信息條目插入所述中間存儲區(qū)中的捕獲過程執(zhí)行。3.根據(jù)權(quán)利要求2所述的方法,其中,所述中間存儲區(qū)由所述數(shù)據(jù)庫系統(tǒng)管理。4.根據(jù)權(quán)利要求2所述的方法,其中所述日志識別在所述數(shù)據(jù)庫系統(tǒng)內(nèi)作出的變更;以及所述一個或多個信息條目的集合包括反映所述變更的集合的記錄。5.根據(jù)權(quán)利要求4所述的方法,其中所述變更的集合是反映在所述日志中的所有變更的子集;以及所述捕獲過程基于儲存在所述數(shù)據(jù)庫系統(tǒng)內(nèi)的元數(shù)據(jù)中表明的規(guī)則選擇將哪些變更反映在所述記錄中。6.根據(jù)權(quán)利要求1所述的方法,其中所述顯式捕獲過程、所述隱式捕獲過程和所述消費(fèi)過程是信息共享系統(tǒng)中的組件;以及所述方法還包括以下步驟所述信息共享系統(tǒng)接收指定表明至少一個所述組件如何操作的一個或多個規(guī)則的規(guī)則數(shù)據(jù);以及通過將表示所述一個或多個規(guī)則的元數(shù)據(jù)儲存在所述信息共享系統(tǒng)內(nèi),登記所述規(guī)則數(shù)據(jù);所述至少一個組件讀取所述元數(shù)據(jù)以及以所述元數(shù)據(jù)中指定的方式操作。7.根據(jù)權(quán)利要求6所述的方法,其中,所述規(guī)則數(shù)據(jù)包括表明所述至少一個組件如何轉(zhuǎn)換所述信息條目的規(guī)則。8.根據(jù)權(quán)利要求6所述的方法,其中所述信息共享系統(tǒng)包括數(shù)據(jù)庫系統(tǒng);登記所述規(guī)則數(shù)據(jù)的步驟包括將表示所述一個或多個規(guī)則的元數(shù)據(jù)儲存在所述數(shù)據(jù)庫系統(tǒng)內(nèi);以及所述至少一個組件是在所述數(shù)據(jù)庫系統(tǒng)內(nèi)執(zhí)行的過程。9.根據(jù)權(quán)利要求1所述的方法,還包括以下步驟所述隱式捕獲過程將表明所述信息條目與發(fā)生在所述系統(tǒng)中的事件對應(yīng)的標(biāo)記值儲存在一個或多個信息條目的所述第二集合的每個信息條目內(nèi);以及使用所述標(biāo)記值以避免循環(huán),否則所述循環(huán)導(dǎo)致所述事件將在所述系統(tǒng)內(nèi)重新被應(yīng)用。10.根據(jù)權(quán)利要求9所述的方法,還包括以下步驟將所述信息條目從所述中間存儲區(qū)傳播到第二系統(tǒng);通過將與所述信息條目相關(guān)的事件應(yīng)用到所述第二系統(tǒng)中,在所述第二系統(tǒng)內(nèi)作出變更;其中,所述第二系統(tǒng)用于將所述第二系統(tǒng)內(nèi)的變更傳播到所述第一系統(tǒng);以及其中,使用所述標(biāo)記值以避免循環(huán)的步驟包括基于所述信息條目中的標(biāo)記值,阻止所述變更傳播到所述第一系統(tǒng)。11.根據(jù)權(quán)利要求1所述的方法,其中所述系統(tǒng)是第一系統(tǒng);以及所述隱式捕獲過程在相對于所述第一系統(tǒng)遙遠(yuǎn)的第二系統(tǒng)內(nèi)執(zhí)行。12.根據(jù)權(quán)利要求11所述的方法,其中所述方法還包括將日志從所述第一系統(tǒng)傳送到所述第二系統(tǒng)的步驟;以及所述隱式捕獲過程基于包含在所述日志中的信息生成所述信息條目的第二集合。13.根據(jù)權(quán)利要求12所述的方法,其中所述第一系統(tǒng)是第一數(shù)據(jù)庫系統(tǒng);所述第二系統(tǒng)是第二數(shù)據(jù)庫系統(tǒng);所述日志是由所述第一數(shù)據(jù)庫系統(tǒng)生成的重做日志;以及所述信息條目的第二集合識別在所述第一數(shù)據(jù)庫系統(tǒng)內(nèi)作出的變更。14.根據(jù)權(quán)利要求13所述的方法,其中所述中間存儲區(qū)駐留在所述第二數(shù)據(jù)庫系統(tǒng)中;以及所述方法還包括使用應(yīng)用過程從所述中間存儲區(qū)讀取所述信息條目的第二集合以及基于所述信息條目的第二集合在所述第二數(shù)據(jù)庫系統(tǒng)內(nèi)發(fā)生變更的步驟。15.一種用于共享信息的方法,所述方法包括以下步驟捕獲過程,基于在與所述捕獲過程相關(guān)的第一系統(tǒng)內(nèi)發(fā)生的事件,自動地將一個或多個信息條目的集合添加到所述中間存儲區(qū);以及所述捕獲過程將表明所述信息條目與發(fā)生在所述第一系統(tǒng)內(nèi)的事件對應(yīng)的標(biāo)記值儲存在所述一個或多個信息條目的集合的每個信息條目內(nèi);將信息條目從所述中間存儲區(qū)傳播到第二系統(tǒng);通過在所述第二系統(tǒng)內(nèi)應(yīng)用與信息條目相關(guān)的事件,在所述第二系統(tǒng)內(nèi)作出變更;其中,所述第二系統(tǒng)用于將所述第二系統(tǒng)內(nèi)的變更傳播到所述第一系統(tǒng);以及基于所述信息條目中的標(biāo)記值,使用所述標(biāo)記值,通過阻止所述變更傳播到所述第一系統(tǒng)以避免循環(huán)。16.一種用于共享信息的方法,所述方法包括以下步驟捕獲過程自動地執(zhí)行以下步驟檢查在第一數(shù)據(jù)庫系統(tǒng)內(nèi)生成的重做日志文件;基于在所述重做日志文件中表明的事件,將一個或多個信息條目的集合添加到中間存儲區(qū)中;以及消費(fèi)過程,通過讀取所述中間存儲區(qū)中的信息條目以及基于在所述重做日志文件中表明的事件導(dǎo)致在第二數(shù)據(jù)庫系統(tǒng)內(nèi)作出變更,自動地處理來自所述中間存儲區(qū)的信息條目。17.根據(jù)權(quán)利要求16所述的方法,其中,導(dǎo)致在所述第二數(shù)據(jù)庫內(nèi)作出變更的步驟包括在所述第二數(shù)據(jù)庫系統(tǒng)內(nèi)保存所述第一數(shù)據(jù)庫系統(tǒng)內(nèi)的一個或多個數(shù)據(jù)庫對象的副本,其中,所述一個或多個數(shù)據(jù)庫對象是所述第一數(shù)據(jù)庫系統(tǒng)內(nèi)的可復(fù)制對象的子集。18.根據(jù)權(quán)利要求16所述的方法,其中,導(dǎo)致變更的步驟包括以下步驟構(gòu)造數(shù)據(jù)庫命令以導(dǎo)致所述變更;以及將所述數(shù)據(jù)庫命令提交給所述第二數(shù)據(jù)庫系統(tǒng)。19.根據(jù)權(quán)利要求16所述的方法,其中,所述第一數(shù)據(jù)庫系統(tǒng)是與所述第二數(shù)據(jù)庫系統(tǒng)不同類型的數(shù)據(jù)庫系統(tǒng)。20.根據(jù)權(quán)利要求16所述的方法,還包括以下步驟接收表示訂閱者和訂閱者感興趣的信息的訂閱數(shù)據(jù);第二消費(fèi)過程,自動地從所述中間存儲區(qū)讀取信息條目,以及基于所述訂購數(shù)據(jù),通知對與信息條目相關(guān)的事件感興趣的訂閱者。21.一種用于共享信息的方法,所述方法包括以下步驟在數(shù)據(jù)庫系統(tǒng)內(nèi)登記捕獲規(guī)則的集合;在所述數(shù)據(jù)庫系統(tǒng)內(nèi)登記傳播規(guī)則的集合;基于所述捕獲規(guī)則的集合,確定發(fā)生在所述數(shù)據(jù)庫系統(tǒng)內(nèi)的哪些事件將被捕獲;通過儲存有關(guān)中間存儲區(qū)中的所述事件的信息捕獲所述事件;基于所述傳播規(guī)則的集合,確定如何從所述中間存儲區(qū)傳播信息;以及基于所述傳播規(guī)則的集合從所述中間存儲區(qū)傳播信息。22.根據(jù)權(quán)利要求21所述的方法,還包括以下步驟登記應(yīng)用規(guī)則的集合;接收從所述中間存儲區(qū)傳播的所述信息;以及基于所述應(yīng)用規(guī)則的集合,應(yīng)用從所述中間存儲區(qū)接收的所述信息。23.根據(jù)權(quán)利要求21所述的方法,其中,捕獲所述事件的步驟包括讀取由所述數(shù)據(jù)庫系統(tǒng)生成的日志,以及有選擇地將有關(guān)在所述日志中識別的事件的信息儲存在所述中間存儲區(qū)中。24.根據(jù)權(quán)利要求21所述的方法,其中傳播步驟包括將所述信息傳播到第二中間存儲區(qū);以及所述方法還包括將在所述第二中間存儲區(qū)內(nèi)識別的變更應(yīng)用到第二數(shù)據(jù)庫系統(tǒng)的步驟。25.根據(jù)權(quán)利要求24所述的方法,其中所述方法還包括登記應(yīng)用規(guī)則的集合的步驟;以及基于所述應(yīng)用規(guī)則的集合執(zhí)行應(yīng)用變更的步驟。26.根據(jù)權(quán)利要求24所述的方法,其中所述方法還包括登記用戶程序的步驟;以及基于所述用戶程序執(zhí)行應(yīng)用變更的步驟。27.一種用于共享信息的方法,所述方法包括以下步驟捕獲過程,將一個或多個信息條目的第一集合添加到中間存儲區(qū);應(yīng)用過程,自動地從所述中間存儲區(qū)讀取信息條目以及有選擇地消費(fèi)所述信息條目;以及顯式出列過程,通過對與所述中間存儲區(qū)相關(guān)的API進(jìn)行顯式調(diào)用,消費(fèi)來自所述中間存儲區(qū)的信息條目。28.一種用于響應(yīng)系統(tǒng)中作出的變更的方法,所述方法包括以下步驟給所述變更指定變更時間;生成所述變更的記錄,其中,生成所述記錄的步驟相對于作出所述變更的時間異步執(zhí)行;讀取所述變更的記錄,其中,讀取所述記錄的步驟相對于生成所述記錄的時間異步執(zhí)行;執(zhí)行閃回查詢,其中,所述閃回查詢在基于所述變更時間的存取時間處理來自所述系統(tǒng)的數(shù)據(jù);以及響應(yīng)于基于所述閃回查詢結(jié)果的所述變更,確定執(zhí)行的動作。29.根據(jù)權(quán)利要求28所述的方法,其中所述系統(tǒng)是數(shù)據(jù)庫系統(tǒng);基于從由所述數(shù)據(jù)庫系統(tǒng)生成的日志文件讀取的信息執(zhí)行生成記錄的步驟。30.根據(jù)權(quán)利要求28所述的方法,其中生成所述記錄的步驟由導(dǎo)致所述記錄將儲存在所述中間存儲區(qū)中的捕獲過程執(zhí)行;以及讀取所述記錄的步驟由消費(fèi)儲存在所述中間存儲區(qū)中的記錄的消費(fèi)過程執(zhí)行。31.一種用于完成條目序列的恰好一次處理的方法,所述方法包括以下步驟對于從另一站點(diǎn)到達(dá)目的站點(diǎn)的條目序列中的每個條目,執(zhí)行以下步驟讀取與所述條目相關(guān)的序列號;基于是否滿足條件集合,確定所述條目是否已被處理;其中,所述條件集合包括要求在與所述條目相關(guān)的序列號和持久存儲的水位標(biāo)值之間進(jìn)行比較的條件;以及只有所述條件集合被滿足,才處理所述條目;當(dāng)所述條目在所述目的站點(diǎn)被處理時,基于與所述條目相關(guān)的序列號,重復(fù)更新所述持久存儲的水位標(biāo)值以表明哪些條目已被處理;以及定期地將消息從所述目的站點(diǎn)發(fā)送到所述另一站點(diǎn),其中,所述消息表明哪些條目已在所述目的站點(diǎn)被處理。32.根據(jù)權(quán)利要求31所述的方法,其中所述條目對應(yīng)于事務(wù);以及所述水位標(biāo)值表明其已被完全應(yīng)用于所述目的站點(diǎn)的事務(wù)的提交時間。33.根據(jù)權(quán)利要求32所述的方法,其中所述水位標(biāo)值表明其變更已最近被應(yīng)用引擎應(yīng)用的事務(wù)的提交時間。34.根據(jù)權(quán)利要求32所述的方法,其中,所述水位標(biāo)值表明提交時間,在那里,提交時間位于或低于所述水位標(biāo)值的所有事務(wù)被保證已被應(yīng)用引擎應(yīng)用。35.根據(jù)權(quán)利要求32所述的方法,其中,重復(fù)更新持久儲存的水位標(biāo)值的步驟包括重復(fù)更新所述持久儲存的水位標(biāo)值以反映將被完全應(yīng)用于所述目的站點(diǎn)的最近事務(wù)的提交時間。36.根據(jù)權(quán)利要求31所述的方法,其中所述條目對應(yīng)于事務(wù);以及定期地發(fā)送消息的步驟包括定期地發(fā)送表明其變更在所述目的站點(diǎn)還未被完全應(yīng)用的事務(wù)的最老變更時間的消息。37.根據(jù)權(quán)利要求36所述的方法,還包括重復(fù)更新持久儲存的OLDESTCSN值,以反映在所述目的站點(diǎn)還未被完全應(yīng)用的最老的事務(wù)的最老的變更時間的步驟。38.根據(jù)權(quán)利要求37所述的方法,還包括響應(yīng)于在所述目的站點(diǎn)的故障,讀取持久儲存的OLDESTCSN值,以及基于所述持久儲存的OLDESTCSN值請求條目被重新發(fā)送到所述目的站點(diǎn)的步驟。39.根據(jù)權(quán)利要求31所述的方法,還包括響應(yīng)于在所述目的站點(diǎn)的故障,讀取所述持久儲存的水位標(biāo)值以及基于所述持久儲存的水位標(biāo)值請求條目被重新發(fā)送到所述目的站點(diǎn)的步驟。40.根據(jù)權(quán)利要求31所述的方法,其中所述另一站點(diǎn)是源站點(diǎn);以及所述方法還包括以下步驟所述源站點(diǎn)定期地將在所述消息中接收到的信息儲存到持久存儲器中;以及在所述源站點(diǎn)發(fā)生故障之后,所述源站點(diǎn)執(zhí)行以下步驟從持久存儲器讀取所述信息;以及基于所述信息將條目重新發(fā)送到所述目的站點(diǎn)。41.根據(jù)權(quán)利要求31所述的方法,其中所述另一站點(diǎn)是接收來自第三站點(diǎn)的所述條目的中間站點(diǎn);以及所述方法還包括以下步驟所述中間站點(diǎn)定期地將在所述消息中接收到的信息儲存到持久存儲器中;以及在所述中間站點(diǎn)發(fā)生故障之后,所述中間站點(diǎn)執(zhí)行以下步驟從所述持久存儲器讀取所述信息;以及基于所述信息請求所述第三站點(diǎn)將條目重新發(fā)送到所述中間站點(diǎn)。42.根據(jù)權(quán)利要求41所述的方法,其中,所述中間站點(diǎn)定期地將所述信息發(fā)送到所述第三站點(diǎn)。43.根據(jù)權(quán)利要求31所述的方法,其中所述條目包括第一事務(wù)和第二事務(wù),其中,所述第一事務(wù)在所述第二事務(wù)之前提交;以及重復(fù)更新所述持久儲存的水位標(biāo)值的步驟包括以下步驟如果所述目的站點(diǎn)在結(jié)束應(yīng)用所述第一事務(wù)之前,所述目的站點(diǎn)結(jié)束應(yīng)用所述第二事務(wù),那么所述目的站點(diǎn)持久地儲存表明所述第二事務(wù)被完全應(yīng)用的信息,而不必變更所述持久儲存的水位標(biāo);以及如果所述目的站點(diǎn)在結(jié)束應(yīng)用所述第二事務(wù)之前,所述目的站點(diǎn)結(jié)束應(yīng)用所述第一事務(wù),以及所有提交時間低于所述第一事務(wù)的事務(wù)已完全被應(yīng)用,那么基于與所述第一事務(wù)相關(guān)的序列號更新所述持久儲存的水位標(biāo)。44.根據(jù)權(quán)利要求31所述的方法,其中所述條目識別由在第一數(shù)據(jù)庫內(nèi)執(zhí)行的事務(wù)作出的變更;以及所述目的站點(diǎn)通過使所述變更反映在不同于所述第一數(shù)據(jù)庫的第二數(shù)據(jù)庫中處理所述條目。45.根據(jù)權(quán)利要求44所述的方法,其中,使所述變更被反映的步驟包括基于與在所述第一數(shù)據(jù)庫內(nèi)執(zhí)行的特定事務(wù)相關(guān)的變更,構(gòu)造一個或多個數(shù)據(jù)庫命令的集合,以及執(zhí)行作為所述第二數(shù)據(jù)庫內(nèi)的事務(wù)的所述一個或多個數(shù)據(jù)庫命令的集合。46.一種用于響應(yīng)與數(shù)據(jù)庫對象相關(guān)的DDL操作的方法,所述方法包括以下步驟響應(yīng)于與數(shù)據(jù)庫對象相關(guān)的DDL語句的執(zhí)行,生成表明由所述DDL語句所作的變更的記錄;以及基于所述記錄,執(zhí)行相對于所述DDL語句的執(zhí)行異步的動作。47.根據(jù)權(quán)利要求46所述的方法,其中所述記錄包括相關(guān)性信息;所述方法還包括以下步驟使用所述相關(guān)性信息以確定哪些其它動作依賴于所述動作;以及執(zhí)行與不依賴于所述動作的其它動作同時發(fā)生的動作。48.根據(jù)權(quán)利要求46所述的方法,其中執(zhí)行動作的步驟包括導(dǎo)致作出相應(yīng)變更;以及相對于所述數(shù)據(jù)庫對象的副本作出所述相應(yīng)變更。49.根據(jù)權(quán)利要求48所述的方法,其中,執(zhí)行導(dǎo)致相應(yīng)變更的步驟,而不必禁止參與所述數(shù)據(jù)庫對象復(fù)制的任何數(shù)據(jù)庫。50.根據(jù)權(quán)利要求48所述的方法,其中,執(zhí)行導(dǎo)致相應(yīng)的變更的步驟,而不必限制參與所述數(shù)據(jù)庫對象復(fù)制的任何數(shù)據(jù)庫內(nèi)的用戶活動。51.根據(jù)權(quán)利要求48所述的方法,其中,所述DDL語句的執(zhí)行導(dǎo)致所述數(shù)據(jù)庫對象的創(chuàng)建,以及所述相應(yīng)變更導(dǎo)致所述副本的創(chuàng)建。52.根據(jù)權(quán)利要求48所述的方法,其中,所述DDL語句的執(zhí)行變更了如何所述構(gòu)造數(shù)據(jù)庫對象,以及所述相應(yīng)變更導(dǎo)致所述副本的結(jié)構(gòu)的改變。53.根據(jù)權(quán)利要求48所述的方法,其中,生成記錄的步驟包括將信息儲存在重做日志中。54.根據(jù)權(quán)利要求53所述的方法,其中,導(dǎo)致作出相應(yīng)變更的步驟包括以下步驟從所述重做日志讀取信息;基于來自所述重做日志的信息,生成表明所述數(shù)據(jù)庫對象如何被改變的變更數(shù)據(jù);以及將所述變更數(shù)據(jù)應(yīng)用于所述副本。55.根據(jù)權(quán)利要求54所述的方法,其中,相對于所述DDL語句的執(zhí)行,異步執(zhí)行生成所述變更數(shù)據(jù)的步驟。56.根據(jù)權(quán)利要求53所述的方法,其中所述重做日志包括識別對所述數(shù)據(jù)庫對象內(nèi)的數(shù)據(jù)作出的變更的信息;以及所述方法還包括基于來自所述重做日志的信息變更包含在所述副本中的數(shù)據(jù)的步驟。57.根據(jù)權(quán)利要求54所述的方法,還包括在將所述變更數(shù)據(jù)應(yīng)用于所述副本之前,將所述變更數(shù)據(jù)儲存在中間存儲區(qū)中的步驟。58.根據(jù)權(quán)利要求57所述的方法,還包括從所述中間存儲區(qū)讀取所述變更數(shù)據(jù),以及將所述變更數(shù)據(jù)傳播到所述副本所在的站點(diǎn)。59.根據(jù)權(quán)利要求54所述的方法,其中,生成變更數(shù)據(jù)的步驟由捕獲引擎基于已被用戶登記的規(guī)則集執(zhí)行。60.根據(jù)權(quán)利要求58所述的方法,其中,傳播所述變更數(shù)據(jù)的步驟由傳播引擎基于已被用戶登記的規(guī)則集執(zhí)行。61.根據(jù)權(quán)利要求54所述的方法,其中,應(yīng)用所述變更數(shù)據(jù)的步驟由應(yīng)用引擎基于已被用戶登記的規(guī)則集執(zhí)行。62.根據(jù)權(quán)利要求48所述的方法,其中所述數(shù)據(jù)庫對象是建立數(shù)據(jù)庫系統(tǒng)的新用戶的用戶對象;所述DDL語句的執(zhí)行創(chuàng)建所述用戶對象;以及導(dǎo)致作出相應(yīng)變更的步驟包括在另一數(shù)據(jù)庫系統(tǒng)中創(chuàng)建副本用戶對象以證實所述新用戶是所述另一數(shù)據(jù)庫系統(tǒng)的新用戶。63.根據(jù)權(quán)利要求48所述的方法,其中所述數(shù)據(jù)庫對象是用于數(shù)據(jù)庫系統(tǒng)的一個或多個權(quán)限的集合;所述DDL語句的執(zhí)行創(chuàng)建了一個或多個權(quán)限;以及導(dǎo)致作出相應(yīng)變更的步驟包括在另一數(shù)據(jù)庫系統(tǒng)中創(chuàng)建所述一個或多個權(quán)限的副本。64.根據(jù)權(quán)利要求48所述的方法,其中所述DDL語句在第一數(shù)據(jù)庫中執(zhí)行;所述副本駐留在第二數(shù)據(jù)庫中;以及所述方法還包括以下步驟響應(yīng)于與所述副本相關(guān)的第二DDL語句的執(zhí)行,生成表明由所述第二DDL語句作出的變更的第二記錄;以及基于所述記錄,導(dǎo)致作出第二相應(yīng)變更,其中,相對于所述第一數(shù)據(jù)庫中的所述數(shù)據(jù)庫對象作出所述第二相應(yīng)變更。65.根據(jù)權(quán)利要求48所述的方法,其中所述數(shù)據(jù)庫對象是選自包括查看、觸發(fā)、程序、索引、序列、同義詞、回滾段、大綱、數(shù)據(jù)庫鏈接、物化的查看、物化的查看日志的集合的一種類型的數(shù)據(jù)庫對象;所述DDL語句的執(zhí)行創(chuàng)建了所選類型的數(shù)據(jù)庫對象;以及導(dǎo)致作出相應(yīng)變更的步驟包括在另一數(shù)據(jù)庫系統(tǒng)中創(chuàng)建所述類型的數(shù)據(jù)庫對象的副本。66.根據(jù)權(quán)利要求46所述的方法,其中所述DDL語句在第一數(shù)據(jù)庫系統(tǒng)中執(zhí)行;以及執(zhí)行動作的步驟包括將消息發(fā)送到不同于所述第一數(shù)據(jù)庫系統(tǒng)的第二數(shù)據(jù)庫系統(tǒng)。67.一種已在其上儲存指令的計算機(jī)可讀介質(zhì),當(dāng)所述指令被一個或多個處理器執(zhí)行時,使所述處理器執(zhí)行權(quán)利要求1-66中的任一項權(quán)利要求所述的方法。全文摘要本發(fā)明披露了用于在多種環(huán)境下共享信息的方法。描述了一種信息共享系統(tǒng),該系統(tǒng)允許顯式捕獲過程和隱式捕獲過程,以將信息條目添加到中間存儲區(qū)中。此外,信息共享系統(tǒng)支持儲存在所述中間存儲區(qū)中的信息條目的隱式和顯式消費(fèi)。規(guī)則引擎被提供來允許用戶創(chuàng)建和登記定制捕獲過程、消費(fèi)過程和將信息從中間存儲區(qū)傳送到指定目的地的傳播過程的行為的規(guī)則。也描述了用于完成對條目序列恰好處理一次的方法,其中,這些條目被保存在易失性存儲器中。也提供了用于記錄DDL操作和基于之前執(zhí)行的DDL操作異步執(zhí)行操作的方法。文檔編號G06F17/30GK1701325SQ03821299公開日2005年11月23日申請日期2003年7月29日優(yōu)先權(quán)日2002年8月1日發(fā)明者本尼·蘇德爾,迪特爾·加夫利克,吉姆·斯塔莫斯,艾倫·唐寧,尼馬·阿羅拉,馬赫什·蘇布拉馬尼亞姆申請人:甲骨文國際公司