ORACLE認證基礎:ORACLE系統概述

 oracle公司自86年推出版本5開始,系統具有分布資料庫處理功能.88年推出版本6,oracle rdbms(v6.0)可帶事務處理選項(tpo),提高了事務處理的速度.1992年推出了版本7,在oracle rdbms中可帶過程資料庫選項(procedural database option)和並行伺服器選項(parallel server option),稱為oracle7資料庫管理系統,它釋放了開放的關係型系統的真正潛力。oracle7的協同開發環境提供了新一代集成的軟體生命周期開發環境,可用以實現高生產率、大型事務處理及客戶/伺服器結構的套用系統。協同開發環境具有可移植性,支持多種數據來源、多種圖形用戶界面及多媒體、多民族語言、case等協同套用系統。

  一、 oracle系統

  1.oracle產品結構及組成

 oracle系統是由以rdbms為核心的一批軟體產品構成.

 2. oracle系統特點

 oracle公司於1979年,首先推出基於sql標準的關係資料庫產品,可在100多種硬體平台上運行(所括微機、工作站、小型機、中型機和大型機),支持很多種作業系統。用戶的oracle套用可方便地從一種計算機配置移至另一種計算機配置上。oracle的分散式結構可將數據和套用駐留在多台計算機上,而相互間的通信是透明的。1992年6月oracle公司推出的oracle7協同伺服器資料庫,使關係資料庫技術邁上了新台階。根據idg(國際數據集團)1992年全球unix資料庫市場報告,oracle占市場銷售量50%。它之所以倍受用戶喜愛是因為它有以下突出的特點:

  支持大資料庫、多用戶的高性能的事務處理。oracle支持最大資料庫,其大小可到幾百千兆,可充分利用硬體設備。支持大量用戶同時在同一數據上執行各種數據套用,並使數據爭用最小,保證數據一致性。系統維護具有高的性能,oracle每天可連續24小時工作,正常的系統操作(後備或個別計算機系統故障)不會中斷資料庫的使用。可控制資料庫數據的可用性,可在資料庫級或在子資料庫級上控制。

  oracle遵守數據存取語言、作業系統、用戶接口和網路通信協定的工業標準。所以它是一個開放系統,保護了用戶的投資。美國標準化和技術研究所(nist)對oracle7 server進行檢驗,100%地與ansi/iso sql89標準的二級相兼容。

  實施安全性控制和完整性控制。oracle為限制各監控數據存取提供系統可靠的安全性。oracle實施數據完整性,為可接受的數據指定標準。

  支持分散式資料庫和分布處理。oracle為了充分利用計算機系統和網路,允許將處理分為資料庫伺服器和客戶應用程式,所有共享的數據管理由資料庫管理系統的計算機處理,而運行資料庫套用的工作站集中於解釋和顯示數據。通過網路連線的計算機環境,oracle將存放在多台計算機上的數據組合成一個邏輯資料庫,可被全部網路用戶存取。分散式系統像集中式資料庫一樣具有透明性和數據一致性。

  具有可移植性、可兼容性和可連線性。由於oracle軟體可在許多不同的作業系統上運行,以致oracle上所開發的套用可移植到任何作業系統,只需很少修改或不需修改。oracle軟體同工業標準相兼容,包括許多工業標準的作業系統,所開發套用系統可在任何作業系統上運行。可連線性是指oralce允許不同類型的計算機和作業系統通過網路可共享信息。

  二、 oracle資料庫系統的體系結構

  oracle資料庫系統為具有管理oracle資料庫功能的計算機系統。每一個運行的oracle資料庫與一個oracle實例(instance)相聯繫。一個oracle實例為存取和控制一資料庫的軟體機制。每一次在資料庫伺服器上啟動一資料庫時,稱為系統全局區(system global area)的一記憶體區(簡稱sga)被分配,有一個或多個oracle進程被啟動。該sga 和 oracle進程的結合稱為一個oracle資料庫實例。一個實例的sga和進程為管理資料庫數據、為該資料庫一個或多個用戶服務而工作。

  在oracle系統中,首先是實例啟動,然後由實例裝配(mount)一資料庫。在松耦合系統中,在具有oracle parallel server 選項時,單個資料庫可被多個實例裝配,即多個實例共享同一物理資料庫。

  1. oracle實例的進程結構和記憶體結構

 1) 進程結構

 進程是作業系統中的一種機制,它可執行一系列的操作步。在有些作業系統中使用作業(job)或任務(task)的術語。一個進程通常有它自己的專用存儲區。oracle進程的體系結構設計使性能最大。

  oracle實例有兩種類型:單進程實例和多進程實例。

 單進程oracle(又稱單用戶oracle)是一種資料庫系統,一個進程執行全部oracle代碼。由於oracle部分和客戶應用程式不能分別以進程執行,所以oracle的代碼和用戶的資料庫套用是單個進程執行。

 在單進程環境下的oracle 實例,僅允許一個用戶可存取。例如在ms-dos上運行oracle 。

  多進程oracle實例(又稱多用戶oracle)使用多個進程來執行oracle的不同部分,對於每一個連線的用戶都有一個進程。

  在多進程系統中,進程分為兩類:用戶進程和oracle進程。當一用戶運行一應用程式,如pro*c程式或一個oracle工具(如sql*plus),為用戶運行的套用建立一個用戶進程。oracle進程又分為兩類:伺服器進程和後台進程。伺服器進程用於處理連線到該實例的用戶進程的請求。當套用和oracele是在同一台機器上運行,而不再通過網路,一般將用戶進程和它相應的伺服器進程組合成單個的進程,可降低系統開銷。然而,當套用和oracle運行在不同的機器上時,用戶進程經過一個分離伺服器進程與oracle通信。它可執行下列任務:

  對套用所發出的sql語句進行語法分析和執行。

  從磁碟(數據檔案)中讀入必要的數據塊到sga的共享資料庫緩衝區(該塊不在緩衝區時)。

  將結果返回給應用程式處理。

 系統為了使性能最好和協調多個用戶,在多進程系統中使用一些附加進程,稱為後台進程。在許多作業系統中,後台進程是在實例啟動時自動地建立。一個oracle實例可以有許多後台進程,但它們不是一直存在。後台進程的名字為:

  dbwr  資料庫寫入程式

 lgwr 日誌寫入程式

 ckpt 檢查點

 smon 系統監控

 pmon  進程監控

 arch 歸檔

 reco 恢復

 lckn 封鎖

