Oracle的體系結(jié)構(gòu)_第1頁
Oracle的體系結(jié)構(gòu)_第2頁
Oracle的體系結(jié)構(gòu)_第3頁
Oracle的體系結(jié)構(gòu)_第4頁
Oracle的體系結(jié)構(gòu)_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第1章oracle的體系結(jié)構(gòu)這一章的內(nèi)容是比較枯燥的,但它是理解以后章節(jié)的基礎(chǔ)。如果有讀者在開始時有些內(nèi)容沒有完全理解也不用太著急,可以繼續(xù)學習后面的內(nèi)容,等使用了一段時間oracle系統(tǒng)之后,一些概念就變得容易理解了。1.1 oracle引入復(fù)雜的體系結(jié)構(gòu)的原因數(shù)據(jù)庫管理系統(tǒng)引入非常復(fù)雜的內(nèi)存和外存體系結(jié)構(gòu)的主要原因是有效地管理稀有的系統(tǒng)資源。資源不足不只是數(shù)據(jù)庫管理系統(tǒng)所面對的。其實,在我們五千年的人類發(fā)展歷史中,我們的祖先們一直在同資源不足作斗爭。歷史上糧食和土地等一直都是稀有資源,還記得我們的祖先們用什么方法來管理這些稀有資源的嗎?用戰(zhàn)爭,我們的先民們?yōu)榧Z食而戰(zhàn),為土地而戰(zhàn);我們當代人

2、類為石油而戰(zhàn),為市場而戰(zhàn),為金錢而戰(zhàn)。那么在oracle數(shù)據(jù)庫中什么是稀有資源?它們又是如何來管理的呢?如果讀者接觸過數(shù)據(jù)庫或讀過相關(guān)的書,應(yīng)該還有印象,數(shù)據(jù)庫的數(shù)據(jù)量和輸入/輸出量都是相當大的,而這些數(shù)據(jù)一般都存在硬盤(外存)上,因此硬盤為數(shù)據(jù)庫的一類資源。為了方便介紹, 圖1-1給出了硬盤的內(nèi)部結(jié)構(gòu)示意圖。圖 1-1從圖1-1可以看出,所有硬盤上數(shù)據(jù)的訪問都是靠硬盤的旋轉(zhuǎn)和磁頭的移動來完成的,這種旋轉(zhuǎn)和移動是機械運動。因為在計算機中所有數(shù)據(jù)的修改操作必須在內(nèi)存中進行,所以內(nèi)存也是數(shù)據(jù)庫的一類資源。表1-1給出內(nèi)存和外存的簡單比較以幫助讀者理解本書的內(nèi)容。表 1-1內(nèi) 存外存(硬盤)數(shù)據(jù)訪問

3、速度很快很慢存儲的數(shù)據(jù)臨時永久價錢很貴相當便宜從表1-1的比較可知,內(nèi)存的數(shù)據(jù)訪問速度要比外存(硬盤)快得多。這是因為內(nèi)存的數(shù)據(jù)訪問是電子速度,而硬盤的數(shù)據(jù)訪問主要取決于機械速度。也就是說,如果一個數(shù)據(jù)庫管理系統(tǒng)能夠使絕大多數(shù)(如90%以上)數(shù)據(jù)操作在內(nèi)存中完成,那么這一數(shù)據(jù)庫管理系統(tǒng)的效率將非常高。但是由于內(nèi)存中的數(shù)據(jù)在斷電或出現(xiàn)系統(tǒng)故障時會消失,所以數(shù)據(jù)庫管理系統(tǒng)還必須保證,所有的數(shù)據(jù)改動都必須及時寫到硬盤上,以保障不會丟失數(shù)據(jù);即使數(shù)據(jù)庫崩潰之后,所有提交過的數(shù)據(jù)都能得到完全恢復(fù)。盡管可以通過加大內(nèi)存來提高數(shù)據(jù)庫管理系統(tǒng)的效率,但在大多數(shù)情況下信息系統(tǒng)的開發(fā)和維護經(jīng)費都是有限的。通過以上

4、的討論,讀者應(yīng)該意識到,在數(shù)據(jù)庫管理系統(tǒng)中最寶貴的稀有資源是內(nèi)存。為了高效地使用內(nèi)存這種稀有資源,同時保證不會丟失任何數(shù)據(jù)庫中的數(shù)據(jù),oracle數(shù)據(jù)庫管理系統(tǒng)引入了一個非常復(fù)雜的體系結(jié)構(gòu)。1.2 oracle數(shù)據(jù)庫中常用的術(shù)語為了講解容易,在詳細討論oracle體系結(jié)構(gòu)之前,先介紹一下相關(guān)的名詞和術(shù)語。在這里只給出實用的解釋,并不追求學術(shù)上的嚴謹。l 進程(process):一段在內(nèi)存中正在運行的程序。如果沒有學過計算機操作系統(tǒng)相關(guān)課程,可以把進程想象成能夠自動完成某些特定任務(wù)的任何東西,如訓練有素的狗狗、跑龍?zhí)椎牡?。l 后臺進程(background process):進程的一種,在內(nèi)存中

5、運行時,不占顯示,而且它的優(yōu)先級比前臺進程低??梢灾挥幸粋€前臺進程,但可以有多個后臺進程。l 緩沖區(qū)(buffer):一段用來臨時存儲數(shù)據(jù)的內(nèi)存區(qū)。l 主機(host):計算機系統(tǒng)的另一個稱呼。l 服務(wù)器(server):一臺在網(wǎng)絡(luò)中向其他計算機系統(tǒng)提供一項或多項服務(wù)的主機。l 客戶機(client):一臺使用由服務(wù)器(server)提供服務(wù)的計算機系統(tǒng)。1.3 oracle數(shù)據(jù)庫管理系統(tǒng)的體系結(jié)構(gòu)為了能使oracle數(shù)據(jù)庫管理系統(tǒng)滿足商業(yè)用戶的要求,oracle引入了如圖1-2所示的復(fù)雜的體系結(jié)構(gòu)。圖 1-2以上這個復(fù)雜的體系結(jié)構(gòu)主要包括oracle服務(wù)器(server)(而服務(wù)器又是由or

6、acle實例(instance)和oracle數(shù)據(jù)庫(database)組成),還包括一些其他的關(guān)鍵文件、用戶進程和服務(wù)器進程等。oracle服務(wù)器(server)由oracle實例(instance)和oracle數(shù)據(jù)庫(database)兩大部分組成。它是一個數(shù)據(jù)庫管理系統(tǒng),提供了一致、開放和多樣的信息管理的方法和途徑。服務(wù)器中的一些結(jié)構(gòu)并不在處理sql語句時使用,它們是為了改進數(shù)據(jù)庫系統(tǒng)的效率或數(shù)據(jù)的恢復(fù)等而設(shè)計的。1.4 oracle服務(wù)器(server)oracle服務(wù)器(server)可以有以下3種安裝方式。(1)基于主機方式:在此種配置下,用戶直接在安裝了數(shù)據(jù)庫的計算機上登錄or

