新聞中心
我們知道,Oracle數(shù)據(jù)庫(kù)中的各個(gè)進(jìn)程要完成某個(gè)特定的任務(wù)或一組任務(wù),每個(gè)進(jìn)程都會(huì)分配內(nèi)部?jī)?nèi)存(PGA 內(nèi)存)來(lái)完成它的任務(wù)。Oracle實(shí)例主要有3類(lèi)進(jìn)程:服務(wù)器進(jìn)程、后臺(tái)進(jìn)程和從屬進(jìn)程,本文我們主要介紹一下Oracle數(shù)據(jù)庫(kù)服務(wù)器進(jìn)程的相關(guān)知識(shí),關(guān)于后臺(tái)進(jìn)程和從屬進(jìn)程我們會(huì)在后面的文章中繼續(xù)介紹。

Oracle實(shí)例主要有3 類(lèi)進(jìn)程:
(1)服務(wù)器進(jìn)程(serverprocess):這些進(jìn)程根據(jù)客戶(hù)的請(qǐng)求來(lái)完成工作。我們已經(jīng)對(duì)專(zhuān)用服務(wù)器和共享服務(wù)器有了一定的了解。它們就是服務(wù)器進(jìn)程。
(2)后臺(tái)進(jìn)程(backgroundprocess):這些進(jìn)程隨數(shù)據(jù)庫(kù)而啟動(dòng),用于完成各種維護(hù)任務(wù),如將塊寫(xiě)至磁盤(pán)、維護(hù)在線重做日志、清理異常中止的進(jìn)程等。
(3)從屬進(jìn)程(slaveprocess):這些進(jìn)程類(lèi)似于后臺(tái)進(jìn)程,不過(guò)它們要代表后臺(tái)進(jìn)程或服務(wù)器進(jìn)程完成一些額外的工作。
在某些操作系統(tǒng)(如Windows)上,Oracle使用線程實(shí)現(xiàn),所以在這種操作系統(tǒng)上,就要把我們所說(shuō)的“進(jìn)程”理解為“線程”的同義詞。
“進(jìn)程”一詞既表示進(jìn)程,也涵蓋線程。如果你使用的是一個(gè)多進(jìn)程的Oracle 實(shí)現(xiàn),比如說(shuō)UNIX 上的Oracle 實(shí)現(xiàn),“進(jìn)程”就很貼切。如果你使用的是單進(jìn)程的Oracle 實(shí)現(xiàn),如Windows上的Oracle 實(shí)現(xiàn),“進(jìn)程”實(shí)際是指“Oracle 進(jìn)程中的線程”。所以,舉例來(lái)說(shuō),當(dāng)我談到DBWn 進(jìn)程時(shí),在Windows 上就對(duì)應(yīng)為Oracle 進(jìn)程中的DBWn 線程
服務(wù)器進(jìn)程
服務(wù)器進(jìn)程就是代表客戶(hù)會(huì)話完成工作的進(jìn)程。應(yīng)用向數(shù)據(jù)庫(kù)發(fā)送的SQL 語(yǔ)句最后就要由這些進(jìn)程接收并執(zhí)行。
(1)專(zhuān)用服務(wù)器(dedicatedserver)連接,采用專(zhuān)用服務(wù)器連接時(shí),會(huì)在服務(wù)器上得到針對(duì)這個(gè)連接的一個(gè)專(zhuān)用進(jìn)程。數(shù)據(jù)庫(kù)連接與服務(wù)器上的一個(gè)進(jìn)程或線程之間存在一對(duì)一的映射。
(2)共享服務(wù)器(sharedserver)連接,采用共享服務(wù)器連接時(shí),多個(gè)會(huì)話可以共享一個(gè)服務(wù)器進(jìn)程池, 其中的進(jìn)程由Oracle 實(shí)例生成和管理。你所連接的是一個(gè)數(shù)據(jù)庫(kù)調(diào)度器(dispatcher),而不是特意為連接創(chuàng)建的一個(gè)專(zhuān)用服務(wù)器進(jìn)程。
注意連接和會(huì)話之間的區(qū)別:
(1)連接(connection)就是客戶(hù)進(jìn)程與Oracle 實(shí)例之間的一條物理路徑(例如,客戶(hù)與實(shí)例之間的一個(gè)網(wǎng)絡(luò)連接)。
(2)會(huì)話(session)則不同,這是數(shù)據(jù)庫(kù)中的一個(gè)邏輯實(shí)體,客戶(hù)進(jìn)程可以在會(huì)話上執(zhí)行SQL 等。多個(gè)獨(dú)立的會(huì)話可以與一個(gè)連接相關(guān)聯(lián),這些會(huì)話甚至可以獨(dú)立于連接存在。
專(zhuān)用服務(wù)器進(jìn)程和共享服務(wù)器進(jìn)程的任務(wù)是一樣的:要處理你提交的所有SQL。當(dāng)你向數(shù)據(jù)庫(kù)提交一個(gè)SELECT * FROM EMP 查詢(xún)時(shí),會(huì)有一個(gè)Oracle 專(zhuān)用/共享服務(wù)器進(jìn)程解析這個(gè)查詢(xún),并把它放在共享池中(或者最好能發(fā)現(xiàn)這個(gè)查詢(xún)已經(jīng)在共享池中)。這個(gè)進(jìn)程要提出執(zhí)行計(jì)劃,如果必要,還要執(zhí)行這個(gè)執(zhí)行計(jì)劃,可能在緩沖區(qū)緩存中找到必要的數(shù)據(jù),或者將數(shù)據(jù)從磁盤(pán)讀入緩沖區(qū)緩存中。這些服務(wù)器進(jìn)程是干重活的進(jìn)程。在很多情況下,你都會(huì)發(fā)現(xiàn)這些進(jìn)程占用的系統(tǒng)CPU 時(shí)間最多,因?yàn)檎沁@些進(jìn)程來(lái)執(zhí)行排序、匯總、聯(lián)結(jié)等等工作,幾乎所有工作都是這些進(jìn)程做的。
專(zhuān)用服務(wù)器連接
在專(zhuān)用服務(wù)器模式下,客戶(hù)連接和服務(wù)器進(jìn)程(或者有可能是線程)之間會(huì)有一個(gè)一對(duì)一的映射。如果一臺(tái)UNIX 主機(jī)上有100 條專(zhuān)用服務(wù)器連接,就會(huì)有相應(yīng)的100 個(gè)進(jìn)程在執(zhí)行。可以用圖來(lái)說(shuō)明,如圖5-1 所示。
客戶(hù)應(yīng)用中鏈接著Oracle 庫(kù),這些庫(kù)提供了與數(shù)據(jù)庫(kù)通信所需的API。這些API 知道如何向數(shù)據(jù)庫(kù)提交查詢(xún),并處理返回的游標(biāo)。它們知道如何把你的請(qǐng)求打包為網(wǎng)絡(luò)調(diào)用,專(zhuān)用服務(wù)器則知道如何將這些網(wǎng)絡(luò)調(diào)用解開(kāi)。這部分軟件稱(chēng)為Oracle Net,不過(guò)在以前的版本中可能稱(chēng)之為SQL*Net 或Net8。這是一個(gè)網(wǎng)絡(luò)軟件/協(xié)議,Oracle 利用這個(gè)軟件來(lái)支持客戶(hù)/服務(wù)器處理(即使在一個(gè)n 層體系結(jié)構(gòu)中也會(huì)“潛伏”著客戶(hù)/服務(wù)器程序)。不過(guò),即使從技術(shù)上講沒(méi)有涉及Oracle Net,Oracle 也采用了同樣的體系結(jié)構(gòu)。也就是說(shuō),即使客戶(hù)和服務(wù)器在同一臺(tái)機(jī)器上,也會(huì)采用這種兩進(jìn)程(也稱(chēng)為兩任務(wù))體系結(jié)構(gòu)。
這個(gè)體系結(jié)構(gòu)有兩個(gè)好處:
(1)遠(yuǎn)程執(zhí)行(remoteexecution):客戶(hù)應(yīng)用可能在另一臺(tái)機(jī)器上執(zhí)行(而不是數(shù)據(jù)庫(kù)所在的機(jī)器),這是很自然的。
(2)地址空間隔離(addressspace isolation):服務(wù)器進(jìn)程可以讀寫(xiě)SGA。如果客戶(hù)進(jìn)程和服務(wù)器進(jìn)程物理地鏈接在一起,客戶(hù)進(jìn)程中一個(gè)錯(cuò)誤的指針就能輕松地破壞SGA 中的數(shù)據(jù)結(jié)構(gòu)。
共享服務(wù)器連接
共享服務(wù)器連接強(qiáng)制要求必須使用Oracle Net,即使客戶(hù)和服務(wù)器都在同一臺(tái)機(jī)器上也不例外。如果不使用OracleTNS 監(jiān)聽(tīng)器,就無(wú)法使用共享服務(wù)器。如前所述,客戶(hù)應(yīng)用會(huì)連接到Oracle TNS 監(jiān)聽(tīng)器,并重定向或轉(zhuǎn)交給一個(gè)調(diào)度器。調(diào)度器充當(dāng)客戶(hù)應(yīng)用和共享服務(wù)器進(jìn)程之間的“導(dǎo)管”。圖5-2 顯示了與數(shù)據(jù)庫(kù)建立共享服務(wù)器連接時(shí)的體系結(jié)構(gòu)。
在此可以看到,客戶(hù)應(yīng)用(其中鏈接了Oracle 庫(kù))會(huì)與一個(gè)調(diào)度器進(jìn)程物理連接。對(duì)于給定的實(shí)例,可以配置多個(gè)調(diào)度器,但是對(duì)應(yīng)數(shù)百個(gè)(甚至數(shù)千個(gè))用戶(hù)只有一個(gè)調(diào)度器的情況并不鮮見(jiàn)。調(diào)度器只負(fù)責(zé)從客戶(hù)應(yīng)用接收入站請(qǐng)求,并把它們放入SGA 中的一個(gè)請(qǐng)求隊(duì)列。第一個(gè)可用的共享服務(wù)器進(jìn)程(與專(zhuān)用服務(wù)器進(jìn)程實(shí)質(zhì)上一樣)從隊(duì)列中選擇請(qǐng)求,并附加相關(guān)會(huì)話的UGA(圖5-2 中標(biāo)有“S”的方框)。共享服務(wù)器處理這個(gè)請(qǐng)求,把得到的輸出放在響應(yīng)隊(duì)列中。調(diào)度器一直監(jiān)視著響應(yīng)隊(duì)列來(lái)得到結(jié)果,并把結(jié)果傳回給客戶(hù)應(yīng)用。就客戶(hù)而言,它分不清到底是通過(guò)一條專(zhuān)用服務(wù)器連接還是通過(guò)一條共享服務(wù)器連接進(jìn)行連接,看上去二者都一樣,只是在數(shù)據(jù)庫(kù)級(jí)二者的區(qū)別才會(huì)明顯。
連接與會(huì)話
在一條連接上可以建立0 個(gè)、一個(gè)或多個(gè)會(huì)話。各個(gè)會(huì)話是單獨(dú)而且獨(dú)立的,即使它們共享同一條數(shù)據(jù)庫(kù)物理連接也是如此。一個(gè)會(huì)話中的提交不會(huì)影響該連接上的任何其他會(huì)話。實(shí)際上,一條連接上的各個(gè)會(huì)話可以使用不同的用戶(hù)身份。
在Oracle 中,連接只是客戶(hù)進(jìn)程和數(shù)據(jù)庫(kù)實(shí)例之間的一條特殊線路,最常見(jiàn)的就是網(wǎng)絡(luò)連接。這條連接可能連接到一個(gè)專(zhuān)用服務(wù)器進(jìn)程,也可能連接到調(diào)度器。如前所述,連接上可以有0 個(gè)或多個(gè)會(huì)話,這說(shuō)明可以有連接而無(wú)相應(yīng)的會(huì)話。另外,一個(gè)會(huì)話可以有連接也可以沒(méi)有連接。使用高級(jí)Oracle Net 特性(如連接池)時(shí),客戶(hù)可以刪除一條物理連接,而會(huì)話依然保留(但是會(huì)話會(huì)空閑)。客戶(hù)在這個(gè)會(huì)話上執(zhí)行某個(gè)操作時(shí),它會(huì)重新建立物理連接。
連接(connection):連接是從客戶(hù)到Oracle 實(shí)例的一條物理路徑。連接可以在網(wǎng)絡(luò)上建立,或者通過(guò)IPC 機(jī)制建立。通常會(huì)在客戶(hù)進(jìn)程與一個(gè)專(zhuān)用服務(wù)器或一個(gè)調(diào)度器之間建立連接。不過(guò),如果使用Oracle 的連接管理器(Connection Manager ,CMAN),還可以在客戶(hù)和CMAN之間以及CMAN 和數(shù)據(jù)庫(kù)之間建立連接。
會(huì)話(session):會(huì)話是實(shí)例中存在的一個(gè)邏輯實(shí)體。這就是你的會(huì)話狀態(tài)(session state),也就是表示特定會(huì)話的一組內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)。提到“數(shù)據(jù)庫(kù)連接”時(shí),大多數(shù)人首先想到的就是“會(huì)話”。你要在服務(wù)器中的會(huì)話上執(zhí)行SQL、提交事務(wù)和運(yùn)行存儲(chǔ)過(guò)程??梢允褂肧QL*Plus 來(lái)看一看實(shí)際的連接和會(huì)話是什么樣子,從中還可以了解到,實(shí)際上一條連接有多個(gè)會(huì)話的情況相當(dāng)常見(jiàn)。
這里使用了AUTOTRACE 命令,并發(fā)現(xiàn)有兩個(gè)會(huì)話。我們?cè)谝粭l連接上使用一個(gè)進(jìn)程創(chuàng)建了兩個(gè)會(huì)話。以下是其中的第一個(gè)會(huì)話:
- SQL> select username, sid, serial#, server,paddr, status from v$session where username='SYS';
- USERNAME SID SERIAL# SERVER PADDR STATUS
- ------------------------------ -------------------- --------- -------- --------
- SYS 153 27 DEDICATED 3621B264 ACTIVE
以上PADDR 列是這個(gè)專(zhuān)用服務(wù)器進(jìn)程的地址。
下面,只需打開(kāi)AUTOTRACE來(lái)查看SQL*Plus 中所執(zhí)行語(yǔ)句的統(tǒng)計(jì)結(jié)果:
- SQL> set autotrace on statistics
- SQL> select username, sid, serial#,server, paddr, status from v$session where username='SYS';
- USERNAME SID SERIAL# SERVER PADDR STATUS
- ------------------------------ -------------------- --------- -------- --------
- SYS 152 88 DEDICATED 3621B264 INACTIVE
- SYS 153 27 DEDICATED 3621B264 ACTIVE
- Statistics
- ----------------------------------------------------------
- 0 recursive calls
- 0 db block gets
- 0 consistent gets
- 0 physical reads
- 0 redo size
- 770 bytes sent via SQL*Net toclient
- 385 bytes received via SQL*Netfrom client
- 2 SQL*Net roundtrips to/fromclient
- 0 sorts (memory)
- 0 sorts (disk)
- 2 rows processed
此時(shí)有了兩個(gè)會(huì)話,但是這兩個(gè)會(huì)話都使用同一個(gè)專(zhuān)用服務(wù)器進(jìn)程,從它們都有同樣的PADDR 值就能看出這一點(diǎn)。從操作系統(tǒng)也可以得到確認(rèn),因?yàn)闆](méi)有創(chuàng)建新的進(jìn)程,對(duì)這兩個(gè)會(huì)話只使用了一個(gè)進(jìn)程(一條連接)。
需要注意,其中一個(gè)會(huì)話(原來(lái)的會(huì)話)是ACTIVE(活動(dòng)的)。這是有道理的: 它正在運(yùn)行查詢(xún)來(lái)顯示這個(gè)信息,所以它當(dāng)然是活動(dòng)的。但是那個(gè)INACTIVE(不活動(dòng)的)會(huì)話呢?那個(gè)會(huì)話要做什么?這就是AUTOTRACE 會(huì)話,它的任務(wù)是“監(jiān)視”我們的實(shí)際會(huì)話,并報(bào)告它做了什么。
在SQL*Plus 中啟用(打開(kāi))AUTOTRACE 時(shí),如果我們執(zhí)行DML 操作(INSERT、UPDATE、DELETE、SELECT和MERGE),SQL*Plus 會(huì)完成以下動(dòng)作:
(1)如果還不存在輔助會(huì)話[1],它會(huì)使用當(dāng)前連接創(chuàng)建一個(gè)新會(huì)話。
(2)要求這個(gè)新會(huì)話查詢(xún)V$SESSTAT視圖來(lái)記住實(shí)際會(huì)話(即運(yùn)行DML的會(huì)話)的初始統(tǒng)計(jì)值。
(3)在原會(huì)話中運(yùn)行DML 操作。
(4)DML 語(yǔ)句執(zhí)行結(jié)束后,SQL*Plus會(huì)請(qǐng)求另外那個(gè)會(huì)話(即“監(jiān)視”會(huì)話)再次查詢(xún)V$SESSTAT,并生成前面所示的報(bào)告,顯示出原會(huì)話(執(zhí)行DML 的會(huì)話)的統(tǒng)計(jì)結(jié)果之差。
如果關(guān)閉AUTOTRACE,SQL*Plus 會(huì)終止這個(gè)額外的會(huì)話,在V$SESSION 中將無(wú)法看到這個(gè)會(huì)話。你可能會(huì)問(wèn):“SQL*Plus 為什么要這樣做,為什么要另建一個(gè)額外的會(huì)話?”。原因是:如果使用同一個(gè)會(huì)話來(lái)監(jiān)視內(nèi)存使用,那執(zhí)行監(jiān)視本身也要使用內(nèi)存。
如果在同一個(gè)會(huì)話中觀察統(tǒng)計(jì)結(jié)果,就會(huì)對(duì)統(tǒng)計(jì)結(jié)果造成影響(導(dǎo)致對(duì)統(tǒng)計(jì)結(jié)果的修改)。倘若SQL*Plus使用一個(gè)會(huì)話來(lái)報(bào)告所執(zhí)行的I/O 次數(shù),網(wǎng)絡(luò)上傳輸了多少字節(jié),以及執(zhí)行了多少次排序,那么查看這些詳細(xì)信息的查詢(xún)本身也會(huì)影響統(tǒng)計(jì)結(jié)果。這些查詢(xún)可能自己也要排序、執(zhí)行I/O 以及在網(wǎng)絡(luò)上傳輸數(shù)據(jù)等(一般來(lái)說(shuō)都會(huì)如此?。?。因此,我們需要使用另一個(gè)會(huì)話來(lái)正確地測(cè)量。
到目前為止,我們已經(jīng)看到一條連接可以有一個(gè)或兩個(gè)會(huì)話?,F(xiàn)在,我們想使用SQL*Plus 來(lái)查看一條沒(méi)有任何會(huì)話的連接。這很容易。在上例所用的同一個(gè)SQL*Plus 窗口中,只需鍵入一個(gè)“很容易誤解”的命令即DISCONNECT:
ops$tkyte@ORA10G> set autotrace off
ops$tkyte@ORA10G> disconnect
從技術(shù)上講,這個(gè)命令應(yīng)該叫DESTROY_ALL_SESSIONS 更合適,而不是DISCONNECT,因?yàn)槲覀儾](méi)有真正物理地?cái)嚅_(kāi)連接。
注意在SQL*Plus 中要真正地?cái)嚅_(kāi)連接,應(yīng)該執(zhí)行“exit”命令,因?yàn)槟惚仨毻顺霾拍芡耆蜂N(xiāo)連接。不過(guò),我們已經(jīng)關(guān)閉了所有會(huì)話。
使用另一個(gè)用戶(hù)賬戶(hù)打開(kāi)另一個(gè)會(huì)話,并查詢(xún)?cè)脩?hù)SYS。
- SQL> select username, sid, serial#,server, paddr, status from v$session where username='SYS';
- no rows selected
可以看到,這個(gè)賬戶(hù)名下沒(méi)有會(huì)話,但是仍有一個(gè)進(jìn)程,相應(yīng)地有一條物理連接(使用前面的ADDR值):
- SQL> select username, program fromv$process where addr = hextoraw('3621B264');
- USERNAME PROGRAM
- ---------------------------------------------------------------
- oracle oracle@db1 (TNS V1-V3)
所以,這就有了一條沒(méi)有相關(guān)會(huì)話的“連接”??梢允褂肧QL*Plus 的CONNECT 命令(這個(gè)命令的名字也起得不恰當(dāng)),在這個(gè)現(xiàn)有的進(jìn)程中創(chuàng)建一個(gè)新會(huì)話(CONNECT命令叫CREATE_SESSION更合適):
- SQL> conn / as sysdba;
- Connected.
- SQL> select username, sid, serial#,server, paddr, status from v$session where username='SYS';
- USERNAME SID SERIAL# SERVER PADDR STATUS
- ------------------------------ -------------------- --------- -------- --------
- SYS 158 34 DEDICATED 3621B264 ACTIVE
可以注意到,PADDR 還是一樣的,所以我們還是在使用同一條物理連接,但是(可能)有一個(gè)不同的SID。我說(shuō)“可能有”,是因?yàn)橐苍S還會(huì)分配同樣的SID,這取決于在我們注銷(xiāo)時(shí)是否有別人登錄,以及我們?cè)瓉?lái)的SID 是否可用。
到此為止,這些測(cè)試都是用一條專(zhuān)用服務(wù)器連接執(zhí)行的,所以PADDR 正是專(zhuān)用服務(wù)器進(jìn)程的進(jìn)程地址。
關(guān)于Oracle數(shù)據(jù)庫(kù)服務(wù)器進(jìn)程的相關(guān)知識(shí)就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
網(wǎng)站名稱(chēng):Oracle數(shù)據(jù)庫(kù)進(jìn)程之服務(wù)器進(jìn)程詳解
地址分享:http://www.5511xx.com/article/coipigc.html


咨詢(xún)
建站咨詢(xún)