dnnn 調度進程

 snnn 伺服器

 每個後台進程與oracle資料庫的不同部分互動。

  下面對後台進程的功能作簡單介紹:

 dbwr進程:該進程執行將緩衝區寫入數據檔案,是負責緩衝存儲區管理的一個oracle後台進程。當緩衝區中的一緩衝區被修改,它被標誌為“弄髒”,dbwr的主要任務是將“弄髒”的緩衝區寫入磁碟,使緩衝區保持“乾淨”。由於緩衝存儲區的緩衝區填入資料庫或被用戶進程弄髒,未用的緩衝區的數目減少。當未用的緩衝區下降到很少,以致用戶進程要從磁碟讀入塊到記憶體存儲區時無法找到未用的緩衝區時,dbwr將管理緩衝存儲區,使用戶進程總可得到未用的緩衝區。

 oracle採用lru(least recently used)算法(最近最少使用算法)保持記憶體中的數據塊是最近使用的,使i/o最小。在下列情況預示dbwr 要將弄髒的緩衝區寫入磁碟:

  當一個伺服器進程將一緩衝區移入“弄髒”表,該弄髒表達到臨界長度時,該服務進程將通知dbwr進行寫。該臨界長度是為參數db-block-write-batch的值的一半。

  當一個伺服器進程在lru表中查找db-block-max-scan-cnt緩衝區時,沒有查到未用的緩衝區,它停止查找並通知dbwr進行寫。

  出現逾時(每次3秒),dbwr 將通知本身。

  當出現檢查點時,lgwr將通知dbwr

  在前兩種情況下,dbwr將弄髒表中的塊寫入磁碟,每次可寫的塊數由初始化參數db-block-write-batch所指定。如果弄髒表中沒有該參數指定塊數的緩衝區,dbwr從lur表中查找另外一個弄髒緩衝區。

  如果dbwr在三秒內未活動,則出現逾時。在這種情況下dbwr對lru表查找指定數目的緩衝區,將所找到任何弄髒緩衝區寫入磁碟。每當出現逾時,dbwr查找一個新的緩衝區組。每次由dbwr查找的緩衝區的數目是為寢化參數db-block-write-batch的值的二倍。如果資料庫空運轉,dbwr最終將全部緩衝區存儲區寫入磁碟。

  在出現檢查點時,lgwr指定一修改緩衝區表必須寫入到磁碟。dbwr將指定的緩衝區寫入磁碟。

  在有些平台上,一個實例可有多個dbwr。在這樣的實例中,一些塊可寫入一磁碟,另一些塊可寫入其它磁碟。參數db-writers控制dbwr進程個數。

  lgwr進程:該進程將日誌緩衝區寫入磁碟上的一個日誌檔案,它是負責管理日誌緩衝區的一個oracle後台進程。lgwr進程將自上次寫入磁碟以來的全部日誌項輸出,lgwr輸出:

  當用戶進程提交一事務時寫入一個提交記錄。

  每三秒將日誌緩衝區輸出。

  當日誌緩衝區的1/3已滿時將日誌緩衝區輸出。

  當dbwr將修改緩衝區寫入磁碟時則將日誌緩衝區輸出。

  lgwr進程同步地寫入到活動的鏡象線上日誌檔案組。如果組中一個檔案被刪除或不可用,lgwr 可繼續地寫入該組的其它檔案。

  日誌緩衝區是一個循環緩衝區。當lgwr將日誌緩衝區的日誌項寫入日誌檔案後,伺服器進程可將新的日誌項寫入到該日誌緩衝區。lgwr 通常寫得很快,可確保日誌緩衝區總有空間可寫入新的日誌項。

  注意:有時候當需要更多的日誌緩衝區時,lwgr在一個事務提交前就將日誌項寫出,而這些日誌項僅當在以後事務提交後才永久化。

  oracle使用快速提交機制,當用戶發出commit語句時,一個commit記錄立即放入日誌緩衝區,但相應的數據緩衝區改變是被延遲,直到在更有效時才將它們寫入數據檔案。當一事務提交時,被賦給一個系統修改號(scn),它同事務日誌項一起記錄在日誌中。由於scn記錄在日誌中,以致在並行伺服器選項配置情況下,恢復操作可以同步。

  ckpt進程:該進程在檢查點出現時,對全部數據檔案的標題進行修改,指示該檢查點。在通常的情況下,該任務由lgwr執行。然而,如果檢查點明顯地降低系統性能時,可使ckpt進程運行,將原來由lgwr進程執行的檢查點的工作分離出來,由ckpt進程實現。對於許多套用情況,ckpt進程是不必要的。只有當資料庫有許多數據檔案,lgwr在檢查點時明顯地降低性能才使ckpt運行。ckpt進程不將塊寫入磁碟,該工作是由dbwr完成的。

  初始化參數checkpoint-process控制ckpt進程的使能或使不能。預設時為false,即為使不能。

  smon進程:該進程實例啟動時執行實例恢復,還負責清理不再使用的臨時段。在具有並行伺服器選項的環境下,smon對有故障cpu或實例進行實例恢復。smon進程有規律地被呼醒,檢查是否需要,或者其它進程發現需要時可以被調用。

  pmon進程:該進程在用戶進程出現故障時執行進程恢復,負責清理記憶體儲區和釋放該進程所使用的資源。例:它要重置活動事務表的狀態,釋放封鎖,將該故障的進程的id從活動進程表中移去。pmon還周期地檢查調度進程(dispatcher)和伺服器進程的狀態,如果已死,則重新啟動(不包括有意刪除的進程)。

 pmon有規律地被呼醒,檢查是否需要,或者其它進程發現需要時可以被調用。

  reco進程:該進程是在具有分散式選項時所使用的一個進程,自動地解決在分散式事務中的故障。一個結點reco後台進程自動地連線到包含有懸而未決的分散式事務的其它資料庫中,reco自動地解決所有的懸而不決的事務。任何相應於已處理的懸而不決的事務的行將從每一個資料庫的懸掛事務表中刪去。

 當一資料庫伺服器的reco後台進程試圖建立同一遠程伺服器的通信,如果遠程伺服器是不可用或者網路連線不能建立時,reco自動地在一個時間間隔之後再次連線。

  reco後台進程僅當在允許分散式事務的系統中出現,而且distributed – transactions參數是大於0。

  arch進程:該進程將已填滿的線上日誌檔案拷貝到指定的存儲設備。當日誌是為archivelog使用方式、並可自動地歸檔時arch進程才存在。

  lckn進程:是在具有並行伺服器選件環境下使用,可多至10個進程(lck0,lck1……,lck9),用於實例間的封鎖。

  dnnn進程(調度進程):該進程允許用戶進程共享有限的伺服器進程(server process)。沒有調度進程時,每個用戶進程需要一個專用服務進程(dedicatedserver process)。對於多線索伺服器(multi-threaded server)可支持多個用戶進程。如果在系統中具有大量用戶,多線索伺服器可支持大量用戶,尤其在客戶_伺服器環境中。

 在一個資料庫實例中可建立多個調度進程。對每種網路協定至少建立一個調度進程。資料庫管理員根據作業系統中每個進程可連線數目的限制決定啟動的調度程式的最優數,在實例運行時可增加或刪除調度進程。多線索伺服器需要sql*net版本2或更後的版本。在多線索伺服器的配置下,一個網路接收器進程等待客戶套用連線請求,並將每一個傳送到一個調度進程。如果不能將客戶套用連線到一調度進程時,網路接收器進程將啟動一個專用伺服器進程。該網路接收器進程不是oracle實例的組成部分,它是處理與oracle有關的網路進程的組成部分。在實例啟動時,該網路接收器被打開,為用戶連線到oracle建立一通信路徑,然後每一個調度進程把連線請求的調度進程的地址給予於它的接收器。當一個用戶進程作連線請求時,網路接收器進程分析請求並決定該用戶是否可使用一調度進程。如果是,該網路接收器進程返回該調度進程的地址,之後用戶進程直接連線到該調度進程。有些用戶進程不能調度進程通信(如果使用sql*net以前的版本的用戶),網路接收器進程不能將如此用戶連線到一調度進程。在這種情況下,網路接收器建立一個專用伺服器進程,建立一種合適的連線。

  2)、oracle記憶體結構

  oracle在記憶體存儲下列信息:

  執行的程式代碼。

  連線的會話信息

  程式執行期間所需數據和共享的信息

  存儲在外存儲上的緩衝信息。

 oracle具有下列基本的記憶體結構:

  軟體代碼區

  系統全局區,包括資料庫緩衝存儲區、日誌緩衝區和共享池.

  程式全局區,包括棧區和數據區.

  排序區

  軟體代碼區

 用於存儲正在執行的或可以執行的程式代碼。

 軟體區是唯讀,可安裝成共享或非共享。oracle系統程式是可共享的,以致多個oracle用戶可存取它,而不需要在記憶體有多個副本。用戶程式可以共享也可以不共享。

  系統全局區

 為一組由oracle分配的共享的記憶體結構,可包含一個資料庫實例的數據或控制信息。如果多個用戶同時連線到同一實例時,在實例的sga中數據可為多個用戶所共享,所以又稱為共享全局區。當實例起動時,sga的存儲自動地被分配;當實例關閉時,該存儲被回收。所有連線到多進程資料庫實例的全部用戶可自動地被分配;當實例關閉時,該存儲被回收。所有連線到多進程資料庫實例的全部用戶可使用其sga中的信息,但僅僅有幾個進程可寫入信息。在sga中存儲信息將記憶體劃分成幾個區:資料庫緩衝存儲區、日誌緩衝區、共享池、請求和回響佇列、數據字典存儲區和其它各種信息。

  程式全局區

 pga是一個記憶體區,包含單個進程的數據和控制信息,所以又稱為進程全局區(process global area)。

  排序區

 排序需要記憶體空間,oracle利用該記憶體排序數據,這部分空間稱為排序區。排序區存在於請求排序的用戶進程的記憶體中,該空間的大小為適就排序數據量的大小,可增長,但受初始化參數sort-area-sizer所限制。

  2. oracle的配置方案

  所有連線到oracle的用戶必須執行兩個代碼模組可存取一個oracle資料庫實例:

  套用或oracle工具:一資料庫用戶執行一資料庫套用或一個oracle工具,可向oracle資料庫發出sql語句。