7、acle數(shù)據(jù)庫。(2)客戶端-服務(wù)器(client-server)(兩層模型)方式:數(shù)據(jù)庫和客戶終端分別安裝在不同的計算機上,用戶通過網(wǎng)絡(luò)從個人計算機(客戶端)上訪問數(shù)據(jù)庫。(3)客戶端-應(yīng)用服務(wù)器-服務(wù)器(client- application server-server)(三層模型):用戶首先從自己的個人計算機登錄應(yīng)用服務(wù)器,再通過應(yīng)用服務(wù)器訪問真正的數(shù)據(jù)庫。1.5 oracle實例(instance)oracle實例(instance)是一種訪問數(shù)據(jù)庫的機制,它是由內(nèi)存結(jié)構(gòu)和一些后臺進程組成的。它的內(nèi)存結(jié)構(gòu)也稱為系統(tǒng)全局區(qū)(system global area,sga)。系統(tǒng)全局區(qū)是實例

8、的最基本的部件之一。實例的后臺進程中有5個是必需的,即這5個后臺進程中的任何一個沒有啟動,實例將自動關(guān)閉。這5個后臺進程分別是smon、pmon、dbwr、lgwr和ckpt。在ocp考題中有時可能會問哪些后臺進程是可選的?除了這5個都是可選的。實例一啟動就分配系統(tǒng)全局區(qū)和啟動所需的后臺進程。這里應(yīng)該指出的是,每個實例只能操作一個數(shù)據(jù)庫,而且它不可以操作其他的數(shù)據(jù)庫。但是反過來是不成立的,因為一個數(shù)據(jù)庫可以同時被幾個實例操作(在oracle集群中)。系統(tǒng)全局區(qū)(sga)中包含了以下幾個內(nèi)存結(jié)構(gòu):共享池(shared pool)、數(shù)據(jù)庫高速緩沖區(qū)(database buffer cache)、重

9、做日志緩沖區(qū)(redo log buffer)和其他的一些結(jié)構(gòu)(如鎖和統(tǒng)計數(shù)據(jù))等。1.6 oracle數(shù)據(jù)庫oracle數(shù)據(jù)庫是數(shù)據(jù)的一個集合,oracle把這些數(shù)據(jù)作為一個完整的單位來處理。oracle數(shù)據(jù)庫也叫做物理(外存)結(jié)構(gòu),它為數(shù)據(jù)庫信息提供了真正的物理存儲,它是由以下3類操作系統(tǒng)文件組成的。(1)控制文件(control files):包含了維護和校驗數(shù)據(jù)庫一致性所需的信息。(2)重做日志文件(redo log files):包含了當系統(tǒng)崩潰后進行恢復(fù)所需記錄的變化信息。(3)數(shù)據(jù)文件(data files):包含了數(shù)據(jù)庫中真正的數(shù)據(jù)。1.7 oracle其他的關(guān)鍵文件除了以上3

10、類數(shù)據(jù)庫文件之外,oracle服務(wù)還需要其他的一些文件,這些文件不屬于數(shù)據(jù)庫。其中包括:l 初始化參數(shù)文件(parameter files):定義了實例的特性,如系統(tǒng)全局區(qū)中一些內(nèi)存結(jié)構(gòu)的大小、dbwr的個數(shù)。l 密碼文件(password files):包含了數(shù)據(jù)庫管理員或操作員用戶在啟動和關(guān)閉實例時所需的密碼。雖然oracle數(shù)據(jù)庫提供了相當完善的安全管理機制,但是在oracle數(shù)據(jù)庫沒有開啟時如何驗證要啟動數(shù)據(jù)庫的人是真正的數(shù)據(jù)庫管理員或操作員呢?這就是oracle引入密碼文件的原因。l 歸檔重做日志文件(archived redo log files):是重做日志文件的脫機備份。在系統(tǒng)

11、崩潰后進行恢復(fù)時可能需要這些文件。1.8 建立與oracle實例的連接oracle實例(instance)是用oracle的startup命令啟動的(該命令將在后面的章節(jié)中詳細介紹)。它的啟動就意味著sga的所有內(nèi)存結(jié)構(gòu)都已生成,所有必需的后臺進程都已在內(nèi)存中運行。那么此時用戶又是如何使用oracle數(shù)據(jù)庫呢?用戶在向oracle數(shù)據(jù)庫發(fā)出sql命令之前必須與實例(instance)建立連接。用戶啟動一個工具如sql*plus,或運行一個利用oracle工具開發(fā)的應(yīng)用程序,如用oracle forms開發(fā)的應(yīng)用程序時,這個工具或應(yīng)用程序就被作為一個用戶進程來執(zhí)行。用戶進程是不能直接訪問數(shù)據(jù)庫的

12、。在專用連接的情況下(也是默認),當一個用戶登錄oracle服務(wù)器時(如在sql*plus的提示下輸入用戶名和密碼),如果登錄成功(即用戶名和密碼都準確無誤),oracle就在服務(wù)器所運行的計算機上創(chuàng)建一個服務(wù)器進程。在這種連接下,該服務(wù)器進程只能為這個用戶進程提供服務(wù)。用戶進程與服務(wù)器進程是一對一的關(guān)系。用戶進程向服務(wù)器進程發(fā)請求,服務(wù)器進程對數(shù)據(jù)庫進行實際的操作并把所得的結(jié)果返回給用戶進程。就好像一個大富豪想炒股票,但又不懂股票市場的運作,于是他請了一位股票經(jīng)紀人。這位富豪就相當于用戶進程,而股票經(jīng)紀人就相當于服務(wù)器進程,股票市場就相當于oracle數(shù)據(jù)庫。一個用戶每次登錄oracle服務(wù)

