參考:Oracle架構(gòu)實現(xiàn)原理兼吓、含五大進(jìn)程解析(圖文詳解)
一.Oracle RDBMS架構(gòu)圖
Oracle指的是Oracle RDBMS(Relational databases Management system)染苛,一套Oracle數(shù)據(jù)庫管理系統(tǒng)夺刑,也稱之為Oracle Server。而Oracle Server主要有兩大部分:
Oracle Server = 實例 + 數(shù)據(jù)庫 (Instance和Database是相互獨立的)
- 數(shù)據(jù)庫 = 數(shù)據(jù)文件 + 控制文件 +日志文件
- 實例 = 內(nèi)存池 + 后臺進(jìn)程
所以可以細(xì)分為: Oracle Server = 內(nèi)存池 + 后臺進(jìn)程 + 數(shù)據(jù)文件 + 控制文件 + 日志文件
一臺Oracle Server支持創(chuàng)建多個Database睡陪,而且每個Datacase是互相隔離而獨立的。不同的Database擁有屬于自己的全套相關(guān)文件,例如:有各自的密碼文件岗仑,參數(shù)文件,數(shù)據(jù)文件莹规,控制文件和日志文件。
Database由一些物理文件(如:存放在存儲設(shè)備中的二維表文件)組成良漱。二維表存儲在Database中,但Database的內(nèi)容不能被用戶直接讀取欢际,用戶必須通過Oracle instance才能夠訪問Database母市,一個Instance只能連接一個Database,但是一個Database可以被多個Instance連接损趋。
將上面的Oracle RDBMS架構(gòu)圖進(jìn)行抽象分類患久,可以將Oracle架構(gòu)抽象為:Oracle體系 = 內(nèi)存結(jié)構(gòu) + 進(jìn)程結(jié)構(gòu) + 存儲結(jié)構(gòu)
二.內(nèi)存結(jié)構(gòu)
Oracle Instance是Oracle RDBMS的核心之一,負(fù)責(zé)RDBMS的管理功能浑槽。Oracle Instance主要由內(nèi)存池SGA和后臺進(jìn)程組成蒋失。
SGA(System Global Area)是與Oracle性能關(guān)系最大的核心部分,也是對Oracle進(jìn)行調(diào)優(yōu)的主要考量桐玻。SGA內(nèi)存池會在Instance啟動時被分配篙挽,在Instance關(guān)閉時被釋放。在一定范圍內(nèi)镊靴,SGA可以在Instance運行時通過自動方式響應(yīng)DBA的指令铣卡。
1.高速緩存緩沖區(qū)(數(shù)據(jù)庫緩沖區(qū))
數(shù)據(jù)庫緩沖區(qū)是oracle執(zhí)行SQL語句的區(qū)域链韭。
例如在更新數(shù)據(jù)時,用戶執(zhí)行的SQL語句不會直接對磁盤上的數(shù)據(jù)文件進(jìn)行更改操作煮落,而是首先將數(shù)據(jù)文件復(fù)制到數(shù)據(jù)庫緩沖區(qū)緩存(就是說數(shù)據(jù)庫緩沖區(qū)里會存放著SQL相關(guān)數(shù)據(jù)文件副本)敞峭,再更改應(yīng)用于數(shù)據(jù)庫緩沖區(qū)緩存中這些數(shù)據(jù)塊的副本。而且數(shù)據(jù)塊副本將在緩存中保留一段時間蝉仇,直至其占用的緩沖區(qū)被另一個數(shù)據(jù)庫覆蓋為止(緩沖區(qū)Size有限)旋讹。
在查詢數(shù)據(jù)時,為了提高執(zhí)行效率轿衔,查詢的數(shù)據(jù)也要經(jīng)過緩存沉迹。建立的Session會計算出那些數(shù)據(jù)塊包含關(guān)鍵的行,并將它們復(fù)制到數(shù)據(jù)庫緩沖區(qū)中進(jìn)行緩存呀枢。此后胚股,相關(guān)關(guān)鍵行會傳輸?shù)絊ession的PGA作進(jìn)一步處理。這些數(shù)據(jù)塊也會在數(shù)據(jù)庫緩存區(qū)緩存中保留一段時間裙秋。
一般情況下琅拌,被頻繁訪問的數(shù)據(jù)塊會存在于數(shù)據(jù)庫緩沖區(qū)緩存中,從而最大程度地減少對磁盤I/O的需要摘刑。
那什么時候會將被更新的數(shù)據(jù)塊副本寫入到磁盤中的數(shù)據(jù)文件呢?
答案就是:如果在緩沖區(qū)緩存中存儲的數(shù)據(jù)塊與磁盤上的數(shù)據(jù)塊不同時进宝,那么這樣的緩沖區(qū)常稱為”臟緩沖區(qū)”,臟緩沖區(qū)中的數(shù)據(jù)塊副本就必須寫回到磁盤的數(shù)據(jù)文件中枷恕。
調(diào)優(yōu):數(shù)據(jù)庫緩沖區(qū)緩存的大小會對性能產(chǎn)生至關(guān)重要的影響党晋,具體需要多大的Size才能成為最佳配比還要結(jié)合實際的生產(chǎn)環(huán)境而言⌒炜椋總體而言可以依據(jù)以下兩點基本要求來判斷:
- 緩存應(yīng)足夠大未玻,以便能緩存所有被頻繁訪問的數(shù)據(jù)塊。如果緩存過小胡控,那么將導(dǎo)致磁盤I/0活動過多扳剿,因為頻繁訪問的數(shù)據(jù)塊持續(xù)從磁盤讀取,并由其他數(shù)據(jù)塊使用和重寫昼激,然后再從磁盤讀取庇绽。
- 但也不能太大,以至于它會將極少被訪問的塊也一并加入到緩存中橙困,這樣會增長在緩存中搜索的時間瞧掺。
數(shù)據(jù)庫緩沖區(qū)緩存在Instance啟動時被分配。從數(shù)據(jù)庫9i開始凡傅,可以隨時將其調(diào)大或調(diào)小辟狈。可以采用手動方式重調(diào)像捶,也可以根據(jù)工作負(fù)荷自動重調(diào)大小(事務(wù))上陕。
2.日志緩沖區(qū)
日志緩沖區(qū)是小型的桩砰、用于短期存儲將寫入到磁盤上的重做日志的變更向量的臨時區(qū)域。主要作用是提供更加快的日志處理效率释簿。
3.共享池
共享池的大小也對性能產(chǎn)生重要影響
- 它應(yīng)該足夠大亚隅,以便緩存所有頻繁執(zhí)行的代碼和頻繁訪問的對象定義。如果共享池過小庶溶,則性能下降煮纵,因為服務(wù)器會話將反復(fù)搶奪其中的空間來分析語句,此后偏螺,這些語句會被其他語句重寫行疏,在重新執(zhí)行時,將不得不再次分析套像。如果共享池小于最優(yōu)容量酿联,則性能將下降。但有一個最小容量夺巩,如果低于此限度贞让,則語句將失敗。
- 但也不能過大柳譬,以至于連僅執(zhí)行一次的語句也要緩存喳张。過大的共享池也會對性能產(chǎn)生不良影響,因為搜索需要的時間過長美澳。
確定最優(yōu)容量是一個性能調(diào)整問題销部,大多數(shù)數(shù)據(jù)庫都需要一個數(shù)百MB的共享池。有些應(yīng)用程序需要1GB以上的共享池制跟,但很少有應(yīng)用程序能夠在共享池小于100MB時充分運行舅桩。
4.大型池
主要用途是供共享的服務(wù)器進(jìn)程使用。
5.JAVA池
只有當(dāng)應(yīng)用程序需要在數(shù)據(jù)庫中運行java存儲程序時雨膨,才需要java池江咳。
三.進(jìn)程結(jié)構(gòu)
1.用戶進(jìn)程
用戶連接進(jìn)程是連接用戶和Oracle Instance的橋梁。只有在User與Instance建立了連接以后哥放,User才能夠?qū)racle Server進(jìn)行操作。
用戶連接進(jìn)程 = 用戶進(jìn)程 + 服務(wù)進(jìn)程 + PGA
A.用戶進(jìn)程User Process
當(dāng)一個Database User請求連接到Oracle Server時爹土,Oracle Server會創(chuàng)建User Process甥雕。
User Process的作用:
為Database User與Server Process建立連接 并不會直接與Oracle Server交互
connect連接:是User和Server Process之間的通信通道。
B.Server Process服務(wù)進(jìn)程
用于處理Database User和Oracle Server之間的連接胀茵。
當(dāng)一個User與User Process建立了一個connect后社露,Oracle Server會創(chuàng)建一個Server Process。然后再由User Process與Server Process建立了連接之后琼娘,Server Process會通過用戶提交的請求信息來確定與oracle instance建立一個會話峭弟。
Server Process的作用:
與Oracle Server直接交互 復(fù)制執(zhí)行和返回結(jié)果
C.Session會話
一個用戶通過User Process(本質(zhì)是通過Server Process)與Oracle Instance建立連接后稱之為一個會話附鸽,一個用戶可以建立多個會話,即同時使用同一個用戶可以多次的連接到同一個實例瞒瘸,也就是說多個session可以使用同一個connect坷备。
2.程序全局區(qū)PGA
PGA:Oracle Server Process分配來專門用于當(dāng)前User Session的內(nèi)存區(qū)。該區(qū)域是私有的情臭,不同的用戶擁有不同的PGA省撑。
PGA包含了Server Process數(shù)據(jù)和控制信息的內(nèi)存區(qū)域。俯在,由下列3個部分組成:
- 椌癸空間:存儲Session的變量、數(shù)組等的內(nèi)存空間跷乐。
- Session Info:如果運行的不是多線程服務(wù)器肥败,會話信息將保存在PGA中,如果是多線程服務(wù)器愕提,則保存在SGA中馒稍。
- 私有SQL區(qū):用來保存綁定變量(binding variables)和運行時緩沖區(qū)(runtime buffers)等信息。
Oracle的connect連接和session會話與User Process緊密相關(guān)
注意:在RDBMS中由db_name和instance_name共同確定一個Database揪荣,所以Instance_name被用于Oracle與OS之間的聯(lián)系同時也被用于Oracle Server與外部連接時使用赊堪。
所以在User提交連接請求的時候衅鹿,User Process首先會與Server Process建立Connect,然后Server Process會通過請求中所包含的db_name和Instance_name來確定需要且可以被連接的數(shù)據(jù)庫(RDBMS可以存在多個數(shù)據(jù)庫),這樣就確保了RDBMS在擁有多個數(shù)據(jù)庫的情況下硼婿,還能夠保證每一個Database的獨立性。而且同一個Database可以被多個屬于這個Databse的不同用戶發(fā)起的Instance連接敦锌。這一個功能是非常有必要的您机,因為每一個不同的數(shù)據(jù)庫中都包含有同名的sys、system等系統(tǒng)用戶脖祈。
四.后臺進(jìn)程
后臺進(jìn)程主要是完成數(shù)據(jù)庫管理任務(wù) 肆捕,后臺進(jìn)程是Oracle Instance和Oracle Database的聯(lián)系紐帶,分為核心進(jìn)程和非核心進(jìn)程盖高。
1. 核心進(jìn)程:核心進(jìn)程慎陵,必須存在,有一個終止喻奥,所有數(shù)據(jù)庫進(jìn)程全部終止席纽,實例崩潰!其中五大進(jìn)程全都是核心進(jìn)程。
2. 非核心進(jìn)程:完成數(shù)據(jù)庫的額外功能撞蚕,非核心進(jìn)程死亡數(shù)據(jù)庫不會崩潰!
常用的核心進(jìn)程:
在用戶訪問數(shù)據(jù)庫時润梯,首先會提交請求,再分配SGA內(nèi)存,創(chuàng)建并啟動后臺進(jìn)程和實例纺铭,最后建立連接和會話寇钉。Oracle Server運行過程中必須啟動上面的前五個進(jìn)程。否則實例無法創(chuàng)建舶赔。
A.數(shù)據(jù)庫寫入進(jìn)程(DBWn)
Server process連接Oracle后扫倡,通過數(shù)據(jù)庫寫進(jìn)程(DBWn)將數(shù)據(jù)緩沖區(qū)中的“臟緩沖區(qū)”的數(shù)據(jù)塊寫入到存儲結(jié)構(gòu)(數(shù)據(jù)文件、磁盤文件)
Database writer (DBWn)數(shù)據(jù)庫寫進(jìn)程:
只做一件事顿痪,將數(shù)據(jù)寫到磁盤镊辕。就是將數(shù)據(jù)庫的變化寫入到數(shù)據(jù)文件。
該進(jìn)程最多20 個蚁袭,即使你有36 個CPU 也只能最多有20 個數(shù)據(jù)庫寫進(jìn)程征懈。
進(jìn)程名稱DBW0-DBW9 DBWa-DBWj
注意:數(shù)據(jù)庫寫進(jìn)程越多,寫數(shù)據(jù)的效率越高揩悄。該進(jìn)程的個數(shù)應(yīng)該和cpu的個數(shù)對應(yīng)卖哎,如果設(shè)置的數(shù)據(jù)庫寫進(jìn)程數(shù)大于CPU 的個數(shù)也不會有太明顯的效果,因為CPU 是分時的删性。
B.檢查點(CKPT)
Checkpoint (CKPT)檢查點進(jìn)程:
主要用戶更新數(shù)據(jù)文件頭亏娜,更新控制文件和觸發(fā)DBWn數(shù)據(jù)庫寫進(jìn)程。
Ckpt 進(jìn)程會降低數(shù)據(jù)庫性能蹬挺,但是提高數(shù)據(jù)庫崩潰時维贺,自我恢復(fù)的性能。我們可以理解為階段性的保存數(shù)據(jù)巴帮,一定的條件滿足就觸發(fā)溯泣,執(zhí)行DBWn存盤操作。
C.進(jìn)程監(jiān)視進(jìn)程(PMON)
PMON在后臺進(jìn)程執(zhí)行失敗后負(fù)責(zé)清理數(shù)據(jù)庫緩存和閑置資源榕茧,是Oracle的自動維護機制垃沦。
清除死進(jìn)程 重新啟動部分進(jìn)程(如調(diào)度進(jìn)程) 監(jiān)聽的自動注冊 回滾事務(wù) 釋放鎖 釋放其他資
D.系統(tǒng)監(jiān)視進(jìn)程(SMON)
SMON啟動后會自動的用于在實例崩潰時進(jìn)行數(shù)據(jù)庫實例自動恢復(fù)。
清除作廢的排序臨時段用押,回收整理碎片肢簿,合并空閑空間,釋放臨時段蜻拨,維護閃回的時間點池充。
在老數(shù)據(jù)庫版本中,當(dāng)我們大量刪除表的時候缎讼,會觀測到SMON進(jìn)程很忙纵菌,直到把所有的碎片空間都整理完畢。
E.重做日志文件和日志寫入進(jìn)程
主要用于記錄數(shù)據(jù)庫的改變和記錄數(shù)據(jù)庫被改變之前的原始狀態(tài)休涤,所以應(yīng)當(dāng)對其作多重備份,用于恢復(fù)和排錯。
激活LGWR的情況:
提交指令 日志緩沖區(qū)超過1/3 每三秒 每次DBWn執(zhí)行之前
F.歸檔進(jìn)程(ARCn)
五.存儲結(jié)構(gòu)
Oracle RDBMS存儲結(jié)構(gòu)主要由Database組成功氨。
又能夠?qū)atabase分為物理結(jié)構(gòu)和邏輯結(jié)構(gòu)來理解序苏。
1.物理結(jié)構(gòu)
Database物理結(jié)構(gòu):是Database在操作系統(tǒng)中的文件集合,即:磁盤上的物理文件捷凄,主要由數(shù)據(jù)文件忱详、控制文件、重做日志文件跺涤、歸檔日志文件匈睁、參數(shù)文件、口令文件組成桶错。
A.Data Files
- 數(shù)據(jù)文件是數(shù)據(jù)的存儲倉庫航唆。
- 包括所有的數(shù)據(jù)庫數(shù)據(jù)
- 只能屬于一個數(shù)據(jù)庫
- 來自于被稱為”表空間”的數(shù)據(jù)庫存儲邏輯單元
- 可以直接被讀進(jìn)內(nèi)存,在執(zhí)行SQL語句的時候院刁,會將相關(guān)的數(shù)據(jù)文件副本加載如數(shù)據(jù)緩沖區(qū)糯钙。
- 通過備份策略可以使數(shù)據(jù)文件得到保護
B.Redo Log Files
重做日志文件包含對數(shù)據(jù)庫所做的更改操作記錄,在Oracle發(fā)生故障時能夠恢復(fù)數(shù)據(jù)退腥。
能夠恢復(fù)數(shù)據(jù)的原理:重做日志文件會按時間的順序任岸,將應(yīng)用于數(shù)據(jù)庫的一連串的變更向量(做了什么操作)存儲起來(即將變更的地方標(biāo)記起來)。其中包含了所有已經(jīng)完成操作的信息和完成操作之前的數(shù)據(jù)庫狀態(tài)狡刘。如果數(shù)據(jù)文件受損享潜,就可以將這些變更向量應(yīng)用于數(shù)據(jù)文件備份來進(jìn)行重做(重建)工作,將它恢復(fù)到發(fā)生故障的那一刻前的狀態(tài)嗅蔬。重做日志文件又分為下面兩種類型:
聯(lián)機重做日志文件:記錄連續(xù)的數(shù)據(jù)庫操作 歸檔日志文件Archived Log Files:用于時間點恢復(fù)剑按,當(dāng)RedoLogFiles存滿時,會對這些日志進(jìn)行歸檔備份购城,以便以后還原數(shù)據(jù)時使用吕座。
C.Control Files
控制文件包含維護和驗證數(shù)據(jù)庫完整性的必要的信息。
它記錄了聯(lián)機重做日志文件瘪板、數(shù)據(jù)文件的位置吴趴、更新的歸檔日志文件的位置。它還存儲著維護數(shù)據(jù)庫完整性所需的信息侮攀,如數(shù)據(jù)庫名锣枝。控制文件是以二進(jìn)制型式存儲的兰英,用戶無法修改控制文件的內(nèi)容撇叁。控制文件不過數(shù)MB畦贸,卻起著至關(guān)重要的作用陨闹。
D.Parameter File
實例參數(shù)文件楞捂,當(dāng)啟動oracle實例時,SGA結(jié)構(gòu)會根據(jù)此參數(shù)文件的設(shè)置內(nèi)存趋厉,后臺進(jìn)程會據(jù)此啟動寨闹。
E.Password File
用戶通過提交username/password來建立會話,Oracle根據(jù)存儲在數(shù)據(jù)字典的用戶定義對用戶名和口令進(jìn)行驗證君账。
2.邏輯結(jié)構(gòu)
表空間就是典型的Oracle邏輯結(jié)構(gòu)類型 —— 里面存放著若干的數(shù)據(jù)文件
表空間:用于存儲數(shù)據(jù)庫對象的邏輯空間繁堡,表空間是在數(shù)據(jù)庫中開辟的一個空間,用于存放數(shù)據(jù)庫的對象乡数,它是信息存儲的最大邏輯單位椭蹄,是存放數(shù)據(jù)庫文件的地方,其中數(shù)據(jù)又被存放在表空間中的數(shù)據(jù)文件中净赴。一個數(shù)據(jù)庫可以由多個表空間組成绳矩,Oracle的調(diào)優(yōu)就是通過表空間來實現(xiàn)的。(Oracle數(shù)據(jù)庫獨特的高級應(yīng)用)
表空間的作用:分類管理劫侧、批量處理; 將瑣碎的磁盤文件整合埋酬、抽象處理成為邏輯結(jié)構(gòu)烧栋。這樣更加便于我們?nèi)ス芾頂?shù)據(jù)庫写妥。
邏輯空間到物理空間的映射
六.簡述Oracle運行過程
- User訪問Oracle Server之前提交一個請求(包含了db_name审姓、instance_name珍特、username、password等信息)魔吐,Oracle Server接收到請求并通過Password File的驗證后扎筒,分配SGA內(nèi)存池,啟動后臺進(jìn)程同時創(chuàng)建并啟動實例酬姆。
- 在啟動實例之后User Process與Server Process建立Connect嗜桌。
- 再通過Server process和Oracle Instance完成建立Sesscion。
- 用戶執(zhí)行SQL語句辞色,由server process接收到并直接與Oracle交互骨宠。
- SQL語句通過Server Process到達(dá)Oracle Instance,再將SQL載入數(shù)據(jù)庫緩沖區(qū)相满。
- Server Process通知Oracle Database將與SQL語句相關(guān)的數(shù)據(jù)塊副本加載到緩沖區(qū)中层亿。
- 在數(shù)據(jù)庫緩存區(qū)執(zhí)行SQL語句,并產(chǎn)生”臟緩沖區(qū)”立美。
- 由CKPT檢查點進(jìn)程檢查到”臟緩沖區(qū)”匿又,并調(diào)用DBWn數(shù)據(jù)庫寫進(jìn)程,但在DBWn執(zhí)行之前建蹄,應(yīng)該由LGWR先將數(shù)據(jù)文件的原始狀態(tài)碌更、數(shù)據(jù)庫的改變等信息記錄到Redo Log Files裕偿。
- 將更新的內(nèi)容寫入到磁盤中的數(shù)據(jù)文件。 返回結(jié)果給用戶