oracle伺服器程式:負責解釋和處理套用中的sql語句。

  在多進程實例中,連線用戶的代碼可按下列三種方案之一配置:

  對於每一個用戶,其資料庫應用程式和伺服器程式組合成單個用戶進程

  對於每一個用戶,其資料庫套用是由用戶進程所運行,並有一個專用伺服器進程。執行oracle伺服器的代碼。這樣的配置稱為專用伺服器體系結構

  執行資料庫套用的進程不同於執行oracle伺服器代碼的進程,而且每一個伺服器進程(執行oracle伺服器代碼)可服務於多個用戶進程,這樣的配置稱為多線索伺服器體系結構。

  1) user/server進程相結合的結構

 在這種配置下,資料庫套用和oracle伺服器程式是在同一個進程中運行,該進程稱為用戶進程。

 這種oracle配置有時稱為單任務oracle(single_task oracle),該配置適用於這樣的作業系統,它可在同一進程中的資料庫套用和oracle代碼之間維護一個隔離,該隔離是為數據安全性和完整性所需。其中程式接口(program interface)是負責oracle伺服器代碼的隔離和保護,在資料庫套用和oracle用戶程式之間傳送數據。

  2) 使用專用伺服器進程的系統結構

  使用專用伺服器進程的oracle系統在兩台計算機上運行。在這種系統中,在一計算機上用戶進程執行資料庫套用,而在另一台計算機上的伺服器進程執行相應的oracle伺服器代碼,這兩個進程是分離的。為每個用戶進程建立的不同的伺服器進程稱為專用伺服器進程,因為該伺服器進程僅對相連的用戶進程起作用。這種配置又稱為兩任務oracle。每一個連線到oracle的用戶進程有一個相應的專用服務進程。這種系統結構允許客戶套用是有工作站上執行,通過網路與運行oracle的計算機通信。當客戶套用和oracle伺服器代碼是在同一台計算機上執行時,這種結構也可用。

  3) 多線索伺服器的系統結構

  多線索伺服器配置允許許多用戶進程共享很少伺服器進程。在沒有多線索伺服器的配置中,每一個用戶進程需要自己的專用伺服器進程。在具有多線索伺服器的配置中,許多用戶進程連線到調度進程,由調度進程將客戶請求傳送到一個共享伺服器進程。多線索伺服器配置的優點是降低系統開銷,增加用戶個數。

  該系統中需要下列類型的進程:

 網路接收器進程,將用戶進程連線到調度進程和專用伺服器進程。

  一個或多個調度進程

 一個或多個共享伺服器進程

  其中網路接收器進程等待新來的連線請求,決定每一用戶進程能否用共享伺服器進程。如果可以使用,接收器進程將一調度進程的地址返回給用戶進程。如果用戶進程請求一專用伺服器,該接收器進程將建立一個專用伺服器進程,將用戶進程連線到該專用伺服器進程。對於資料庫客戶機所使用的每種網路協定至少配置一個調度進程,並啟動它。

  當用戶作一次調用時,調度進程將請求放置在sga的請求佇列中,由可用的共享伺服器進程獲取。共享伺服器進程為完成每一個用戶進程的請求作所有必要的資料庫調用。當伺服器完成請求時,將結果返回到調度進程的佇列,然後由調度進程將完成的請求返回給用戶進程。

  共享伺服器進程:除共享伺服器進程不是連線指定的用戶進程外,共享伺服器進程和專用伺服器進程提供相同的功能,一個共享伺服器進程在多線索伺服器的配置中可為任何客戶請求服務。一個共享伺服器進程的sga不包含有與用戶相關的數據,其信息可為所有共享伺服器進程存取,它僅包含棧空間、進程指定變數。所有與會話有關的信息是包含有sga中。每一個共享伺服器進程可存取全部會話的數據空間,以致任何服務進程可處理任何會話的請求。對於每一個會話的數據空間是在sga中分配空間。

  oracle根據請求佇列的長度可動態地調整共享伺服器進程。可建立的共享伺服器進程將請求放到請求佇列。一個用戶請求是對資料庫的一次程式接口調用,為sql語句。在sga中請求佇列對實例的全部調度進程是公用的。伺服器進程為新請求檢查公用請求佇列,按先進先出的原則從佇列檢出一個請求,然後為完成該請求對資料庫作必要的調用。共享伺服器進程將回響放在調度進程的回響佇列。每一個調度進程在sga中有自己的回響佇列,每個調度進程負責將完成的請求回送給相應的用戶進程。

  3.oracle運行

 1) 使用專用服務進程的oracle的運行

 在這種配置下,oracle運行過程如下:

 (1) 資料庫伺服器計算機當前正在運行oracle(後台進程)。

 (2) 在一客戶工作站運行一個資料庫套用(為用戶進程),如sql*plus。客戶套用使用sql*net driver建立對伺服器的連線。

 (3) 資料庫伺服器計算機當前正運行合適的sql*net driver,該機上接收器進程檢出客戶資料庫套用的連線請求,並在該機上為用戶進程建立專用伺服器進程。

 (4) 用戶發出單個sql語句。

 (5) 專用伺服器進程接收該語句,在此處有兩種方法處理sql語句:

  如果在共享池一共享sql區中包含有相同sql語句時,該伺服器進程可利用已存在的共享sql區執行客戶的sql語句。