13、器,如果成功,該用戶就與oracle服務(wù)器建立了連接,而這種連接又叫做會話。一個會話始于用戶成功地登錄oracle服務(wù)器,終止于用戶退出或非正常終止連接。一個數(shù)據(jù)庫用戶可能同時有多個會話存在,即用相同的用戶名和密碼同時登錄多次。1.9 各種不同的連接方式連接是用戶進程與oracle服務(wù)器之間的通信路徑。與oracle服務(wù)器(server)的3種安裝方式相對應(yīng),一個數(shù)據(jù)庫用戶可能用以下3種方式之一與oracle服務(wù)器連接。(1)基于主機方式:此時的用戶進程與服務(wù)器進程是在同一臺計算機的相同的操作系統(tǒng)上的,用戶進程與oracle服務(wù)器之間的通信路徑是通過操作系統(tǒng)內(nèi)部進程通信(inter proce

14、ss communication,ipc)機制來建立的。(2)客戶端-服務(wù)器(client-server)(兩層模型)方式:用戶進程與oracle服務(wù)器之間的通信是通過網(wǎng)絡(luò)協(xié)議(如tcp/ip)來完成的。(3)客戶端-應(yīng)用服務(wù)器-服務(wù)器(client- application server- server)(三層模型):用戶的個人計算機通過網(wǎng)絡(luò)與應(yīng)用服務(wù)器或網(wǎng)絡(luò)服務(wù)器通信,而這個應(yīng)用服務(wù)器或網(wǎng)絡(luò)服務(wù)器又是通過網(wǎng)絡(luò)與運行數(shù)據(jù)庫的計算機相連的。例如,用戶使用瀏覽器通過網(wǎng)絡(luò)運行nt服務(wù)器上的應(yīng)用程序,而nt服務(wù)器又從運行在unix主機上的oracle數(shù)據(jù)庫中提取數(shù)據(jù)。以上所介紹的連接是用戶進程與服務(wù)

15、器進程的一對一的連接,也稱為專用服務(wù)器連接(dedicated server connection)。除了這種連接外,在聯(lián)機事務(wù)處理(online transaction processing,oltp)系統(tǒng)的配置時還有另外的一種連接,它在oracle9i之前的版本中稱為多線程(mts)連接,在oracle 9i或以后的版本中稱為共享服務(wù)器(shared server)連接。有關(guān)這種連接在oracle的網(wǎng)絡(luò)和調(diào)優(yōu)的書籍中介紹。1.10 服務(wù)器進程當oracle創(chuàng)建一個服務(wù)器進程的同時要為該服務(wù)器進程分配一個內(nèi)存區(qū),這個內(nèi)存區(qū)稱為程序全局區(qū)(program global area,pga)。與s

16、ga不同,pga是一個私有的內(nèi)存區(qū),是不能共享的,是只屬于一個進程的。它隨著進程的創(chuàng)建而被分配,隨著進程的終止而被回收。在專用服務(wù)器進程的配置情況下,程序全局區(qū)包括了以下結(jié)構(gòu):(1)排序區(qū)(sort area):用于處理sql語句所需的排序。(2)游標狀態(tài)區(qū)(cursor state):用于指示會話當前所使用的sql語句的處理狀態(tài)。(3)會話信息區(qū)(session information):包括了會話的用戶權(quán)限和優(yōu)化統(tǒng)計信息。(4)堆棧區(qū)(stack space):包括了其他的會話變量。如果是共享服務(wù)器進程或多線程的配置,以上這些結(jié)構(gòu)除了堆棧區(qū)外大部分將存在sga中。如果有l(wèi)arge pool

17、,它們就會被存在large pool,否則它們就會被存在共享池中。1.11 oracle執(zhí)行sql查詢語句的步驟如果用戶在sql*plus下輸入了如下的查詢語句:select * from dept;,那么oracle又是如何來處理這個語句的呢?sql語句的執(zhí)行主要由用戶進程與服務(wù)器進程來完成,其他的一些進程可能要輔助完成這一過程。查詢語句與其他的sql語句有所不同,如果一個查詢語句執(zhí)行成功,它要返回查詢的結(jié)果。而其他的sql語句只是返回執(zhí)行成功或失敗的信息。查詢語句的處理主要包括以下3個階段:編譯(parse)、執(zhí)行(execute)和提取數(shù)據(jù)(fetch)。l 編譯(parse):在進行編

18、譯時,服務(wù)器進程會將sql語句的正文放入共享池(shared pool)的庫高速緩存(library cache)中并將完成以下處理: 首先在共享池中搜索是否有相同的sql語句(正文),如果沒有就進行后續(xù)的處理。 檢查該sql語句的語法是否正確。 通過查看數(shù)據(jù)字典來檢查表和列的定義。 對所操作的對象加編譯鎖(parse locks)以便在編譯語句期間這些對象的定義不能被改變。 檢查所引用對象的用戶權(quán)限。 生成執(zhí)行該sql語句所需的優(yōu)化的執(zhí)行計劃(執(zhí)行步驟)。 將sql語句和執(zhí)行計劃裝入共享的sql區(qū)。以上的每一步操作都是在處理正確時才進行后續(xù)的處理。如果不正確,就返回錯誤。l 執(zhí)行(execu

19、te):oracle服務(wù)器進程開始執(zhí)行sql語句是因為它已獲得了執(zhí)行sql語句所需的全部資源和信息。l 提取數(shù)據(jù)(fetch):oracle服務(wù)器進程選擇所需的數(shù)據(jù)行,并在需要時將其排序,最后將結(jié)果返回給用戶(進程)。1.12 共享池(shared pool)sga中的共享池(shared pool)是由庫高速緩存(library cache)和數(shù)據(jù)字典高速緩存(data dictionary cache)兩部分所組成。服務(wù)器進程將sql(也可能是pl/sql)語句的正文和編譯后的代碼(parsed code)以及執(zhí)行計劃都放在共享池(shared pool)的庫高速緩存中。在進行編譯時,服務(wù)

