![Oracle工作過程及原理_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/2ab50cd3-a833-4dad-9bbb-27e575ddef0b/2ab50cd3-a833-4dad-9bbb-27e575ddef0b1.gif)
![Oracle工作過程及原理_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/2ab50cd3-a833-4dad-9bbb-27e575ddef0b/2ab50cd3-a833-4dad-9bbb-27e575ddef0b2.gif)
![Oracle工作過程及原理_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/2ab50cd3-a833-4dad-9bbb-27e575ddef0b/2ab50cd3-a833-4dad-9bbb-27e575ddef0b3.gif)
![Oracle工作過程及原理_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/2ab50cd3-a833-4dad-9bbb-27e575ddef0b/2ab50cd3-a833-4dad-9bbb-27e575ddef0b4.gif)
![Oracle工作過程及原理_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/2ab50cd3-a833-4dad-9bbb-27e575ddef0b/2ab50cd3-a833-4dad-9bbb-27e575ddef0b5.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、我們從一個(gè)用戶請(qǐng)求開始講ORACLE的完整的工作機(jī)制是怎樣的,首先一個(gè)用戶進(jìn)程發(fā)出一個(gè)連接請(qǐng)求,如果使用的是主機(jī)命名或者 是本地服務(wù)命中的主機(jī)名使用的是機(jī)器名(非IP地址),那么這個(gè)請(qǐng)求 都會(huì)通過DNS服務(wù)器或HOST文件的服務(wù)名解析然后傳送到 ORACLE監(jiān)聽進(jìn)程,監(jiān)聽進(jìn)程接收到用戶請(qǐng)求后會(huì)采取兩種方式來處 理這個(gè)用戶請(qǐng)求,下面我們分專用服務(wù)器和共享服務(wù)器分別采用這兩 種方式時(shí)的情況來講:專用服務(wù)器模式下:一種方式是監(jiān)聽進(jìn)程接收到用戶進(jìn)程請(qǐng)求后, 產(chǎn) 生一個(gè)新的專用服務(wù)器進(jìn)程,并且將對(duì)用戶進(jìn)程的所有控制信息傳給 此服務(wù)器進(jìn)程,也就是說新建的服務(wù)器進(jìn)程繼承了監(jiān)聽進(jìn)程的信息, 然后服務(wù)器進(jìn)程給用
2、戶進(jìn)程發(fā)一個(gè) RESEND包,通知用戶進(jìn)程可以 開始給它發(fā)信息了,用戶進(jìn)程給這個(gè)新建的服務(wù)器進(jìn)程發(fā)一個(gè) CONNECT包,服務(wù)器進(jìn)程再以ACCEPT包回應(yīng)用戶進(jìn)程,致此, 用戶進(jìn)程正式與服務(wù)器進(jìn)程確定連接。我們把這種連接叫做 HAND-OFF連接,也叫轉(zhuǎn)換連接。另一種方式是監(jiān)聽進(jìn)程接收到用 戶進(jìn)程的請(qǐng)求后產(chǎn)生一個(gè)新的專用服務(wù)器進(jìn)程,這個(gè)服務(wù)器進(jìn)程選用一個(gè)TCP/IP端口來控制與用戶進(jìn)程的交互,然后將此信息回傳給監(jiān) 聽進(jìn)程,監(jiān)聽進(jìn)程再將此信息傳給用戶進(jìn)程, 用戶進(jìn)程使用這個(gè)端口 給服務(wù)器進(jìn)程發(fā)送一個(gè)CONNECT包,服務(wù)器進(jìn)程再給用戶進(jìn)程發(fā) 送一個(gè)ACCEPT包,致此,用戶進(jìn)程可以正式向服務(wù)器進(jìn)
3、程發(fā)送信 息了。這種方式我們叫做重定向連接。 HAND-OFF連接需要系統(tǒng)平 臺(tái)具有進(jìn)程繼承的能力,為了使 WINDOWSNT/2000 支持HAND-OFF必須在 HKEY_LOCAL_MACHINE>SOFTWARE>ORACLE>HOMEX 中設(shè) 置 USE_SHARED_SOCKET。共享服務(wù)器模式下:只有重定向連接的方式,工作方式是監(jiān)聽進(jìn)程接 收到用戶進(jìn)程的請(qǐng)求后產(chǎn)生一個(gè)新的調(diào)度進(jìn)程, 這個(gè)調(diào)度進(jìn)程選用一 個(gè)TCP/IP端口來控制與用戶進(jìn)程的交互,然后將此信息回傳給監(jiān)聽 進(jìn)程,監(jiān)聽進(jìn)程再將此信息傳給用戶進(jìn)程, 用戶進(jìn)程使用這個(gè)端口給 調(diào)度進(jìn)程發(fā)送一個(gè)CONNECT包
4、,調(diào)度進(jìn)程再給用戶進(jìn)程發(fā)送一個(gè) ACCEPT包,致此,用戶進(jìn)程可以正式向調(diào)度進(jìn)程發(fā)送信息了??梢酝ㄟ^設(shè)置MAX_DISPIATCHERS這個(gè)參數(shù)來確定調(diào)度進(jìn)程的最大數(shù) 目,如果調(diào)度進(jìn)程的個(gè)數(shù)已經(jīng)達(dá)到了最大,或者已有的調(diào)度進(jìn)程不是滿負(fù)荷,監(jiān)聽進(jìn)程將不再創(chuàng)建新的調(diào)度進(jìn)程, 而是讓其中一個(gè)調(diào)度進(jìn) 程選用一個(gè)TCP/IP端口來與此用戶進(jìn)程交互。調(diào)度進(jìn)程每接收一個(gè) 用戶進(jìn)程請(qǐng)求都會(huì)在監(jiān)聽進(jìn)程處作一個(gè)登記,以便監(jiān)聽進(jìn)程能夠均衡 每個(gè)調(diào)度進(jìn)程的負(fù)荷,所有的用戶進(jìn)程請(qǐng)求將分別在有限的調(diào)度進(jìn)程 中排隊(duì),所有調(diào)度進(jìn)程再順序的把各自隊(duì)列中的部分用戶進(jìn)程請(qǐng)求放入同一個(gè)請(qǐng)求隊(duì)列,等候多個(gè) ORACLE的共享服務(wù)器進(jìn)程進(jìn)
5、行處理 (可以通過SHARED_SERVERS參數(shù)設(shè)置共享服務(wù)器進(jìn)程的個(gè)數(shù)), 也就是說所有的調(diào)度進(jìn)程共享同一個(gè)請(qǐng)求隊(duì)列,共享服務(wù)器模式下一 個(gè)實(shí)例只有一個(gè)請(qǐng)求隊(duì)列,共享服務(wù)器進(jìn)程處理完用戶進(jìn)程的請(qǐng)求后 將根據(jù)用戶進(jìn)程請(qǐng)求取自不同的調(diào)度進(jìn)程將返回結(jié)果放入不同的響 應(yīng)隊(duì)列,也就是說有多少調(diào)度進(jìn)程就有多少響應(yīng)隊(duì)列,然后各個(gè)調(diào)度進(jìn)程從各自的響應(yīng)隊(duì)列中將結(jié)果取出再返回給用戶進(jìn)程。以上我們講完了用戶與 ORACLE的連接方式,下面我們要講 ORACLE服務(wù)器進(jìn)程如可處理用戶進(jìn)程的請(qǐng)求,當(dāng)一個(gè)用戶進(jìn)程發(fā)出 了一條 SQL 語名:UPDATETABBLEASETSALARY二SALARY*2 ;首 先,服務(wù)
6、器進(jìn)程把這條語句的字符轉(zhuǎn)換成 ASCII等效數(shù)字碼,接著這 個(gè)ASCII碼被傳遞給一個(gè)HASH函數(shù),并返回一個(gè)HASH值,服務(wù) 器進(jìn)程將到SHAREDPOOL的共享PL/SQL區(qū)去查找是否存在同樣 的HASH值,如果存在,服務(wù)器進(jìn)程將使用這條語句已高速緩存在 SHAREDPOOL中的已分析過的版本來執(zhí)行,如果不存在,服務(wù)器進(jìn) 程將對(duì)該語句進(jìn)行語法分析,首先檢查該語句的語法的正確性, 接著 對(duì)語句中涉及的表、索引、視圖等對(duì)象進(jìn)行解析,并對(duì)照數(shù)據(jù)字典檢 查這些對(duì)象的名稱以及相關(guān)結(jié)構(gòu),并根據(jù) ORACLE選用的優(yōu)化模式 以及數(shù)據(jù)字典中是否存在相應(yīng)對(duì)象的統(tǒng)計(jì)數(shù)據(jù)和是否使用了存儲(chǔ)大綱來生成一個(gè)執(zhí)行計(jì)劃或
7、從存儲(chǔ)大綱中選用一個(gè)執(zhí)行計(jì)劃,然后再用 數(shù)據(jù)字典核對(duì)此用戶對(duì)相應(yīng)對(duì)象的執(zhí)行權(quán)限,最后生成一個(gè)編譯代 碼。ORACLE將這條語名的本身實(shí)際文本、HASH值、編譯代碼、 與此語名相關(guān)聯(lián)的任何統(tǒng)計(jì)數(shù)據(jù)和該語句的執(zhí)行計(jì)劃緩存在SHAREDPOOL的共享PL/SQL區(qū)。服務(wù)器進(jìn)程通過 SHAREDPOOL 鎖存器來申請(qǐng)可以向哪些共享 PL/SQL區(qū)中緩存這此內(nèi)容,也就是說 被SHAREDPOOL鎖存器鎖定的PL/SQL區(qū)中的塊不可被覆蓋,因 為這些塊可能被其它進(jìn)程所使用。在 SQL分析階段將用到 LIBRARYCACHE,從數(shù)據(jù)字典中核對(duì)表、視圖等結(jié)構(gòu)的時(shí)候,需要 將數(shù)據(jù)字典從磁盤讀入LIBRARYCA
8、CHE,因此,在讀入之前也要使 用LIBRARYCACHE鎖存器來申請(qǐng)用于緩存數(shù)據(jù)字典。生成編譯代碼之后,接著下一步服務(wù)器進(jìn)程要準(zhǔn)備開始更新數(shù)據(jù), 服 務(wù)器進(jìn)程將到DBBUFFER中查找是否有相關(guān)對(duì)象的緩存數(shù)據(jù),下面 分兩個(gè)可能進(jìn)行解釋:如果沒有,服務(wù)器進(jìn)程將在表頭部請(qǐng)求一些行鎖,如果成功加鎖,服 務(wù)器進(jìn)程將從數(shù)據(jù)文件中讀這些行所在的數(shù)據(jù)塊放入DBBUFFER中空閑的區(qū)域或者覆蓋已被擠出 LRU列表的非臟數(shù)據(jù)塊緩沖區(qū),并且 排列在LRU列表的頭部,如果這些非臟數(shù)據(jù)緩沖區(qū)寫完也不能滿足新數(shù)據(jù)的請(qǐng)求時(shí),會(huì)立即觸發(fā)DBWN進(jìn)程將臟數(shù)據(jù)列表中指向的緩 沖塊寫入數(shù)據(jù)文件,并且清洗掉這些緩沖區(qū),來騰出空間
9、緩沖新讀入 的數(shù)據(jù),也就是在放入 DBBUFFER之前也是要先申請(qǐng) DBBUFFER中 的鎖存器,成功鎖定后,再寫入 DBBUFFER,然后服務(wù)器程將該語 句影響的被讀入DBBUFFER塊中的這些行的ROWID及將要更新的 原值和新值及SCN等信息逐條的寫入REDOLOGBUFFER,在寫入 REDOLOGBUFFER之前也是先請(qǐng)求REDOLOGBUFFER塊的鎖存 器,成功鎖定之后才開始寫入,當(dāng)寫入達(dá)到REDOLOGBUFFER大小 的三分之一或?qū)懭肓窟_(dá)到1M或超過三秒后或發(fā)生檢查點(diǎn)時(shí)或者 DBWN 之前發(fā)生,LGWR將把REDOLOGBUFFER中的數(shù)據(jù)寫入磁 盤上的重做日志文件,已被寫入
10、重做日志文件的 REDOLOGBUFFER 中的塊上的鎖存器被釋放,并可被后來寫入的信息所覆蓋, REDOLOGBUFFER以循環(huán)的方式工作。當(dāng)一個(gè)重做日志文件寫滿后, LGWR將切換到下一個(gè)重做日志文件,如果是歸檔模式,歸檔進(jìn)程 還將前一個(gè)寫滿的重做日志進(jìn)程寫入歸檔日志文件,重做日志文件也是循環(huán)工作方式。寫完所有的REDOLOGBUFFER之后,服務(wù)器進(jìn)程 開始改寫這個(gè)DBBUFFER塊頭部的事務(wù)列表并寫入 SCN,然后 COPY包含這個(gè)塊的頭部事務(wù)列表及 SCN信息的數(shù)據(jù)副本放入回滾 段中,我們將回滾段中的副本稱為數(shù)據(jù)塊的“前映像”。(回滾段可 以存儲(chǔ)在專門的回滾表空間中,這個(gè)表空間由一個(gè)
11、或多個(gè)物理文件組成,并專用于回滾表空間,回滾段也可在其它表空間中的數(shù)據(jù)文件中 開辟。)然后改寫這個(gè) DBBUFFER塊的數(shù)據(jù),并在其頭部寫入對(duì)應(yīng) 的回滾段地址,如果對(duì)一行數(shù)據(jù)多次 UPDATE而不COMMIT則在 回滾段中將會(huì)有多個(gè)“前映像”,除第一個(gè)“前映像”含有SCN信息外,其它的每個(gè)“前映像”的頭部還含有 SCN信息和“前前映 像”的回滾段地址。一次 UPDATE操作只對(duì)應(yīng)一個(gè)SCN。然后服務(wù) 器進(jìn)程在臟數(shù)據(jù)列表中建立一條指向此緩沖塊的指針。接著服務(wù)器進(jìn)程會(huì)從數(shù)據(jù)文件讀入第二個(gè)塊重復(fù)以上讀入,記日志,建立回滾段, 修改,放入臟列表的動(dòng)作,當(dāng)臟數(shù)據(jù)列表達(dá)到一定長度時(shí),DBWN進(jìn)程將臟數(shù)據(jù)列
12、表中指向的緩沖塊全部寫入數(shù)據(jù)文件,也就是釋放加在這些DBBUFER塊上的鎖存器。其實(shí)ORACLE可以一次從數(shù)據(jù)文 件中讀入幾個(gè)塊放入 DBBUFFER,可以通過參數(shù) DB_FILE_MULTIBLOCK_READ_COUNT來設(shè)置一次讀入的塊的個(gè) 數(shù)。如果要查找的數(shù)據(jù)已緩存,則根據(jù)用戶的 SQL操作類型決定如何操 作,如果是SELECT則查看DBBUFFER塊的頭部是否有事務(wù),如果 有,將從回滾段讀取,如果沒有則比較 SELECT的 SCN與DBBUFFER 塊頭部的SCN如果比自己大,仍然從回滾段讀取,如果比自己小則 認(rèn)這是一個(gè)非臟緩存,可以直接從這個(gè) DBBUFFER塊中讀取。如果 是UP
13、DATE則即使在DBBUFFER中找到一個(gè)沒有事務(wù),而且 SCN 比自己小的非臟緩存數(shù)據(jù)塊,服務(wù)器進(jìn)程仍然要到表的頭部對(duì)這條記 錄申請(qǐng)加鎖,加鎖成功則進(jìn)行后續(xù)動(dòng)作,如果不成功,則要等待前面 的進(jìn)程解鎖后才能進(jìn)行動(dòng)作。只有當(dāng)SQL語句影響的所有行所在的最后一個(gè)塊被讀入 DBBUFFER 并且重做信息被寫入REDOLOGBUFFER (僅是指重做日志緩沖,而 非重做日志文件)之后,用戶才可以發(fā)出COMMIT,COMMIT觸發(fā) LGRW,但并不強(qiáng)制立即DBWN來釋放所有相應(yīng)的DBBUFFER塊 上的鎖,也就是說有可能出現(xiàn)已 COMMIT,但在隨后的一段時(shí)間內(nèi) DBWN還在寫這條語句涉及的數(shù)據(jù)塊的情形
14、,表頭部的行鎖,并不 是在COMMIT 一發(fā)出就馬上釋放,實(shí)際上要等到相應(yīng)的 DBWN進(jìn) 程結(jié)束才會(huì)釋放。一個(gè)用戶請(qǐng)求鎖定另一個(gè)用戶已 COMMIT的資源 不成功的機(jī)會(huì)是存在的,從 COMMIT到DBWN進(jìn)程結(jié)束之間的時(shí) 間很短,如果恰巧在這個(gè)時(shí)間斷電,由于 COMMIT已觸發(fā)LGWR 進(jìn)程,所以這些未來得及寫入數(shù)據(jù)文件的改變會(huì)在實(shí)例重啟后由 SMON進(jìn)程根據(jù)重做日志文件來前滾。如果未 COMMIT就斷電, 由于DBWN之前觸發(fā)LGWR,所有DBWN在數(shù)據(jù)文件上的修改都會(huì)被先一步記入重做日志文件,實(shí)例重啟后,SMON進(jìn)程再根據(jù)重做日志文件來回滾。如果用戶ROOLBACK,則服務(wù)器進(jìn)程會(huì)根據(jù)數(shù)據(jù)
15、文件塊和 DBBUFFER中塊的頭部的事務(wù)列表和SCN以及回滾段地址找到回滾 段中相應(yīng)的修改前的副本,并且用這些原值來還原當(dāng)前數(shù)據(jù)文件中已 修改但未提交的改變。如果有多個(gè)“前映像”,服務(wù)器進(jìn)程會(huì)在一個(gè)“前映像”的頭部找到“前前映像”的回滾段地址,一直找到同一事務(wù)下的最早的一個(gè)“前映像”為止。一旦發(fā)出了COMMIT,用戶就不能ROOLBACK,這使得COMMIT后DBWN進(jìn)程還沒有全部完 成的后續(xù)動(dòng)作得到了保障。下面我們要提到檢查點(diǎn)的作用,當(dāng)一個(gè)全部檢查點(diǎn)發(fā)生的時(shí)候,首先 讓LGWR進(jìn)程將REDOLOGBUFFER中的所有緩沖(包含未提交的 重做信息)寫入重做日志文件,然后讓 DBWN進(jìn)程將DB
16、BUFFER 中所有已提交的緩沖寫入數(shù)據(jù)文件(不強(qiáng)制寫未提交的)。然后更新 控制文件和數(shù)據(jù)文件頭部的SCN,表明當(dāng)前數(shù)據(jù)庫是一致的,如果 在發(fā)生檢點(diǎn)之前斷電,并且當(dāng)時(shí)有一個(gè)未提交的改變正在進(jìn)行, 實(shí)例 重啟之后,SMON進(jìn)程將從上一個(gè)檢查點(diǎn)開始核對(duì)這個(gè)檢查點(diǎn)之后 記錄在重做日志文件中已提交的和未提交改變,因?yàn)镈BWN之前會(huì)觸發(fā)LGWR ,所以DBWN對(duì)數(shù)據(jù)文件的修改一定會(huì)被先記錄在重做 日志文件中。因此,斷電前被 DBWN寫進(jìn)數(shù)據(jù)文件的改變將通過重 做日志文件中的記錄進(jìn)行還原,叫做回滾,如果斷電時(shí)有一個(gè)已提交, 但DBWN動(dòng)作還沒有完全完成的改變存在,因?yàn)橐呀?jīng)提交,提交會(huì) 觸發(fā)LGWR進(jìn)程,所
17、以不管DBWN動(dòng)作是否已完成,該語句將要影 響的行及其產(chǎn)生的結(jié)果一定已經(jīng)記錄在重做日志文件中了,則實(shí)例重啟后,SMON進(jìn)程根據(jù)重做日志文件進(jìn)行前滾。由此可見,實(shí)例失 敗后用于恢復(fù)的時(shí)間由兩個(gè)檢查點(diǎn)之間的間隔大小來決定,我們可以通個(gè)四個(gè)參數(shù)設(shè)置檢查點(diǎn)執(zhí)行的頻率,LOG_CHECKPOINT_IMTERVAL決定了兩個(gè)檢查點(diǎn)之間寫入重做日 志文件的系統(tǒng)物理塊的大小,LOG_CHECKPOINT_TIMEOUT 決定了 兩個(gè)檢查點(diǎn)之間的時(shí)間長度,F(xiàn)AST_START_IO_TARGET決定了用于 恢復(fù)時(shí)需要處理的塊的大小,F(xiàn)AST_START_MTTR_TARGET直接決 定了用于恢復(fù)的時(shí)間的長短。
18、SMON進(jìn)程執(zhí)行的前滾和回滾與用戶 的回滾是不同的,SMON是根據(jù)重做日志文件進(jìn)行前滾或回滾,而 用戶的回滾一定是根據(jù)回滾段的內(nèi)容進(jìn)行回滾的。在這里我們要說一下回滾段存儲(chǔ)的數(shù)據(jù),假如是 delete操作,則回滾段將會(huì)記錄整個(gè) 行的數(shù)據(jù),假如是update,則回滾段只記錄被修改了的字段的變化前 的數(shù)據(jù)(前映像),也就是沒有被修改的字段是不會(huì)被記錄的,假如是insert,則回滾段只記錄插入記錄的rowid。這樣假如事務(wù)提交, 那回滾段中簡單標(biāo)記該事務(wù)已經(jīng)提交;假如是回退,則如果操作是是delete,回退的時(shí)候把回滾段中數(shù)據(jù)重新寫回?cái)?shù)據(jù)塊,操作如果是 update,則把變化前數(shù)據(jù)修改回去,操作如果是
19、 insert,則根據(jù)記 錄的rowid把該記錄刪除。下面我們要講DBWN如何來寫數(shù)據(jù)文件,在寫數(shù)據(jù)文件前首先要找 到可寫的空閑數(shù)據(jù)塊,ORACLE中空閑數(shù)據(jù)塊可以通過FREELIST或 BITMAP來維護(hù),它們位于一個(gè)段的頭部用來標(biāo)識(shí)當(dāng)前段中哪些數(shù)據(jù) 塊可以進(jìn)行INSERT。在本地管理表空間中 ORACLE自動(dòng)管理分配給 段的區(qū)的大小,區(qū)的分配信息存儲(chǔ)在組成表空間的數(shù)據(jù)文件的頭部, 而數(shù)據(jù)字典管理的表空間用戶可以在創(chuàng)建時(shí)決定區(qū)的大小,并且區(qū)的分配信息是存儲(chǔ)在數(shù)據(jù)字典中的,只在本地管理的表空間中才能選用 段自動(dòng)管理,采用自動(dòng)段空間管理的本地管理表空間中的段中的空閑 數(shù)據(jù)塊的信息就存放在段的頭部
20、并且使用位圖來管理,采用手動(dòng)管理 的本地管理表空間中的段和數(shù)據(jù)字典管理的表空間中的段中的空閑 數(shù)據(jù)塊的管理都使用位于段頭部的空閑列表來管理,空閑列表的工作方式:首先一個(gè)空的數(shù)據(jù)塊被加入空閑列表,當(dāng)其中空閑空間小于 PCTFREE設(shè)置的值之后,這個(gè)塊從空閑列表刪除,當(dāng)這個(gè)塊中的內(nèi) 容降至PCTUSED設(shè)置的值之下后,這個(gè)數(shù)據(jù)塊被再次加入空閑列表,位于空閑列表中的數(shù)據(jù)塊都是可以向其中INSERT的塊,當(dāng)一個(gè) 塊移出了空閑列表,但只要其中還有保留空間就可以進(jìn)行UPDATE ,當(dāng)對(duì)其中一行UPDATE 一個(gè)大數(shù)據(jù)時(shí),如果當(dāng)前塊不能完全放下整 個(gè)行,只會(huì)把整個(gè)行遷移到一個(gè)新的數(shù)據(jù)塊, 并在原塊位置留下一
21、個(gè) 指向新塊的指針,這叫行遷移。如果一個(gè)數(shù)據(jù)塊可以INSERT,當(dāng)插入一個(gè)當(dāng)前塊裝不下的行時(shí),這個(gè)行會(huì)溢出到兩個(gè)或兩個(gè)幾上的塊 中,這叫行鏈接。如果用戶的動(dòng)作是INSERT則服務(wù)器進(jìn)程會(huì)先鎖定 FREELIST,然后找到空閑塊的地址,再釋放 FREELIST,當(dāng)多個(gè)服務(wù) 器進(jìn)程同時(shí)想要鎖定FREELIST時(shí)即發(fā)生FREELIST的爭用,可以在 非采用自動(dòng)段空間管理的表空間中創(chuàng)建表時(shí)指定 FREELIST的個(gè)數(shù), 默認(rèn)為1,如果是在采用自動(dòng)段空間管理的表空間中創(chuàng)建表,即使指 定了 FREELIST也會(huì)被忽略,因?yàn)榇藭r(shí)將使用 BITMAP而不是 FREELIST來管理段中的空閑空間。如果用戶動(dòng)作是
22、UPDATE服務(wù)器 進(jìn)程將不會(huì)使用到FREELIST和BITMAP,因?yàn)椴灰ふ乙粋€(gè)空閑 塊,而使用鎖的隊(duì)列。下面來講一下ORACLE鎖的機(jī)制,ORACLE分鎖存器和鎖兩種。鎖 存器是用來保護(hù)對(duì)內(nèi)存結(jié)構(gòu)的訪問,比如對(duì) DBBUFFER中塊的鎖存 器申請(qǐng),只有在DBWN完成后,這些DBBUFFER塊被解鎖。然后 用于其它的申請(qǐng)。鎖存器不可以在進(jìn)程間共享,鎖存器的申請(qǐng)要么成功要么失敗,沒有鎖存器申請(qǐng)隊(duì)列。主要的鎖存器有SHAREDPOOL 鎖存器,LIBRARYCACHE 鎖存器,CACHEBUFFERSLRUCHAIN 鎖 存器,CACHEBUFFERSCHAINS 鎖存器,REDOALLOC
23、ATION 鎖存 器,REDOCOPY鎖存器。ORACLE的鎖是用來保護(hù)數(shù)據(jù)訪問的,鎖 的限制比鎖存器要更寬松,比如,多個(gè)用戶在修改同一表的不同行時(shí), 可以共享一個(gè)表上的一個(gè)鎖,鎖的申請(qǐng)可以按照被申請(qǐng)的順序來排隊(duì) 等候,然后依次應(yīng)用,這種排隊(duì)機(jī)制叫做隊(duì)列(ENPUEUE),如果 兩個(gè)服務(wù)器進(jìn)程試圖對(duì)同一表的同一行進(jìn)行加鎖,則都進(jìn)入鎖的申請(qǐng)隊(duì)列,先進(jìn)的加鎖成功,后面的進(jìn)程要等待,直到前一個(gè)進(jìn)程解鎖才 可以加鎖,這叫做鎖的爭用,而且一旦加鎖成功,這個(gè)鎖將一直保持 到用戶發(fā)出COMMIT或ROOLBACK命令為止。如果兩個(gè)用戶鎖定 各自的一行并請(qǐng)求對(duì)方鎖定的行的時(shí)候?qū)l(fā)生無限期等待即死鎖,死鎖的發(fā)生
24、都是由于鎖的爭用而不是鎖存器的爭用引起的,ORACLE在遇到死鎖時(shí),自動(dòng)釋放其中一個(gè)用戶的鎖并回滾此用戶的改變。 正 常情況下發(fā)生鎖的爭用時(shí),數(shù)據(jù)的最終保存結(jié)果由SCN來決定哪個(gè)進(jìn)程的更改被最終保存。兩個(gè)用戶的服務(wù)器進(jìn)程在申請(qǐng)同一表的多個(gè) 行的鎖的時(shí)候是可以交錯(cuò)進(jìn)入鎖的申請(qǐng)隊(duì)列的。 只有其中發(fā)生爭用才 會(huì)進(jìn)行等待。創(chuàng)建表時(shí)指定的MAXTRANS參數(shù)決了,表中的一個(gè)數(shù) 據(jù)塊最多可以被幾個(gè)事務(wù)同時(shí)鎖定F面是幾個(gè)關(guān)于回滾段和死鎖的事例: 有表:Test(idnumber(10) 有記錄 1000000 條一,大 SELECT,小 UPDATEA 會(huì)話-Select*fromtest;-設(shè) sen=1
25、01- 執(zhí)行時(shí)間 09:10:11B 會(huì)話Updatetestsetid=9999999whereid=1000000-設(shè)sen=102- 執(zhí)行時(shí)間 09:10:12我們會(huì)發(fā)現(xiàn)B會(huì)話會(huì)在A會(huì)話前完成,A會(huì)話中顯示的ID=100000 是從回滾段中讀取的,因?yàn)?A會(huì)話在讀到ID=1000000所在的BLOCK時(shí)發(fā)現(xiàn)BLOCK上有事務(wù)信息,因此要從回滾段中讀,如果UPDATE在SELECT讀至吐匕BLOCK之前已經(jīng)COMMIT,貝卩SELECT 讀到此BLOCK時(shí)發(fā)現(xiàn)其BLOCK上沒有事務(wù)信息,但是會(huì)發(fā)現(xiàn)其 BLICK的SCN比SELECT自己的SCN大,因此也會(huì)從回滾段中讀取。 因此是否從回滾段
26、讀一是看是否有事務(wù)信息二是比較SCN大小。如果B會(huì)話在A會(huì)話結(jié)束前連續(xù)多次對(duì)同一條記錄 UPDATE并COMMIT,那么在回滾段中將記錄多個(gè)“前映像”,而每個(gè)“前映像”中不但包括了原BLOCK的數(shù)據(jù)和SCN也記錄了“前前映像”的回滾段地 址,因此A會(huì)話在查詢到被UPDATE過的BLOCK時(shí),會(huì)根據(jù)BLOCK 記錄的回滾段的地址,找到回滾段中的“前映像”,發(fā)現(xiàn)這個(gè)“前映 像”的SCN也比自己的大,因此將根據(jù)這個(gè)“前映像”中記錄的“前前映像”的回滾段地址,在回滾段中找到“前前映像”,再與這 個(gè)“前前映像”比較SCN,如果比自己小就讀取,如果還比自己大, 則重復(fù)以上步驟,直到找到比自己 SCN小的“前前映像”為止, 如果找不到,就會(huì)報(bào)ORA-01555快照太舊這個(gè)錯(cuò)誤。二、大 UPDATE,小 SELECTA 會(huì)話-Updatetestsetid=1;-設(shè) sen
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 國慶節(jié)團(tuán)建主題活動(dòng)方案
- ktv國慶節(jié)的朋友圈活動(dòng)方案
- 2024-2025學(xué)年新教材高中語文 第三單元 7.1 青蒿素:人類征服疾病的一小步(1)說課稿 部編版必修下冊(cè)
- 2024-2025學(xué)年高中語文 第二單元 七 仁義禮智我固有之說課稿5 新人教版選修《先秦諸子選讀》
- 2025變更勞動(dòng)合同范文
- 2025智能化施工合同
- Unit 12 Weather(說課稿)-2024-2025學(xué)年滬教牛津版(深圳用)英語四年級(jí)上冊(cè)
- 門診手術(shù)策劃方案
- 出資比例 英語合同范例
- 云杉買賣合同范例
- 2025年華能新能源股份有限公司招聘筆試參考題庫含答案解析
- 《中國心力衰竭診斷和治療指南(2024)》解讀完整版
- 《檔案管理課件》課件
- 2024年度中國共產(chǎn)主義共青團(tuán)團(tuán)課課件版
- 2025年中考物理終極押題猜想(新疆卷)(全解全析)
- 脛骨骨折的護(hù)理查房
- 房顫手術(shù)后護(hù)理流程
- 抽水蓄能電站項(xiàng)目建設(shè)管理方案
- 2024版質(zhì)量管理培訓(xùn)
- 高中師德師風(fēng)培訓(xùn)
- 電動(dòng)工具培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論