?如果在共享池中沒有一個sql區包含有相同的sql語句時,在共享池中為該語句分配一新的共享sql區。

  在每一種情況,在會話的pga中建立一個專用sql區,專用伺服器進程檢查用戶對查詢數據的存取許可權。
 
 (6) 如果需要,伺服器進程從數據檔案中檢索數據塊,或者可使用已存儲在實例sga中的緩衝存儲區的數據塊。

 (7) 伺服器進程執行存儲在共享sql區中的sql語句。數據首先在sga中修改,由dbwr進程在最有效時將它寫入磁碟。lgwr進程在線上日誌檔案中記錄用戶提交請求的事務。

 (8)如果請求成功,伺服器將通過網路傳送一信息。如果請求不成功,將傳送相應的錯誤信息。

 (9)在整個過程中,其它的後台進程是運行的,同時注意需要干預的條件。另外,oracle管理其它事務,防止不同事務之間請求同一數據的競爭。

 2) 使用多線索伺服器的oracle的運行

 在這種配置下,oracle運行過程如下:

 (1) 一資料庫伺服器計算機運行使用多線索伺服器配置的oracle。

 (2) 在一客戶工作站運行一資料庫套用(在一用戶進程中)。客戶套用合適的sql*net驅動器試圖建立到資料庫伺服器計算機的連線。

 (3) 資料庫伺服器計算機當前運行合適的sql*net驅動器,它的網路接收器進程檢出用戶進程的連線請求,並決定用戶進程如何連線。如果用戶是使用sql*net版本2,該網路接收器通知用戶進程使用一個可用的調度進程的地址重新連線。

 (4) 用戶發出單個sql語句

  (5) 調度進程將用戶進程的請求放入請求佇列,該佇列位於sga中,可為所有調度進程共享。

 (6) 一個可用共享伺服器檢驗公用調度進程請求佇列,並從佇列中檢出下一個sql語句。然後處理該sql語句,同前一(5),(6)和(7)。注意:會話的專用sql區是建立在sga中。

 (7) 一當共享伺服器進程完成sql處理,該進程將結果放置發入該請求的調度進程的回響佇列。

 (8) 調度進程檢查它的回響佇列,並將完成的請求送回請求的用戶進程。

  4.資料庫結構和空間管理

 一個oracle資料庫是數據的集合,被處理成一個單位。一個oracle資料庫有一個物理結構和一個邏輯結構。

 物理資料庫結構(physical database structure)是由構成資料庫的作業系統檔案所決定。每一個oracle資料庫是由三種類型的檔案組成:數據檔案、日誌檔案和控制檔案。資料庫的檔案為資料庫信息提供真正的物理存儲。

 邏輯資料庫結構是用戶所涉及的資料庫結構。一個oracle資料庫的邏輯結構由下列因素決定:

 一個或多個表空間

 資料庫模式對象(即表、視圖、索引、聚集、序列、存儲過程)

 邏輯存儲結構如表空間(dataspace)、段(segment)和範圍將支配一個資料庫的物理空間如何使用。模式對象(schema object)用它們之間的聯繫組成了一個資料庫的關係設計。

  1) 物理結構

  (1) 數據檔案

 每一個oracle資料庫有一個或多個物理的數據檔案(data file)。一個資料庫的數據檔案包含全部資料庫數據。邏輯資料庫結構(如表、索引)的數據物理地存儲在資料庫的數據檔案中。數據檔案有下列特徵:

一個數據檔案僅與一個資料庫聯繫。

 一旦建立,數據檔案不能改變大小

 一個表空間(資料庫存儲的邏輯單位)由一個或多個數據檔案組成。

數據檔案中的數據在需要時可以讀取並存儲在oracle記憶體儲區中。例如:用戶要存取資料庫一表的某些數據,如果請求信息不在資料庫的記憶體存儲區內,則從相應的數據檔案中讀取並存儲在記憶體。當修改和插入新數據時,不必立刻寫入數據檔案。為了減少磁碟輸出的總數,提高性能,數據存儲在記憶體,然後由oracle後台進程dbwr決定如何將其寫入到相應的數據檔案。

  (2) 日誌檔案

 每一個資料庫有兩個或多個日誌檔案(redo log file)的組,每一個日誌檔案組用於收集資料庫日誌。日誌的主要功能是記錄對數據所作的修改,所以對資料庫作的全部修改是記錄在日誌中。在出現故障時,如果不能將修改數據永久地寫入數據檔案,則可利用日誌得到該修改,所以從不會丟失已有操作成果。

 日誌檔案主要是保護資料庫以防止故障。為了防止日誌檔案本身的故障,oracle允許鏡象日誌(mirrored redo log),以致可在不同磁碟上維護兩個或多個日誌副本。

  日誌檔案中的信息僅在系統故障或介質故障恢複數據庫時使用,這些故障阻止將資料庫數據寫入到資料庫的數據檔案。然而任何丟失的數據在下一次資料庫打開時,oracle自動地套用日誌檔案中的信息來恢複數據庫數據檔案。

  (3) 控制檔案

 每一oracle資料庫有一個控制檔案(control file),它記錄資料庫的物理結構,包含下列信息類型:

資料庫名;

資料庫數據檔案和日誌檔案的名字和位置;

 ? 資料庫建立日期。

 為了安全起見,允許控制檔案被鏡象。

 每一次oracle資料庫的實例啟動時,它的控制檔案用於標識資料庫和日誌檔案,當著手資料庫操作時它們必須被打開。當資料庫的物理組成更改時,oracle自動更改該資料庫的控制檔案。數據恢復時,也要使用控制檔案。

2) 邏輯結構

 資料庫邏輯結構包含表空間、段、範圍(extent)、數據塊和模式對象。

 (1) 表空間

 一個資料庫劃分為一個或多個邏輯單位,該邏輯單位稱為表空間(tablespace)。一個表空間可將相關的邏輯結構組合在一起。dba可利用表空間作下列工作:

  控制資料庫數據的磁碟分配。

  將確定的空間份額分配給資料庫用戶。

  通過使單個表空間線上或離線,控制數據的可用性。

  執行部分資料庫後備或恢復操作。

  為提高性能,跨越設備分配數據存儲。

  資料庫、表空間和數據檔案之間的關係如下圖所示:

database



dtatafile1

(2mb)  datafile2

  (2mb)  datafile3

(2mb)