20、器進程首先會在共享池中搜索是否有相同的sql或pl/sql語句(正文),如果有就不進行任何后續(xù)的編譯處理,而是直接使用已存在的編譯后的代碼和執(zhí)行計劃。u提示:庫高速緩存包含了共享sql區(qū)和共享pl/sql區(qū)兩部分,它們分別存放sql和pl/sql語句以及相關(guān)的信息。要想共享sql或pl/sql語句,第一,庫高速緩存(library cache)要足夠大,因為只有這樣要共享的sql或pl/sql語句才不會很快地淘汰出內(nèi)存。第二,sql或pl/sql語句要是能共享的通用代碼(generic code),因為oracle是通過比較sql或pl/sql語句的正文來決定兩個語句是否相同的,只有當兩個語句

21、的正文完全相同時oracle才重用已存在的編譯后的代碼和執(zhí)行計劃。這里通過以下的實例來進一步解釋這一點。讀者猜如下的兩個sql語句是否相同?select * from emp where sal = 1500; 和select * from emp where sal = 1501;答案是不相同的(在oracle默認的配置下,oracle 8i和oracle 9i以及更高的版本可以通過重新設(shè)置cursor_sharing參數(shù)來修改默認配置,有興趣的讀者可參閱oracle調(diào)優(yōu)方面的書籍)。可以通過使用綁定變量的方式來重寫以上的sql語句,如下:select * from emp where sa

22、l = &v_sal;這個語句就是可以共享的通用代碼,因為變量不是在編譯階段而是在運行階段賦值的。引入庫高速緩存(library cache)的目的是共享sql或pl/sql代碼。那么oracle又是怎樣有效地管理庫高速緩存(library cache)的呢?oracle是使用一個稱為lru(least recently used)的隊列(list)或算法(algorithm)來實現(xiàn)對庫高速緩存的管理的。lru隊列的算法大致如下:剛使用的內(nèi)存塊(的地址)放在lru隊列的頭上(最前面),當一個服務(wù)器進程需要庫高速緩存的內(nèi)存空間而又沒有空閑的內(nèi)存空間時,該進程就從lru隊列的尾部(最后面)獲得所需

23、的內(nèi)存塊,這些內(nèi)存塊一旦被使用,它們(的地址)就立即放在lru隊列的最前面。這樣那些長時間沒使用過的內(nèi)存塊將自然地移到lru隊列的尾部而被最先使用。從以上的討論可知,為了能夠共享sql或pl/sql的代碼,庫高速緩存要足夠大,因為這樣那些可以共享的sql或pl/sql代碼才不會被很快地淘汰出內(nèi)存。不過oracle并沒有給出直接設(shè)置庫高速緩存大小的方法,只能通過設(shè)置共享池的大小來間接地設(shè)置庫高速緩存的大小。介紹完了庫高速緩存,接下來將介紹數(shù)據(jù)字典高速緩存(data dictionary cache)。當oracle在執(zhí)行sql語句時,服務(wù)器進程將把數(shù)據(jù)文件、表、索引、列、用戶和其他的數(shù)據(jù)對象的定

24、義和權(quán)限的信息放入數(shù)據(jù)字典高速緩存。如果在這之后,有進程(用戶)需要同樣的信息,如表和列的定義,那么所有的這些信息將從數(shù)據(jù)字典高速緩存中獲得。因為以上所說的這些信息都是存在oracle數(shù)據(jù)庫的數(shù)據(jù)字典中,這也可能就是該部分內(nèi)存叫做數(shù)據(jù)字典高速緩存的原因。表和列的定義等重用的機會要比sql語句大,因此為了能達到共享這些信息的目的,數(shù)據(jù)字典高速緩存應(yīng)該盡可能設(shè)置得大一些。不過與庫高速緩存一樣,oracle并沒有給出直接設(shè)置數(shù)據(jù)字典高速緩存大小的方法,只能通過設(shè)置共享池的大小來間接地設(shè)置數(shù)據(jù)字典高速緩存的大小。在oracle9i之前的版本,可以通過修改參數(shù)文件中的shared_pool_ size的

25、值來改變共享池的大小,但一定要重新啟動oracle數(shù)據(jù)庫。在oracle 9i或以后的版本中,也可以使用類似于例1-1的命令來改變共享池的大?。豪?-1sql alter system set shared_pool_size = 32m;系統(tǒng)已更改。但是所改變共享池的大小受限于sga_max_size參數(shù)。這個參數(shù)將在以后的章節(jié)中詳細地介紹。n 注意:在本書中采用如下的約定:l sql為sql*plus的提示符。l 沒有陰影的內(nèi)容為要輸入的sql語句或sql*plus命令等。如在例1-1中要輸入alter system set shared_pool_size = 32m;。l 陰影中的內(nèi)容

26、為系統(tǒng)顯示(輸出)的結(jié)果。如在例1-1中的“系統(tǒng)已更改?!?。u提示:即使把共享池設(shè)置得足夠大并且所使用的sql或pl/sql語句也是能共享的代碼,oracle也并不能一定使用內(nèi)存(共享池)中的代碼。例如當有用戶修改了某個對象的定義之后,所有使用這個對象的內(nèi)存(共享池)中的代碼全部被oracle設(shè)置為無效,因此在使用時必須重新編譯。1.13 數(shù)據(jù)庫高速緩沖區(qū)(database buffer cache)如果用戶發(fā)出了以下的sql語句:select * from emp,oracle又是怎樣提取數(shù)據(jù)庫中的數(shù)據(jù)呢?服務(wù)器進程將首先在數(shù)據(jù)庫高速緩沖區(qū)(database buffer cache)中搜尋

27、所需的數(shù)據(jù),如果找到了就直接使用而不進行磁盤操作,如果沒找到就將進行磁盤操作把數(shù)據(jù)文件中的數(shù)據(jù)讀入到數(shù)據(jù)庫高速緩沖區(qū)中。從以上的討論可知,為了能夠共享數(shù)據(jù)庫中的數(shù)據(jù),數(shù)據(jù)庫高速緩沖區(qū)要足夠的大,因為這樣那些可以共享的數(shù)據(jù)才不會被很快地淘汰出內(nèi)存。oracle也是使用一個叫做lru(least recently used)的隊列(list)或算法(algorithm)來實現(xiàn)對數(shù)據(jù)庫高速緩沖區(qū)的管理??梢允褂脜?shù)文件中的db_block_size和db_block_buffers兩個參數(shù)來設(shè)置數(shù)據(jù)庫高速緩沖區(qū)的大小。其中db_block_size為oracle數(shù)據(jù)塊(內(nèi)存緩沖區(qū))的大小,在orac