driver1 driver2

  每個資料庫可邏輯劃分為一個或多個表空間

  每一個表空間是由一個或多個數據檔案組成,該表空間物理地存儲表空間中全部邏輯結構的數據。dba可以建立新的表空間,可為表空間增加數據檔案或可刪除數據檔案,設定或更改預設的段存儲位置。

  每一個oracle資料庫包含有一個名為system的表空間,在資料庫建立是自動建立。在該表空間中總包含有整個資料庫的數據字典表。最小的資料庫可只需要system表空間。該表空間必須總是線上。表和存儲的pl/sql程式單元(過程、函式、包和觸發器)的全部存儲數據是存儲在system表空間中。如果這些pl/sql對象是為資料庫建的,dba在system表空間中需要規劃這些對象所需要的空間。

  表空間利用增加數據檔案擴大表空間,表空間的大小為組成該表空間的數據檔案大小的和。

  dba可以使oracle資料庫中任何表空間(除system表空間外)線上(online)或離線(offline)。表空間通常是線上,以致它所包含的數據對資料庫用戶是可用的。當表空間為離線時,其數據不可使用。在下列情況下,dba可以使其離線。

  使部分數據不可用,而剩餘的部分允許正常存取

執行離線的表空間後備

  為了修改或維護一套用,使它和它的一組表臨時不可用。

  包含有正在活動的回滾段的表空間不能被離線,僅當回滾段不正在使用時,該表空間才可離線。

  在數據字典中記錄表空間的狀態,線上還是離線。如果在資料庫關閉時一表空間為離線,那么在下次資料庫裝配和重新打開後,它仍然保持離線。

 當出現某些錯誤時,一個表空間可自動地由線上改變為離線。通過使用多個表空間,將不同類型的數據分開,更方便dba來管理資料庫。

 oracle資料庫中一表空間是由一個或多個物理數據檔案組成,一個數據檔案只可與一個表空間想聯繫。當為一表空間建立一數據檔案時,oracle建立該檔案,分配指定的磁碟空間容量。在數據檔案初時建立後,所分配的磁碟不包含任何數據。表空間可以線上或離線。在oracle中還允許單獨數據檔案線上或離線。

(2) 段、範圍和數據塊

 oracle通過段、範圍和數據塊邏輯數據結構可更細地控制磁碟空間的使用。



 段(segment)包含表空間中一種指定類型的邏輯存儲結構,是由一組範圍組成。在oracle資料庫中有幾種類型的段:數據段、牽引段、回滾段和臨時段。

 數據段:對於每一個非聚集的表有一數據段,表的所有數據存放在該段。每一聚集有一個數據段,聚集中每一個表的數據存儲在該段中。

 索引段:每一個索引有一索引段,存儲索引數據。

  回滾段:是由dba建立,用於臨時存儲要撤消的信息,這些信息用於生成讀一致性資料庫信息、在資料庫恢復時使用、回滾未提交的事務。

 臨時段:當一個sql語句需要臨時工作區時,由oracle建立。當語句執行完畢,臨時段的範圍退回給系統。

 oracle對所有段的空間分配,以範圍為單位。

  範圍

  一個範圍(extent)是資料庫存儲空間分配的一個邏輯單位,它由連續數據塊所組成。每一個段是由一個或多個範圍組成。當一段中間所有空間已完全使用時,oracle為該段分配一個新的範圍。

  為了維護的目的,在資料庫的每一段含有段標題塊(segment header block)說明段的特徵以及該段中的範圍目錄。

  數據塊

 數據塊(data block)是oracle管理數據檔案中存儲空間的單位,為資料庫使用的i/o的最小單位,其大小可不同於作業系統的標準i/o塊大小。



  數據塊的格式:

  公用的變長標題

  表目錄

 行目錄

  未用空間

  行數據

  (3) 模式和模式對象

  一個模式(schema)為模式對象(scehma object)的一個集合,每一個資料庫用戶對應一個模式。模式對象為直接引用資料庫數據的邏輯結構,模式對象包含如表、視圖、索引、聚集、序列、同義詞、資料庫鏈、過程和包等結構。模式對象是邏輯數據存儲結構,每一種模式對象在磁碟上沒有一個相應檔案存儲其信息。一個模式對象邏輯地存儲在資料庫的一個表空間中,每一個對象的數據物理地包含在表空間的一個或多個數據檔案中。

  表

 表(table)為資料庫中數據存儲的基本單位,其數據按行、列存儲。每個表具有一表名和列的集合。每一列有一個列名、數據類型、寬度或精度、比例。一行是對應單個記錄的列信息的集合。

  視圖

 一個視圖(view)是由一個或多個表(或其他視圖)中的數據的一種定製的表示,是用一個查詢定義,所以可認為是一個存儲的查詢(stored query)或是一個虛表(virtual table)。視圖可在使用表的許多地方使用。

  由於視圖是由表導出的,視圖和表存在許多類似,視圖象表最多可定義254列。視圖可以被查詢,而在修改、插入或刪除時具有一定的限制,在視圖上執行的全部操作真正地影響視圖的基本表中的數據,受到基本表的完整性約束和觸發器的限制。

 視圖與表不同,一個視圖不分配任何存儲空間,視圖不真正地包含數據。由查詢定義的視圖相應於視圖引用表中的數據。視圖只在數據字典中存儲其定義。

  引入視圖有下列好處:

 。通過限制對表的行預定義集合的存取,為表提供附加的安全性

 。隱藏數據複雜性。

 。為用戶簡化命令

 。為基本表的數據提供另一種觀點。

 。可將套用隔離基本表定義的修改

 。用於不用視圖無法表示的查詢。

 。可用於保存複雜查詢。

  聚集

 聚集(cluster)是存儲表數據的可選擇的方法。一個聚集是一組表,將具有同一公共列值的行存儲在一起,並且它們經常一起使用。這些公共列構成聚集碼。例如:emp表各dept表共享deptno列,所以emp表和dept表可聚集在一起,聚集碼的列為deptno列,該聚集將每個部門的全部職工行各該部門的行物理地存儲在同一數據塊中。

  索引

 索引(index)是與表和聚集相關的一種選擇結構。索引是為提高數據檢索的性能而建立,利用它可快速地確定指定的信息。oracle索引為表數據提供快速存取路徑。索引適用於一範圍的行查詢或指定行的查詢。

 索引可建立在一表的一列或多列上,一旦建立,由oracle自動維護和使用,對用戶是完全透明的。索引是邏輯地和物理地獨立於數據,它們的建立或刪除對表沒有影響,套用可繼續處理。索引數據的檢索性能幾乎保持常數,而當一表上存在許多索引時,修改、刪除和插入操作的性能會下降。

  索引有唯一索引各非唯一索引。唯一索引保證表中沒有兩行在定義索引的列上具有重複值。oracle在唯一碼上自動地定義唯一索引實施unique完整性約束。

  組合索引是在表的某個列上所建立的一索引。組全索引可加快select語句的檢索速度,在其where子句中可引用組合索引的全部或主要部分 。所以在定義中給出列的次序,將經常存取的或選擇最多的列放在首位。

  在建立索引時,將在表空間自動地建立一索引段,索引段空間分配和保留空間的使用受下列方式控制:

  索引段範圍的分配常駐該索引段的存儲參數控制。

 其數據塊中未用空間可受該段的pctfree參數設定所控制。

  序列生成器

  序列生成器(sequence generator)產生序列號。在多用戶環境下該序列生成器特別有用,可生成各返回序列號而不需要磁碟i/o或事務封鎖。

  序列號為oracle整數,最多可有38個數字。一個序列定義指出一般信息:序列的名字、上升或下降、序列號之間間距和其它信息。對所有序列的確的定義以行存儲在system表空間中的數據字典表中,所以所有序列定義總是可用。由引用序列號的sql語句使用序列號,可生成一個新的序列號或使用當前序列號。一旦在用戶會話中的sql語句生成一序列號,該序列號僅為該會話可用。序列號生成是獨立於表,所以同一序列生成器可用於一個和多個表。所生成序列號可用於生成唯一的主碼。

  同義詞

 一個同義詞(synonym)為任何表、視圖、快照、序列、過程、函式或包的別名,其定義存儲在數據字典中。同義詞因安全性和方便原因而經常使用,可用於:

可禁止對象的名字及其持有者。

  為分散式資料庫的遠程對象提供位置透明性。

  為用戶簡化sql語句。

  有兩種同義詞:公用和專用。一個公用同義詞為命名為public特殊用戶組所持有,可為資料庫中每一個用戶所存取。一個專用同義詞是包含在指定用戶的模式中,僅為該用戶和授權的用戶所使用。

  雜湊

  雜湊(hashing)是存儲表數據一種可選擇的方法,用以改進數據檢索的性能。要使用雜湊,就要建立雜湊聚集,將表裝入到該聚集。在驃湊聚集中的表行根據雜湊函式的結果進行物理學存儲和檢索。雜湊函式用於生成一個數值的分布,該數值稱為雜湊值,它是基於指定的聚集碼值。

  程式單元

 程式單元(program unit)是指存儲過程、函式和包(package)。一個過程和函式,是由sql語句和pl/sql語句組合在一起,為執行某一個任務的一個可執行單位。一個過程或函式可被建立,在資料庫中存儲其編譯形式,可由用戶或資料庫套用所執行。過程和函式差別在函式總返回單個值給調用者,而過程沒有值返回給調用者。

 包提供相關的過程、函式、變數和其它包結構封裝起來並存貯在一起的一種方法,允許管理者和套用開發者利用該方法組織如此的程式(routine),來提供更多的功能和提高性能。

  資料庫鏈

 資料庫鏈是一個命名的對象,說明從一資料庫到另一資料庫的一路徑(path)。在分散式資料庫中,對全局對象名引用時,資料庫鏈隱式地使用。

  三、資料庫和實例的啟動和關閉

 一個oracle資料庫沒有必要對所有用戶總是可用,資料庫管理員可啟動資料庫,以致它被打開。在資料庫打開情況下,用戶可存取資料庫中的信息。當資料庫不使用時,dba可關閉它,關閉後的資料庫,用戶不能存取其信息。

  資料庫的啟動和關閉是非常重要的管理功能,通過以internal連線到oracle的能力來保護。以internal 連線到oracle需要有下列先決條件:

  該用戶的作業系統賬號具有使用internal連線的作業系統特權。

  對internal資料庫有一口令,該用戶知道其口令。

  另外:當用戶以internal連線時,可連線到專用伺服器,而且是安全連線。

  1. 資料庫啟動

啟動資料庫並使它可用有三步操作:

  啟動一個實例;

  裝配資料庫

  打開資料庫

  1) 啟動一個實例

  啟動一實例的處理包含分配一個sga(資料庫信息使用的記憶體共享區)和後台進程的建立。實例起動的執行先於該實例裝配一資料庫。如果僅啟動實例,則沒有資料庫與記憶體儲結構和進程相聯繫。

  2) 裝配一資料庫

  裝配資料庫是將一資料庫與已啟動的實例相聯。當實例安裝一資料庫之後,該資料庫保持關閉,僅dba可存取。

  3) 打開一資料庫

  打開一資料庫是使資料庫可以進行正常資料庫操作的處理。當一資料庫打開所有用戶可連線到該資料庫用存取其信息。在資料庫打開時,線上數據檔案和線上日誌檔案也被打開。如果一表空間在上一次資料庫關閉時為離線,在資料庫再次打開時,該表空間與它所相聯的數據檔案還是離線的。

  2. 資料庫和實例的關閉

  關閉一實例以及它所連線的資料庫也有三步操作:

  1) 關閉資料庫

 資料庫停止的第一步是關閉資料庫。當資料庫關閉後,所有在sga中的資料庫數據和恢複數據相應地寫入到數據檔案和日誌檔案。在這操作之後,所有在線上數據檔案和在線上的日誌檔案也被關閉,任何離線表空間中數據資料夾是已關閉的。在資料庫關閉後但還安裝時,控制檔案仍保持打開。

2) 卸下資料庫

  停止資料庫的第二步是從實例卸下資料庫。在資料庫卸下後,在計算機記憶體中僅保留實例。在資料庫卸下後,資料庫的控制檔案也被關閉。

  3) 停止實例

  停止資料庫的最後一步是停止實例。當實例停止後,sag是從記憶體中撤消,後台進程被中止。

    3. 初始化參數檔案

 在啟動一個實例時,oracle必須讀入一初始化參數檔案(initialization parameter file),該參數檔案是一個文本檔案,包含有實例配置參數。這些參數置成特殊值,用於初始oracle實例的許多記憶體和進程設定,該參數檔案包含:

  一個實例所啟動的資料庫名字

  在sga中存儲結構使用多少記憶體;

  在填滿線上日誌檔案後作什麼;

  資料庫控制檔案的名字和位置;

 在資料庫中專用回滾段的名字。

  四、數據字典的使用

 數據字典是oracle資料庫的最重要的部分之一,是由一組唯讀的表及其視圖所組成。它提供有關該資料庫的信息,可提供的信息如下:

oracle用戶的名字;

每一個用戶所授的特權和角色;

模式對象的名字(表、視圖、快照、索引、聚集、同義詞、序列、過程、函式、包及觸發器等);

關於完整性約束的信息;

列的預設值;

有關資料庫中對象的空間分布及當前使用情況;

  審計信息(如誰存取或修改各種對象);

  其它一般的資料庫信息。

 可用sql存取數據字典,由於數據字典為唯讀,允許查詢。

  1. 數據字典的結構

  資料庫數據字典是由基本表和用戶可存取的視圖組成。

 基本表:數據字典的基礎是一組基本表組成,存儲相關的資料庫的信息。這些信息僅由oracle讀和寫,它們很少被oracle用戶直接存取。

  用戶可存取視圖:數據字典包含用戶可存取視圖,可概括地方便地顯示數據字典的基本表的信息。視圖將基本表中信息解碼成可用信息。

  2. 數據字典的使用

  當資料庫打開時,數據字典總是可用,它駐留在system表空間中。數據字典包含視圖集,在許多情況下,每一視圖集有三種視圖包含有類似信息,彼此以 前綴 相區別,前綴 user、all和dba。

?前綴為user的視圖,為用 視圖,是在用戶的模式內。

?前綴為all的視圖,為擴展的用戶視圖(為用戶可存取的視圖)。

?前綴為dba的視圖為dba的視圖(為全部用戶可存取的視圖)。

  在資料庫中oracle還維護了一組虛表記錄當前資料庫的活動,這些表稱為動態性能表。動態性能表不是真正的表,許多用戶不能存取,dba可查詢這些表,可以建立視圖,給其它用戶授予存取視圖權。

  五、事務管理

  1. 事務