28、le數(shù)據(jù)庫中內(nèi)存和外存的數(shù)據(jù)塊的大小是相同的。db_block_buffers為內(nèi)存緩沖區(qū)的個數(shù)。數(shù)據(jù)庫高速緩沖區(qū)大小為這兩個參數(shù)的乘積。但是db_block_size的值是在創(chuàng)建數(shù)據(jù)庫時設(shè)定的,如果要改變該參數(shù)的值一般需要重建數(shù)據(jù)庫。因此多數(shù)情況下只能通過改變db_block_buffers的值來調(diào)整數(shù)據(jù)庫高速緩沖區(qū)大小。但一定得重新啟動oracle數(shù)據(jù)庫。在oracle 9i或以后的版本中,oracle引入了另一個參數(shù)db_cache_size,這個參數(shù)是一個動態(tài)參數(shù),即可以在數(shù)據(jù)庫運行時動態(tài)地改變該參數(shù)??梢允褂妙愃朴?例1-2的命令來改變數(shù)據(jù)庫高速緩沖區(qū)的大?。豪?-2sql alte

29、r system set db_cache_size = 48m;系統(tǒng)已更改。1.14 內(nèi)存緩沖區(qū)顧問(v$db_cache_advice)oracle 9i或以后的版本還提供了一個稱為內(nèi)存緩沖區(qū)顧問(v$db_cache_advice)的工具來幫助獲得調(diào)整數(shù)據(jù)庫高速緩沖區(qū)的統(tǒng)計信息。內(nèi)存緩沖區(qū)顧問一共有3種狀態(tài):(1)on:該工具打開,為該工具分配內(nèi)存并進行統(tǒng)計信息的收集。要有一定的內(nèi)存和cpu開銷。(2)ready:該工具關(guān)閉,為該工具分配內(nèi)存但不進行統(tǒng)計信息的收集,因此沒有cpu的開銷。(3)off:該工具關(guān)閉,不為該工具分配內(nèi)存也不進行統(tǒng)計信息的收集,因此既沒有內(nèi)存的開銷也沒有cpu開

30、銷。可以通過修改初始化參數(shù)db_cache_advice的值來改變該工具的狀態(tài)。這一參數(shù)是一個動態(tài)參數(shù),因此可以使用alter system命令來修改。例如可以利用類似于例1-3的sql語句來查看它的狀態(tài):例1-3sql select id, name, block_size, advice_status 2 from v$db_cache_advice; id name block_size adv - - - - 3 default 4096 on 3 default 4096 on 3 default 4096 on 3 default 4096 on 3 default 4096 on

31、 已選擇20行。 此時,例1-3的顯示結(jié)果表明了內(nèi)存緩沖區(qū)顧問是在開啟狀態(tài)。u提示:顯示結(jié)果中的表示省略了一些行的顯示。之后可以使用類似于例1-4的命令將內(nèi)存緩沖區(qū)顧問(v$db_cache_advice)工具關(guān)閉:例1-4sql alter system set db_cache_advice = off;系統(tǒng)已更改。這時可以再使用類似于例1-5的sql語句來查看它的狀態(tài):例1-5sql select id, name, block_size, advice_status 2 from v$db_cache_advice; id name block_size adv- - - - 3 de

32、fault 4096 off 3 default 4096 off 3 default 4096 off 3 default 4096 off 3 default 4096 off 已選擇20行。 此時,例1-5的顯示結(jié)果表明已成功地關(guān)閉了內(nèi)存緩沖區(qū)顧問(詳細地介紹該工具的使用已超出了本書的范圍,有興趣的讀者可參閱oracle 9i/10g調(diào)優(yōu)方面的書籍)。1.15 重做日志緩沖區(qū)(redo log buffer)從理論上來講,如果數(shù)據(jù)庫不會崩潰,根本沒有必要引入重做日志緩沖區(qū)(redo log buffer)。引入重做日志緩沖區(qū)的主要目的(在oracle 8i之前的版本中也是惟一的目的)就是

33、數(shù)據(jù)的恢復(fù)。oracle在使用任何dml或ddl操作改變數(shù)據(jù)之前都將恢復(fù)所需的信息,即在寫數(shù)據(jù)庫高速緩沖區(qū)之前,先寫入重做日志緩沖區(qū)。與執(zhí)行查詢語句有所不同,oracle在執(zhí)行dml語句時只有編譯(parse)和執(zhí)行(execute)兩個階段。以下是oracle執(zhí)行update語句的步驟:(1)如果數(shù)據(jù)和回滾數(shù)據(jù)不在數(shù)據(jù)庫高速緩沖區(qū)中,oracle服務(wù)器進程將把它們從數(shù)據(jù)文件中讀到數(shù)據(jù)庫高速緩沖區(qū)中。(2)oracle服務(wù)器進程在要修改的數(shù)據(jù)行上加鎖(行一級的鎖)。(3)oracle服務(wù)器進程將數(shù)據(jù)的變化信息和回滾所需的信息都記錄在重做日志緩沖 區(qū)中。(4)oracle服務(wù)器進程將回滾所需的原

34、始值和對數(shù)據(jù)所做的修改都寫入數(shù)據(jù)庫高速 緩沖區(qū)(database buffer cache)。之后在數(shù)據(jù)庫高速緩沖區(qū)中所有的這些數(shù)據(jù)塊都將被標為臟緩沖區(qū),因為此時內(nèi)外存的數(shù)據(jù)是不同的(不一致的)。oracle處理insert或delete語句的步驟與處理update語句的步驟大體相同。n 注意:有關(guān)回滾數(shù)據(jù)在本書的后面章節(jié)中還要介紹,讀者也可以參閱筆者的另一本書從實踐中學習oracle/sql一書12.20節(jié)的258259頁。1.16 大池(large pool)和java池(java pool)除了以上所介紹的內(nèi)存結(jié)構(gòu)之外,sga中還有可能包含large pool和java pool兩個可選