一個事務為工作的一個邏輯單位,由一個或多個sql語句組成。一個事務是一個原子單位,構成事務的全部sql語句的結果可被全部提交或者全部回滾。一個事務由第一個可執行sql語句開始,以提交或回滾結束,可以是顯式的,也可是隱式的(執行ddl語句)。

  在執行一個sql語句出現錯誤時,該語句所有影響被回滾,好像該語句沒有被執行一樣,但它不會引起當前事務先前的工作的丟失。

  2. oracle的事務管理

  在oracle中一個事務是由一個可執行的sql語句開始,一個可執行sql語句產生對實例的調用。在事務開始時,被賦給一個可用回滾段,記錄該事務的回滾項。一個事務以下列任何一個出現而結束。

 當commit或rollback(沒有savepoint子句)語句發出。

 一個ddl語句被執行。在ddl語句執行前、後都隱式地提交。

用戶撤消對oracle的連線(當前事務提交)。

用戶進程異常中止(當前事務回滾)。

  1) 提交事務

  提交一事務,即將在事務中由sql語句所執行的改變永久化。在提交前,oracle已有下列情況:

  在sga的回滾段緩衝區已生成回滾段記錄,回滾信息包含有所修改值的老值。

  在sga的日誌緩衝區已生成日誌項。這些改變在事務提交前可進入磁碟。

 對sga的資料庫緩衝區已作修改,這些修改在事務真正提交之前可進入磁碟。

  在事務提交之後,有下列情況:

  對於與回滾段相關的內部事務表記錄提交事務,並賦給一個相應的唯一系統修改號(scn),記錄在表中。

 在sga的日誌緩衝區中日誌項由lgwr進程寫入到線上日誌檔案, 這是構成提交事務的原子事務。

 在行上和表上的封鎖被釋放。

 該事務標誌為完成 。

 注意:對於提交事務的數據修改不必由dbwr後台進程立即寫入數據檔案,可繼續存儲在sga的資料庫緩衝區中,在最有效時將其寫入數據檔案。

  2) 回滾事務

回滾事務的含義是撤消未提交事務中的sql語句所作的對數據修改。oralce允許撤消未提交的整個事務,也允許撤消部分。

  在回滾整個事務(沒有引用保留點)時,有下列情況:

在事務中所有sql語句作的全部修改,利用相應的回滾段被撤消。

所有數據的事務封鎖被釋放。

事務結束。

 當事務回滾到一保留點(具有savepoint)時,有下列情況:

  僅在該保留點之後執行的語句被撤消。

  該指定的保留點仍然被保留,該保留點之後所建立的保留點被刪除。

  自該保留點之後所獲取的全部表封鎖和行封鎖被釋放,但指定的保留點以前所獲取的全部數據封鎖繼續保持。

 該事務仍可繼續。

  3) 保留點

保留點(savepoint)是在一事務範圍內的中間標誌,經常用於將一個長的事務劃分為小的部分。保留點可標誌長事務中的任何點,允許可回滾該點之後的工作。在應用程式中經常使用保留點;例如一過程包含幾個函式,在每個函式前可建立一個保留點,如果函式失敗,很容易返回到每一個函式開始的情況。在回滾到一個保留點之後,該保持點之後所獲得的數據封鎖被釋放。

  六、資料庫觸發器

 1. 觸發器介紹

資料庫觸發器(database trigger)是存儲在資料庫中的過程,當表被修改時它隱式地被激發(執行)。在oracle中允許在對表發出insert、update或delete語句時隱式地執行所定義的過程,這些過程稱為資料庫觸發器。觸發器存儲在資料庫中,並與所相關表分別存儲。觸發器僅可在表上定義。在許多情況中觸發器用於提供很高級的專用資料庫管理系統,來補充oracle的標準功能。觸發器一般用於:

  自動地生成導出的列值;

  防止無效的事務;

  實施更複雜的安全性檢查

  在分散式資料庫中實施跨越結點的引用完整性;

  實施複雜的事務規則;

 提供透明事件日誌;

 提供高級的審計;

  維護同步表複製;

 收集關於存取表的統計。

  注意:資料庫觸發器與sql*forms觸發器之間的差別。資料庫觸發器是定義在表上,存儲在資料庫中,當對表執行insert、update或delete語句時被激發,不管是誰或哪一套用發出。而sql*forms觸發器是sql*form套用的部分,僅當在指定sql*forms套用中執行一個指定觸發器點時才被激發。

  觸發器和說明性完整性約束都可用於約束數據的輸入,但它們之間有一定區別:

  說明性完整性約束是關於資料庫總是為“真”的語句。一個完整性約束套用於表中已有數據和操縱表的任何語句。

 而觸發器約束事務不可套用於在定義觸發器前已裝入的數據,所以它不能保證表中全部數據服從該觸發器的規則。觸發器實施瞬時約束,即在數據改變時實施一約束。

  2. 觸發器的組成:

 一個觸發器有三個基本部件:觸發事件或語句、觸發器的限制、觸發器動作。

  觸發事件或語句:為引起觸發器激發的sql語句,是對指定表insert、update或delete語句。

  觸發器限制:為一布爾表達式,當觸發器激發時該條件必須為true。觸發器的限制是用when子句來指定。

 觸發器的動作:為一個pl/sql塊(過程),由sql語句和pl/sql語句組成。當觸發語句發出,觸發器的限制計算得true時,它被執行。在觸發器動作的語句中,可使用觸發器的處理的當前行的列值(新值、老值),使用形式為:

 new.列名 引用新值

  ole.列名 引用老值

 在定義觸發器時可指定觸發器動作執行次數:受觸發語句影響每一行執行一次或是對觸發語句執行一次。

 對每一觸發語句可有四種類型觸發器:

 行觸發器:對受觸發語句所影響的每一行,行觸發器激發一次。

  語句觸發器:該類型觸發器對觸發語句執行一次,不管其受影響行數。

 定義觸發器可以指定觸發時間,指定激發器動作的執行相對於觸發語句執行之後或之前。

 before觸發器:該觸發器執行觸發器動作是在觸發語句執行之前。

 after觸發器:該觸發器執行觸發器動作是在觸發語句執行之後。

 一個觸發器可處於兩種不同的方式:使能觸發器和使不能觸發器。

  使能觸發器:只要當觸發語句發出,觸發器限制計算為true,這種類型的觸發器執行其觸發動作。

  使不能觸發器:這種觸發器即使其觸發語句被發出,觸發器限制計算為true,也不執行觸發器動作。

 觸發器的原始碼存儲在資料庫中,在第一次執行時,觸發器的原始碼被編譯,存儲在共享池中。如果觸發器從共享池中擠了,再使用時必須再重新編譯。

  七、分布處理和分散式資料庫

 1. 簡介