35、的內(nèi)存結(jié)構(gòu)。引入large pool的主要目的應(yīng)該是提高效率。large pool是一個相對比較簡單的內(nèi)存結(jié)構(gòu),與shared pool不同的是它沒有l(wèi)ru隊列。在多線程(mts)或共享服務(wù)器(shared server)連接時,oracle服務(wù)器進程的pga的大部分區(qū)域(也叫uga)將放入large pool(stack space 除外)。另外在大規(guī)模i/o及備份和恢復(fù)操作時可能使用該區(qū)。可以通過設(shè)置參數(shù)large_pool_size的值來配置large pool的大小。該參數(shù)也是一個動態(tài)參數(shù)。引入java pool的目的是能夠編譯java語言的命令。如果要使用java語言就必須設(shè)置jav

36、a pool。java語言在oracle數(shù)據(jù)庫中的存儲與pl/sql語言幾乎完全相同。可以通過設(shè)置參數(shù)java_pool_size的值來配置java pool的大小。其數(shù)字的單位是字節(jié)(bytes)。在oracle 9i中java pool的默認大小為24mb。1.17 內(nèi)存緩沖區(qū)大小的設(shè)定在oracle 9i之前的版本中,只能通過設(shè)置初始化參數(shù)文件中的一些參數(shù)來間接地設(shè)置sga的大小,如db_block_buffers、log_buffer、shared_pool_size等。而且所有的這些參數(shù)都是靜態(tài)的,即當修改完初始化參數(shù)文件中這些參數(shù)的值之后必須重新啟動oracle數(shù)據(jù)庫。在oracl

37、e9i以后的版本中,sga為動態(tài)的。sga中的內(nèi)存緩沖區(qū),如數(shù)據(jù)庫高速緩沖區(qū)(database buffer cache)和共享池(shared pool)等都可以動態(tài)地增加和減少。oracle是利用所謂的區(qū)組(granule)來管理sga的內(nèi)存的。區(qū)組(granule)就是一片連續(xù)的虛擬內(nèi)存區(qū)。區(qū)組是oracle分配和回收內(nèi)存區(qū)的基本單位。區(qū)組的大小取決于所估計的sga的大小。如果sga的尺寸小于128mb,區(qū)組的大小就是4mb。如果sga的尺寸大于或等于128mb,區(qū)組的大小就為16mb。oracle數(shù)據(jù)庫一旦啟動,sga中的每個內(nèi)存緩沖區(qū)就會獲得所需的區(qū)組。sga中至少包括3個區(qū)組:一個

38、是sga固定區(qū)(其中包含了重做日志緩沖區(qū));一個是數(shù)據(jù)庫高速緩沖區(qū);一個是共享池。oracle數(shù)據(jù)庫管理員可通過alter system set命令來分配和回收區(qū)組。但總的內(nèi)存大小不能超過參數(shù)sga_max_size所設(shè)定的值。該參數(shù)的單位是字節(jié)。動態(tài)分配和回收內(nèi)存的最大好處是在調(diào)整內(nèi)存緩沖區(qū)大小時不需要重新啟動數(shù)據(jù)庫。這一點對那些24小時運營7天營業(yè)的商業(yè)數(shù)據(jù)庫是至關(guān)重要的。1.18 內(nèi)存緩沖區(qū)信息的獲取可以使用例1-6的命令來獲得參數(shù)sga_max_size的值:例1-6sql show parameter該命令將顯示出參數(shù)文件中可以設(shè)置的全部參數(shù)。另外也可以使用例1-7的命令來獲得sga

39、的相關(guān)信息:例1-7sql show sgatotal system global area 122755896bytesfixed size 453432 bytesvariable size 71303168 bytesdatabase buffers 50331648 bytesredo buffers 667648 bytes也可以先使用例1-8和例1-9的sql*plus命令來格式化顯示輸出:例1-8sql col name for a20例1-9sql col value for a25之后,利用數(shù)據(jù)字典v$parameter使用例1-10的sql查詢語句來獲得參數(shù)sga_max_

40、size的值:例1-10sql select name, type, value 2from v$parameter 3where name = sga_max_size;name type value - - -sga_max_size 6 122755896 介紹完了sga的各個部分內(nèi)存緩沖區(qū)之后,下面開始詳細地討論oracle的主要后臺進程。1.19 重做日志寫進程(lgwr)及快速提交(fast commit)重做日志寫進程(log writer,lgwr)負責將重做日志緩沖區(qū)的記錄順序地寫到重做日志文件中。為了更好地理解log writer的操作原理,在這里先介紹一下oracle提交

41、(commit)語句是如何工作的。oracle服務(wù)器是使用了一種稱為快速提交(fast commit)的技術(shù),該技術(shù)既能保證oracle系統(tǒng)的效率又能保證在系統(tǒng)崩潰的情況下所有提交的數(shù)據(jù)可以得到恢復(fù)。為此oracle系統(tǒng)引入了系統(tǒng)變化數(shù)(system change number,scn)。無論任何時候只要某個事務(wù)(transaction)被提交,oracle服務(wù)器都將產(chǎn)生一個scn(號碼)并將其賦予該事務(wù)的所有數(shù)據(jù)行。在同一個數(shù)據(jù)庫中scn是單調(diào)遞增的并且是惟一的。為了避免在進行一致性檢驗時操作系統(tǒng)時鐘可能引發(fā)的問題,oracle服務(wù)器將scn作為oracle的內(nèi)部時間戳來保證數(shù)據(jù)文件中的數(shù)據(jù)

42、的同步和數(shù)據(jù)的讀一致性。當在sql*plus中發(fā)了commit語句之后,oracle的內(nèi)部操作步驟如下:(1)服務(wù)器進程將把提交的記錄連同所產(chǎn)生的scn(號碼)一起寫入重做日志緩沖區(qū)中。(2)重做日志寫進程(lgwr)將把重做日志緩沖區(qū)中一直到所提交的記錄(包括該記錄)的所有記錄連續(xù)地寫到重做日志文件中。在此之后,oracle服務(wù)器就可以保證即使在系統(tǒng)崩潰的情況下所有提交的數(shù)據(jù)也可以得到恢復(fù)。(3)oracle通知用戶(進程)提交已經(jīng)完成。(4)服務(wù)器進程將修改數(shù)據(jù)庫高速緩沖區(qū)中的相關(guān)數(shù)據(jù)的狀態(tài)并釋放資源和打開 鎖等。此時可能這些數(shù)據(jù)并未被寫到數(shù)據(jù)文件中,這時這些數(shù)據(jù)緩沖區(qū)被標為臟緩沖區(qū),因為

43、相同的數(shù)據(jù)在內(nèi)外存中為不同的版本。數(shù)據(jù)庫高速緩沖區(qū)中的數(shù)據(jù)是由dbwr寫到數(shù)據(jù)文件中的。曾有不少學生問過這樣一個問題:“為什么不同時寫兩個數(shù)據(jù)文件呢?”oracle的這種解決方案的最大好處是在保證不丟失數(shù)據(jù)的同時數(shù)據(jù)庫的效率不會受到很大影響。因為重做日志文件中的記錄是以最緊湊的格式存放的,所以它的i/o量要比對數(shù)據(jù)文件的操作少得多。另外lgwr是順序地將重做日志緩沖區(qū)中的記錄寫到重做日志文件中的,這樣其i/o速度要比將數(shù)據(jù)塊寫到數(shù)據(jù)文件中快得多。重做日志寫進程(lgwr)要在下列情況下將重做日志緩沖區(qū)的記錄(內(nèi)存)順序地寫到重做日志文件(外存)中:l 當某個事務(wù)被提交時。l 當重做日志緩沖區(qū)中

44、變化的記錄超過一兆字節(jié)(1mb)時。l 當重做日志緩沖區(qū)中所存的記錄已超過緩沖區(qū)容量的1/3。l 在dbwr將數(shù)據(jù)庫高速緩沖區(qū)中修改過的數(shù)據(jù)塊寫到數(shù)據(jù)文件之前。l 每3秒鐘。因為在進行數(shù)據(jù)庫恢復(fù)時需要重做日志數(shù)據(jù),所以重做日志寫進程(lgwr)只有在重做日志數(shù)據(jù)寫到重做日志文件(磁盤)上時才能確定提交已經(jīng)完成。在oracle 8i之前的版本中,重做日志數(shù)據(jù)的惟一目的和用處就是數(shù)據(jù)庫恢復(fù)。oracle在oracle 8i的版本中引入了一個叫做重做日志挖掘器(logminer)的工具。該工具可以將重做日志文件或歸檔重做日志文件中的數(shù)據(jù)轉(zhuǎn)換成用戶能理解的正文信息。在oracle 8i中,該工具只有命

45、令行操作方式。oracle 9i加強了此工具的功能并引入了一個稱為日志挖掘瀏覽器(logminer viewer)的圖形界面。1.20 數(shù)據(jù)庫寫進程(dbwr/dbwn)在本章開始時曾介紹過數(shù)據(jù)庫的典型操作就是大規(guī)模的輸入/輸出(i/o)。因此為了提高oracle系統(tǒng)的效率,一要減少i/o量,這可能是oracle引入lgwr的原因之一;二要減少i/o次數(shù),這可能是oracle引入數(shù)據(jù)庫寫進程(dbwr/dbwn)的主要原因。u提示:在oracle的英文書中有些將“數(shù)據(jù)庫寫進程”用dbwr表示,有些將它用dbwn表示。這是因為在一個oracle實例中可以啟動多個數(shù)據(jù)庫寫進程,特別是在要進行大規(guī)模

46、輸入/輸出并且運行在多cpu計算機上的oracle數(shù)據(jù)庫系統(tǒng)。oracle允許在一個實例上最多啟動10個數(shù)據(jù)庫寫進程,它們分別是dbw0dbw9。數(shù)據(jù)庫寫進程負責將數(shù)據(jù)庫高速緩沖區(qū)中的臟緩沖區(qū)中的數(shù)據(jù)寫到數(shù)據(jù)文件上。為了提高效率,數(shù)據(jù)庫寫進程并不是數(shù)據(jù)庫高速緩沖區(qū)中的數(shù)據(jù)一有變化就寫數(shù)據(jù)文件,而是積累了足夠多的數(shù)據(jù)一次寫一大批內(nèi)存數(shù)據(jù)塊到數(shù)據(jù)文件上。數(shù)據(jù)庫寫進程將在下列事件之一發(fā)生時把數(shù)據(jù)庫高速緩沖區(qū)中的數(shù)據(jù)寫到數(shù)據(jù)文 件上:l 當臟緩沖區(qū)的數(shù)量超過了所設(shè)定的限額。l 當所設(shè)定的時間間隔已到。l 當有進程需要數(shù)據(jù)庫高速緩沖區(qū)而卻找不到空閑的緩沖區(qū)時。l 當校驗點發(fā)生時。l 當某個表被刪除(dr

47、op)或被截斷(truncate)時。l 當某個表空間被設(shè)置為只讀狀態(tài)(read only)時。l 當使用類似于alter tablespace users begin backup的命令對某個表空間進行聯(lián)機備份時。l 當某個臨時表空間被設(shè)置為只脫機狀態(tài)(offline)或正常狀態(tài)(normal)時等。1.21 系統(tǒng)監(jiān)督進程(smon)從前面的論述中可以知道,由于某種原因oracle系統(tǒng)崩潰了(如斷電),sga中任何沒有來得及寫到磁盤中的信息都將丟失,如有些已經(jīng)提交的數(shù)據(jù)還沒有真正地被寫到數(shù)據(jù)文件中時就會丟失。在這種情況下,當數(shù)據(jù)庫重新開啟時,系統(tǒng)監(jiān)督進程(smon)將自動地執(zhí)行oracle實

48、例的恢復(fù)工作。其步驟如下:(1)執(zhí)行前滾(roll forward),即將已經(jīng)寫到重做日志文件中但還沒寫到數(shù)據(jù)文件中的提交數(shù)據(jù)寫到數(shù)據(jù)文件中(oracle是用scn號碼來識別提交記錄的)。(2)在前滾完成后立即打開數(shù)據(jù)庫,此時用戶就可以登錄并使用數(shù)據(jù)庫了。這時在數(shù)據(jù)文件中可能還有一些沒有提交的數(shù)據(jù)。之所以這樣安排主要是為了提高系統(tǒng)的效率。(3)回滾沒有提交的事務(wù)(數(shù)據(jù))。除了smon進程之外,服務(wù)器(server)進程也可能進行回滾沒有提交的事務(wù),但該進程只回滾它所用到的加鎖的數(shù)據(jù)行。除此之外,smon進程還要執(zhí)行如下的磁盤空間的維護工作:l 回收或組合數(shù)據(jù)文件中相連的空閑區(qū)。l 釋放臨時段(

49、在執(zhí)行sql語句時用作排序的磁盤區(qū)),將它們還給數(shù)據(jù)文件以作為空閑區(qū)使用。1.22 進程監(jiān)督進程(pmon)當某個進程崩潰時(如在沒有正常退出oracle的情況下重新啟動了所用的pc),進程監(jiān)督進程(pmon)將負責它的清理工作。pmon進程將負責進行如下的清理工作:l 回滾用戶當前的事務(wù)。l 釋放用戶所加的所有表一級和行一級的鎖。l 釋放用戶所有的其他資源等。1.23 校驗點(checkpoint)和校驗點進程oracle系統(tǒng)為了提高系統(tǒng)的效率和數(shù)據(jù)庫的一致性,引入了一個稱為校驗點的事件。該事件是在當dbwr進程把在sga中所有已經(jīng)改變了的數(shù)據(jù)庫高速緩沖區(qū)中的數(shù)據(jù)(包括提交的和沒提交的數(shù)據(jù))