一個分散式資料庫在用戶面前為單個邏輯資料庫,但實際上是由存儲在多台計算機上的一組資料庫組成。在幾台計算機 上的資料庫通過網路可同時修改和存取,每一資料庫受它的局部的dbms控制。分散式資料庫中每一個資料庫伺服器合作地維護全局資料庫的一致性。

 在系統中的每一台計算機稱為結點。如果一結點具有管理資料庫 軟體,該結點稱為資料庫伺服器。如果一個結點為請求伺服器的信息的一套用,該結點稱為客戶。在oracle客戶,執行資料庫套用,可存取數據信息和與用戶互動。在伺服器,執行oracle軟體,處理對oracle資料庫並發、共享數據存取。oracle允許上述兩部分在同一台計算機上,但當客戶部分和伺服器部分是由網連線的不同計算機上時,更有效。

 分布處理是由多台處理機分擔單個任務的處理。在oracle資料庫系統中分布處理的例子如:

 客戶和伺服器是位於網路連線的不同計算機上。

 單台計算機上有多個處理器,不同處理器分別執行客戶套用。

 sql*net是oracle網路接口,允許運行在網路工作站的oracle工具和伺服器上,可存取、修改、共享和存儲在其它伺服器上的數據。saql*net可被認為是網路通信的程式接口。sql*net利用通信協定和應用程式接口(api)為oarcle提供一個分散式資料庫和分布處理。

 sql*net驅動器為在資料庫伺服器上運行的oracle進程與oracle工具的用戶進程之間提供一個接口。

參與分散式資料庫的每一伺服器是分別地獨立地管理資料庫,好 像每一資料庫不是網路化的資料庫。每一個資料庫獨立地被管理,稱為場地自治性。場地自治性有下列好處:

  系統的結點可反映公司的邏輯組織。

  由局部資料庫管理員控制局部數據,這樣每一個資料庫管理員責任域要小一些,可更好管理。

  只要一個資料庫和網路是可用,那么全局資料庫可部分可用。不會因一個資料庫的故障而停止全部操作或引起性能瓶頸。

 故障恢復通常在單個結點上進行。

 每個局部資料庫存在一個數據字典。

  結點可獨立地升級軟體。

 可從分散式資料庫的所有結點存取模式對象,因此正像非分布的局部的dbms,必須提供一種機制,可在局部資料庫中引用一個對象。分散式dbms必須提供一種命名模式,以致分散式資料庫中一個對象可在套用中唯一標識和引用。一般彩在層次結構的每一層實施唯一性。分散式dvms簡單地擴充層次命名模型,實施在網路上唯一資料庫命名。因此一個對象的全局對象名保證在分散式資料庫內是唯一。

 oracle允許在sql語句中使用佤對象名引用分散式資料庫中的模式對象(表、視圖和過程)。在oracle中,一個模式對象的全局名由三部分組成:包含對象的模式名、對象名、資料庫名、其形式如:

 

  其中scott為模式名,emp為表名,@符號之後為資料庫名.

  一個遠程查詢為一查詢,是從一個或多個遠程表中選擇信息,這些表駐留在同一個遠程結點.

  一個分散式查詢可從兩個或多個結點檢索數據.一個分散式更新可修改兩個或兩個以上結點的數據.

  一個遠程事務為一個事務,包含一人或多個遠程語句,它所引用的全部是在同一個遠程結點上.一個分散式事務中一個事務,包含一個或多個語句修改分散式資料庫的兩個或多個不同結點的數據.

 在分散式資料庫中,事務控制必須在網路上直轄市,保證數據一致性.兩階段提交機制保證參與分散式事務的全部資料庫伺服器是全部提交或全部回滾事務中的語句.

 oracle分散式資料庫系統結構可由oracle資料庫管理員為終端用戶和套用提供位置透明性,利用視圖、同義詞、過程可提供oracle分散式資料庫系統中的位置透明性.

  oracle允許在select(查詢)、insert、update、delete、select…for update和lock table語句中引用遠程數據。對於查詢,包含有連線、聚合、子查詢和select …for  update,可引用本地的、遠程的表和視圖。對於update、insert、delete和lock table語句可引用本地的和遠程的表。注意在引用long和long raw列、序列、修改表和封鎖表時,必須位於同一個結點。oracle不允許作遠程ddl語句。

  在單場地或分散式資料庫中,所有事務都是用commit或rollback語句中止。oracle提供兩種機制實現分散式資料庫中表重複的透明性:錶快照提供異步的表重複;觸發器實現同步的表的重複。在兩種情況下,都實現了對表重複的透明性。

  2. 分散式資料庫全局名與資料庫鏈

 1) 分散式資料庫全局名:每一個資料庫有一個唯一的全局名,由兩部分組成:資料庫名(小於等於8字元)和網路域。全局資料庫名的網路域成分必須服從標準網際網路規範。域名中的層次 由符號“.”分開,域名的次序由葉至根,從左至右。

 2) 資料庫鏈:為對過程資料庫定義的一路徑。資料庫鏈對分散式資料庫的用戶是透明的,資料庫鏈的名字與鏈所指向的資料庫的全局名相同。其由二部分組成:遠程賬號和資料庫串。例建立資料庫鏈的形式:

 creat public datebase link sale。division3。acme。com

 connect to guest identified by password

 using‘db串’;
 
 其中:sales。divisin3。acme。com為定義的鏈名;guest/password 為遠程資料庫的用戶賬號和口令;db串用於遠程連線。由賬號和db串構成完全路徑。如果只有一個則為部分路徑。

  有三種資料庫鏈可用於決定用戶對全部對象名的引用:

  專用資料庫鏈:為一指定用戶建立。專用資料庫鏈僅鏈的主人可使用。在sql語句中用於指定一全局對象名或者在持有者的視圖過程定義中使用。

  公用資料庫鏈:為特殊的用戶組public建立。公用資料庫鏈可為任何用戶使用,在sql語句中用於指定一個全局對象名或對象定義。

 網路數據鏈:由網路域伺服器建立和管理,可為網路中的任何資料庫的任何用戶使用,可在sql語句中指定全局對象名或對象定義中使用。注意:當前網路域伺服器對oracle不能用,所以網路資料庫鏈不可用。

  3. 錶快照

 oracle的錶快照特徵允許一個主表在分散式資料庫的其它結點進行複製。只允許修改主表,而複製只可讀。主表達式每一個複製稱為一個快照。快照異步的刷新,反映主表的一個最近事務一致狀態。

  一個快照可為表的完全拷貝或者為表的一個子集,由引用一個或多個主表、視圖或其它快照的分散式查詢所定義。包含主表的資料庫稱為主資料庫。

  快照有簡單快照和複雜快照。簡單快照的每行是基於單個遠程表中的一行。所以定義簡單快照的查詢中不能有groub by或connect by子句,或子查詢、連線或集合操作。如果在快照定義的查詢中包含有上述子句或操作,這種快照稱為複雜快照。

 在快照建立時,oracle在快照的模式中建立幾種內部對象:

 在快照結點,oracle建立一基表用於存儲由快照定義的查詢所檢索的行,然後為該表建立一個唯讀的視圖,並為遠程主表建立一視圖,該視圖用於新快照。

 一個快照周期地被刷新,反映它的主表的當前情況。為了刷新一快照,快照定義查詢是被發出,其查詢結果想在存儲在快照中,代替以前的快照數據。

 當快照為簡單快照時,可以由快照日誌來刷新,這樣可加快刷新處理。快照日誌是在主表資料庫中的一表,與主表相關。oracle使用快照日誌跟蹤主表中已修改的行。當基於主表的簡單快照刷新時,僅需要快照日誌的相應行來刷新快照,這種刷新稱為快速刷新。