50、寫到數(shù)據(jù)文件上時產(chǎn)生。從理論上講校驗點(checkpoint)和校驗點進程可以完全不需要,因為oracle系統(tǒng)利用重做日志數(shù)據(jù)和scn號是能夠保證數(shù)據(jù)庫的完全恢復(fù)的。引入校驗點可能是為了提高系統(tǒng)的效率。因為所有到校驗點為止的變化了的數(shù)據(jù)都已寫到了數(shù)據(jù)文件中,在實例恢復(fù)時校驗點之前的重做日志記錄已經(jīng)不再需要,這樣實例恢復(fù)速度就加快了。在校驗點事件發(fā)生時,oracle要將校驗點號碼(oracle系統(tǒng)自動產(chǎn)生的)寫入所有相關(guān)的數(shù)據(jù)文件的文件頭中。還要將校驗點號碼、重做日志序列號、歸檔日志名字和scn號都寫入控制文件中。盡管經(jīng)常產(chǎn)生校驗點可以加快實例恢復(fù)的速度,但是由于在產(chǎn)生校驗點時oracle系統(tǒng)要

51、進行大量的i/o操作,所以過于頻繁地產(chǎn)生校驗點會使數(shù)據(jù)庫正常的聯(lián)機操作受到?jīng)_擊。最后數(shù)據(jù)庫管理員要在實例恢復(fù)的速度和聯(lián)機操作之間進行折衷。一般的生產(chǎn)或商業(yè)數(shù)據(jù)庫的校驗點間隔是在半小時以上。1.24 歸檔日志(arch/arcn)進程以上5個后臺進程都是必需的,即它們中的任何一個停止后實例自動關(guān)閉。在可選后臺進程中,歸檔日志(arch/arcn)進程可能是最重要的一個可選后臺進程,因為如果oracle數(shù)據(jù)庫的數(shù)據(jù)文件丟失或損壞,一般數(shù)據(jù)庫要進行完全恢復(fù),oracle數(shù)據(jù)庫應(yīng)運行在歸檔方式。在oracle數(shù)據(jù)庫中,重做日志文件被劃分為若干個組。當一組重做日志的文件被寫滿后,oracle就開始寫下一

52、組重做日志,這被稱為日志切換。切換是以循環(huán)的方式進行的,即當最后一組寫滿后,又開始寫第一組。因此如果只有重做日志文件,即oracle數(shù)據(jù)庫運行在非歸檔方式下,當遇到數(shù)據(jù)文件丟失或損壞時,oracle系統(tǒng)很難保證完全恢復(fù)數(shù)據(jù)庫中的數(shù)據(jù)。因為此時所需的重做記錄可能因重做日志循環(huán)使用而被覆蓋掉了。在歸檔方式下,arcn進程將把切換后的重做日志文件復(fù)制到歸檔日志文件。可以把歸檔日志文件看成是重做日志文件的備份,但歸檔日志文件是脫機的,即除了在進行(復(fù)制)時,oracle數(shù)據(jù)庫在正常運行時是不會關(guān)注歸檔日志文件的。oracle系統(tǒng)確保在一組重做日志的歸檔操作完成之前不會重新使用該組重做日志。在oracl

53、e數(shù)據(jù)庫中歸檔操作一般是自動執(zhí)行的。利用這些歸檔日志文件,oracle系統(tǒng)就能確保在遇到數(shù)據(jù)文件丟失或損壞后可以完全恢復(fù)數(shù)據(jù)庫中的數(shù)據(jù)。1.25 小 結(jié)在本章即將結(jié)束時請讀者考慮一個問題。在數(shù)據(jù)庫(數(shù)據(jù)文件)中所存的數(shù)據(jù)是一致的還是不一致的?也可以說成是數(shù)據(jù)庫(數(shù)據(jù)文件)中所存的數(shù)據(jù)是提交的還是沒提交的?要回答這個問題首先要知道數(shù)據(jù)庫當前的狀態(tài)。如果數(shù)據(jù)庫是處在正常關(guān)閉狀態(tài),數(shù)據(jù)庫所存的數(shù)據(jù)當然是一致的。如果數(shù)據(jù)庫是非正常關(guān)閉狀態(tài),數(shù)據(jù)庫中應(yīng)該有不一致的數(shù)據(jù)。如果數(shù)據(jù)庫是處在正常運行(開啟)狀態(tài),數(shù)據(jù)庫中可能既有一致的數(shù)據(jù)又有不一致的數(shù)據(jù)。數(shù)據(jù)庫處在正常運行(開啟)狀態(tài)時數(shù)據(jù)庫中所存的數(shù)據(jù)是一致的這一點很容易理解,怎么可能有不一致的數(shù)據(jù)呢?設(shè)想一下有某個用戶發(fā)了如下的dml語句:update emp set sal = sal * 0.9;(您知道這個dml語句的商業(yè)含義嗎?可能是公司長期虧損,為了避免最終倒閉的厄運,公司要求全體員工“同舟共濟”,集體減薪10%),進一步假設(shè)emp表中有幾十萬條記錄。而且該用戶還有個壞毛病,他每次發(fā)了dml語句后既不提交也不回滾??梢韵胂蠼?jīng)過一段時間在數(shù)據(jù)庫高速緩沖區(qū)中的這些數(shù)據(jù)塊就會自動地排到

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論