|
下面是我整理(抄襲)的一些Oracle數(shù)據(jù)庫(kù)相關(guān)概念對(duì)象的理解,如有疏漏,歡迎指正。至于整理這篇文章的目的:主要是網(wǎng)上的內(nèi)容太散了,這樣整理一遍可以加深理解,也便于后續(xù)查閱。就我的理解:下述內(nèi)容應(yīng)該可對(duì)10g,11g,12c都適用。更新的版本沒用過。 Oracle DataBase是一款關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),很多時(shí)候,我們會(huì)把那個(gè)承載我們核心數(shù)據(jù)的系統(tǒng)籠統(tǒng)地成為數(shù)據(jù)庫(kù)服務(wù)器,但從嚴(yán)格意義上來講Oracle DataBase是由兩個(gè)部分組成:
其中: 數(shù)據(jù)庫(kù)指的是用戶存儲(chǔ)數(shù)據(jù)的一些物理文件,數(shù)據(jù)庫(kù) = 物理結(jié)構(gòu)+邏輯結(jié)構(gòu) 實(shí)例是數(shù)據(jù)庫(kù)啟動(dòng)時(shí)初始化的一組進(jìn)程和內(nèi)存結(jié)構(gòu),實(shí)例 = 后臺(tái)進(jìn)程 + 內(nèi)存 正因?yàn)槿绱宋覀円话悴艜?huì)說關(guān)閉和啟動(dòng)實(shí)例,加載和卸載數(shù)據(jù)庫(kù),就是這個(gè)道理。從實(shí)例和數(shù)據(jù)庫(kù)的概念上來看,我們能知道,實(shí)例是暫時(shí)的,它不過是一組邏輯劃分的內(nèi)存結(jié)構(gòu)和進(jìn)程結(jié)構(gòu),它會(huì)隨著數(shù)據(jù)庫(kù)的關(guān)閉而消失,而數(shù)據(jù)庫(kù)它其實(shí)就是一堆物理文件,它是永久存在的(除非磁盤損壞)。數(shù)據(jù)庫(kù)和實(shí)例通常是一對(duì)一的,這種結(jié)構(gòu)我們稱為單實(shí)例體系結(jié)構(gòu);當(dāng)然還有一些復(fù)雜的分布式的結(jié)構(gòu),一個(gè)數(shù)據(jù)庫(kù)可以對(duì)多個(gè)實(shí)例,像Oracle的RAC(請(qǐng)自行g(shù)oogle或者baidu),即集群模式。 下圖是對(duì)一個(gè)oracle數(shù)據(jù)庫(kù)服務(wù),更具體的結(jié)構(gòu)展示:
當(dāng)在計(jì)算機(jī)服務(wù)器上啟動(dòng)Oracle數(shù)據(jù)庫(kù)后,稱服務(wù)器上啟動(dòng)了一個(gè)Oracle實(shí)例(Instance)。Oracle 實(shí)例(Instance)是存取和控制數(shù)據(jù)庫(kù)的軟件機(jī)制,它包含系統(tǒng)全局區(qū)(SGA)和Oracle進(jìn)程兩部分。SGA是系統(tǒng)為實(shí)例分配的一組共享內(nèi)存緩沖區(qū),用于存放數(shù)據(jù)庫(kù)實(shí)例和控制信息,以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的治理和操作?! ?/div>
進(jìn)程是操作系統(tǒng)中一個(gè)極為重要的概念。一個(gè)進(jìn)程執(zhí)行一組操作,完成一個(gè)特定的任務(wù)。對(duì)Oracle數(shù)據(jù)庫(kù)治理系統(tǒng)來說,進(jìn)程由用戶進(jìn)程、服務(wù)器進(jìn)程和后臺(tái)進(jìn)程所組成。
當(dāng)用戶運(yùn)行一個(gè)應(yīng)用程序時(shí),系統(tǒng)就為它建立一個(gè)用戶進(jìn)程。服務(wù)器進(jìn)程處理與之相連的用戶進(jìn)程的請(qǐng)求,它與用戶進(jìn)程相通訊,為相連的用戶進(jìn)程的Oracle請(qǐng)求服務(wù)?! ?/div>
為了提高系統(tǒng)性能,更好地實(shí)現(xiàn)多用戶功能,Oracle還在系統(tǒng)后臺(tái)啟動(dòng)一些后臺(tái)進(jìn)程,用于數(shù)據(jù)庫(kù)數(shù)據(jù)操作。
下面具體說明Oracle數(shù)據(jù)庫(kù)的相關(guān)概念
一、Oracle數(shù)據(jù)庫(kù)實(shí)例
這一部分主要參考(抄襲):
1、 用戶與Oracle數(shù)據(jù)庫(kù)的交互流程
下面這張圖,描述了單實(shí)例體系結(jié)構(gòu)大致的交互流程
?。?)用戶和用戶進(jìn)程交互 用戶進(jìn)程可以是一般的客戶端軟件,像Oracle的sqlplus,sql developer,或者是一些驅(qū)動(dòng)程序等,都屬于用戶進(jìn)程。
?。?)用戶進(jìn)程和服務(wù)器進(jìn)程交互
服務(wù)器進(jìn)程有時(shí)會(huì)稱為前臺(tái)進(jìn)程,當(dāng)然是相對(duì)于后臺(tái)進(jìn)程(后面會(huì)提到的數(shù)據(jù)庫(kù)寫入器,日志寫入器等)來說的,服務(wù)器進(jìn)程的主要作用就是處理連接到當(dāng)前實(shí)例的用戶進(jìn)程的請(qǐng)求,對(duì)客戶端發(fā)來的sql進(jìn)行執(zhí)行并返回執(zhí)行結(jié)果。在專有服務(wù)器結(jié)構(gòu)中,用戶進(jìn)程和服務(wù)器進(jìn)程是一對(duì)一的,也就是說,當(dāng)監(jiān)聽程序監(jiān)聽到客戶端來了一個(gè)請(qǐng)求,會(huì)為其分配一個(gè)對(duì)應(yīng)的服務(wù)器進(jìn)程。還有一種結(jié)構(gòu)為共享服務(wù)器,這種結(jié)構(gòu)就不是一個(gè)用戶進(jìn)程對(duì)應(yīng)一個(gè)服務(wù)器進(jìn)程了,會(huì)通過調(diào)度程序進(jìn)行協(xié)調(diào)處理,關(guān)于共享服務(wù)器連接,本文在此就不敘述了。
(3)服務(wù)器進(jìn)程和實(shí)例進(jìn)程交互
?。?)實(shí)例和數(shù)據(jù)庫(kù)進(jìn)程交互
上面描述了一些我們?cè)谶M(jìn)行數(shù)據(jù)庫(kù)連接操作的時(shí)候,大致的交互流程是什么樣的。下面,我們就來看看Oracle 的實(shí)例內(nèi)存結(jié)構(gòu)
2.實(shí)例內(nèi)存結(jié)構(gòu)
?。ㄓ捎跀?shù)據(jù)庫(kù)寫入器和日志寫入器和內(nèi)存結(jié)構(gòu)非常相關(guān),而且非常重要,所以內(nèi)存結(jié)構(gòu)和這兩個(gè)進(jìn)程結(jié)構(gòu)會(huì)相互配合地進(jìn)行描述)
Oracle實(shí)例內(nèi)存結(jié)構(gòu)由兩部分組成:SGA(系統(tǒng)全局區(qū))和PGA(用戶全局區(qū)),SGA是一塊共享的內(nèi)存區(qū)域,也是最大的一塊內(nèi)存區(qū)域,它包含該實(shí)例的數(shù)據(jù)和控制信息。SGA在實(shí)例啟動(dòng)時(shí)被自動(dòng)分配,當(dāng)實(shí)例關(guān)閉時(shí)被收回。數(shù)據(jù)庫(kù)的所有數(shù)據(jù)操作都要通過SGA來進(jìn)行;PGA則是用戶會(huì)話專有的內(nèi)存區(qū)域,每個(gè)會(huì)話在服務(wù)器端都有一塊專有的內(nèi)存區(qū)域就是PGA。本文主要對(duì)SGA進(jìn)行分析描述。SGA組成如下:
![]() ?。?)數(shù)據(jù)庫(kù)緩沖區(qū)緩存&數(shù)據(jù)庫(kù)寫入器
緩沖區(qū)緩存(Buffer Cache)是Oracle用來執(zhí)行sql 的工作區(qū)域,在更新數(shù)據(jù)時(shí),用戶會(huì)話不會(huì)直接去更新磁盤上的數(shù)據(jù),想想,如果允許這么做,那么頻繁的磁盤IO對(duì)于系統(tǒng)性能的影響是毀滅性的。所以,實(shí)際的處理流程是這樣的:
對(duì)于一條簡(jiǎn)單的查詢語句——select ename,salary from emp where name='不二';,當(dāng)用戶提交了該條sql語句,該條sql語句會(huì)由對(duì)應(yīng)的用戶進(jìn)程(比如我們常用的sql developer)發(fā)送給服務(wù)器,監(jiān)聽程序監(jiān)聽到該條請(qǐng)求,Oracle會(huì)為其建立一個(gè)對(duì)應(yīng)的服務(wù)器進(jìn)程,然后服務(wù)器進(jìn)程會(huì)先掃描緩沖區(qū)中有沒有包含關(guān)鍵行("不二")的數(shù)據(jù)塊,如果有,這就算一次緩存命中了,然后相關(guān)行會(huì)傳輸?shù)絇GA進(jìn)行進(jìn)一步處理,最終經(jīng)過格式化后展示給用戶;如果沒有命中,那么服務(wù)器進(jìn)程會(huì)首先將對(duì)應(yīng)行復(fù)制到緩沖區(qū)內(nèi),然后再返回給客戶端。
DML(insert,update,delete)操作同理,加入用戶發(fā)送一條update語句,服務(wù)進(jìn)程依然先去掃描緩沖區(qū),如果緩存命中,則直接更新,數(shù)據(jù)變臟;如果沒有命中,由服務(wù)器進(jìn)程將對(duì)應(yīng)數(shù)據(jù)塊先從磁盤上復(fù)制到緩沖區(qū)內(nèi),再進(jìn)行更新操作。
1)臟緩沖區(qū)
如果緩沖區(qū)存儲(chǔ)的塊和磁盤上的塊不一致,該緩沖區(qū)就叫做“臟緩沖區(qū)”,臟緩沖區(qū)最終會(huì)由數(shù)據(jù)庫(kù)寫入器(DBWn)寫入到磁盤中去。
2)數(shù)據(jù)庫(kù)寫入器(DBWn)
數(shù)據(jù)庫(kù)寫入器是Oracle的一個(gè)后臺(tái)進(jìn)程,所謂后臺(tái)進(jìn)程是相對(duì)于前臺(tái)進(jìn)程(服務(wù)器進(jìn)程)來講的。DBWn的"n"意味著一個(gè)實(shí)例是可以有多個(gè)數(shù)據(jù)庫(kù)寫入器的。
作用:簡(jiǎn)而言之,DBWn的作用就是將變臟了的緩沖區(qū)從數(shù)據(jù)庫(kù)緩沖區(qū)緩存中寫入到磁盤中的數(shù)據(jù)文件中去。
數(shù)據(jù)庫(kù)緩沖區(qū)緩存這塊內(nèi)存區(qū)域和數(shù)據(jù)庫(kù)寫入器這塊是比較重要的概念,別的數(shù)據(jù)庫(kù)產(chǎn)品像mySql也都有對(duì)應(yīng)的實(shí)現(xiàn),只不過叫法不一樣罷了。了解這塊的時(shí)候,要時(shí)刻意識(shí)到會(huì)話是不會(huì)直接更新磁盤數(shù)據(jù)的,會(huì)話的更新,插入,刪除包括查詢等都是先作用到緩沖區(qū)上,隨后,DBWn會(huì)將其中的臟緩沖區(qū)轉(zhuǎn)儲(chǔ)到磁盤上去?!?/div>
3)DBWn執(zhí)行寫入的觸發(fā)條件:
DBWn是個(gè)比較懶的進(jìn)程,它會(huì)盡可能少的進(jìn)行寫入,在以下四種情況它會(huì)執(zhí)行寫入:
a.一個(gè)服務(wù)進(jìn)程在設(shè)定的時(shí)間內(nèi)沒有找到空閑塊(沒有任何可用緩沖區(qū),不得不寫啊)
b.臟緩沖區(qū)過多
c.3秒超時(shí)(每3秒自動(dòng)喚醒一次)
d.遇到檢查點(diǎn),即checkPoint(檢查點(diǎn)),檢查點(diǎn)是個(gè)Oracle事件,遇到檢查點(diǎn),DBWn會(huì)執(zhí)行寫入。比如實(shí)例有序關(guān)閉的時(shí)候會(huì)有檢查點(diǎn),DBWn會(huì)將所有臟緩沖區(qū)寫入到磁盤上去的,這很容易理解,要保持?jǐn)?shù)據(jù)文件的一致性。
4)注意:
從上述DBWn的幾個(gè)寫入時(shí)機(jī),我們能意識(shí)到,DBWn的寫入不是直接依賴于會(huì)話的更新操作的。不是一有臟緩沖區(qū),它就執(zhí)行寫入。而且,DBWn執(zhí)行寫入跟commit操作也沒有任何關(guān)系,不要以為commit操作的影響結(jié)果會(huì)實(shí)時(shí)流入到磁盤中去。
DBWn采用極懶算法進(jìn)行寫入,原因我們應(yīng)該要清楚:頻繁的磁盤IO對(duì)系統(tǒng)的壓力很大,如果DBWn很積極地去寫入磁盤,那對(duì)系統(tǒng)性能的影響就太大了,換個(gè)角度想,如果DBWn很勤快的寫磁盤,那么數(shù)據(jù)庫(kù)緩沖區(qū)存在的意義也就不大了。
當(dāng)然,講到這兒,我們可能會(huì)意識(shí)到一個(gè)問題,DBWn如此懶地進(jìn)行數(shù)據(jù)轉(zhuǎn)儲(chǔ),如果在某一時(shí)刻,數(shù)據(jù)庫(kù)緩沖區(qū)緩存內(nèi)存在著大量的臟緩沖區(qū)(生產(chǎn)環(huán)境中,這是常態(tài)),也就是有大量的未commit和已commit的數(shù)據(jù)還在內(nèi)存中,沒有持久化到磁盤中,然后突然系統(tǒng)斷電了,這種情況下,數(shù)據(jù)是不是就丟掉了?數(shù)據(jù)當(dāng)然不會(huì)丟失,這就引出了重做日志(redo log)的概念,接下來,我們就來談?wù)剬?duì)應(yīng)重做日志的內(nèi)存結(jié)構(gòu)和后臺(tái)進(jìn)程。
(2) 日志緩沖區(qū)&日志寫入器
當(dāng)我們執(zhí)行一些DML操作(insert,update,delete),數(shù)據(jù)塊發(fā)生改變了,產(chǎn)生的變更向量則會(huì)寫入到重做日志文件中去。有了這些記錄,當(dāng)系統(tǒng)由于斷電等因素突然宕掉,數(shù)據(jù)庫(kù)緩沖區(qū)緩存內(nèi)的大量臟數(shù)據(jù)還沒來得及寫入到數(shù)據(jù)文件中去,在重新啟動(dòng)的時(shí)候,會(huì)有一個(gè)實(shí)例恢復(fù)的過程,在此過程中就應(yīng)用了重做日志記錄來使數(shù)據(jù)保持一致;或者數(shù)據(jù)庫(kù)遭遇了物理損壞,比如磁盤損壞了,此時(shí)可以通過Oracle的備份恢復(fù)工具(如RMAN)進(jìn)行數(shù)據(jù)恢復(fù),原理就是:提取備份集-->應(yīng)用重做日志文件中的變更記錄。
1)日志緩沖區(qū)(log buffer)
日志緩沖區(qū)是一塊比較小的內(nèi)存區(qū)域,它是用來短期存儲(chǔ),即將寫入到磁盤的重做日志文件中的變更向量。
日志緩沖區(qū)存在的意義依然是為了減少磁盤IO,減少用戶的等待時(shí)間,試想下,如果每一次用戶DML操作都要進(jìn)行等待重做記錄被寫入到磁盤中去,體驗(yàn)會(huì)有多差勁。
2)日志寫入器(LGWR)
作用:日志寫入器(LGWR)就是把日志緩沖區(qū)(log buffer)內(nèi)的內(nèi)容寫入到聯(lián)機(jī)的磁盤的重做日志文件中去,釋放log用戶buffer空間。相比數(shù)據(jù)庫(kù)寫入器(DBWn),日志寫入器就勤快多了。
3)LGWR執(zhí)行寫入的觸發(fā)條件:
a.commit時(shí)寫入
前面提過,DBWn的寫入和commit沒有任何關(guān)系,如果commit時(shí)數(shù)據(jù)庫(kù)沒有任何記錄,那數(shù)據(jù)就真的丟失了,Oracle 的重做日志就是為了保證數(shù)據(jù)安全而存在的,用戶commit時(shí)(在oracle中稱為快速提交機(jī)制(fast commit):把redo log buffer中的記錄寫入日志文件,寫入一條提交的記錄),會(huì)話會(huì)先掛起,等待LGWR將這些記錄寫入到磁盤上的重做日志文件中,才會(huì)通知用戶提交完成。所以,LGWR在commit時(shí)執(zhí)行寫入,是為了確保事務(wù)永不丟失。
b.3秒超時(shí)(每3秒自動(dòng)喚醒一次)
c.日志緩沖區(qū)的占用率達(dá)到1/3,或日志數(shù)量超過1M。
d.DBWR進(jìn)程觸發(fā):DBWn將臟緩沖區(qū)寫入磁盤前,先檢測(cè)他的相關(guān)redo記錄是否寫入聯(lián)機(jī)日志文件,如果沒有就通知LGWR進(jìn)程。在Oracle中稱為提前寫機(jī)制(write ahead):redo記錄先于數(shù)據(jù)記錄被寫入磁盤。這個(gè)寫入是為了數(shù)據(jù)回滾考慮的。DBWn完全可能寫入還沒提交的事務(wù)(參照上面提到的寫入時(shí)機(jī)),那如何保證事務(wù)回滾呢?(注:DBWR全稱是Database Writer Process,屬于Oracle后臺(tái)進(jìn)程的一種,有的地方也叫DBWn,我想這里是出于DBWR進(jìn)程個(gè)數(shù)的原因,DBWR進(jìn)程在一個(gè)Oracle Server中可以最多有20個(gè)。本文聚合了很多篇文章,如果遇到DBWR和DBWn,請(qǐng)做同一名詞處理)
首先要知道,DBWn除了寫入實(shí)際的數(shù)據(jù),還會(huì)寫入撤銷數(shù)據(jù)(可以參考:Oracle閃回技術(shù))簡(jiǎn)單說,事務(wù)回滾需要撤銷數(shù)據(jù),在寫入撤銷數(shù)據(jù)前,會(huì)先寫入針對(duì)撤銷數(shù)據(jù)的日志記錄(有點(diǎn)繞),若用戶要進(jìn)行事務(wù)回滾,就可以應(yīng)用這些日志記錄來構(gòu)造撤銷數(shù)據(jù),然后進(jìn)行回滾。
我們對(duì)這兩塊最重要的內(nèi)存區(qū)域和對(duì)應(yīng)的后臺(tái)進(jìn)程做個(gè)總結(jié):
數(shù)據(jù)庫(kù)緩沖區(qū)緩存和日志緩沖區(qū)都是為了提高性能,避免頻繁IO而存在的。日志緩沖區(qū)相比數(shù)據(jù)庫(kù)緩沖區(qū)緩存要小的多,并且不能進(jìn)行自動(dòng)管理,對(duì)于日志緩沖區(qū)的修改需要重啟實(shí)例,數(shù)據(jù)庫(kù)緩沖區(qū)緩存可進(jìn)行自動(dòng)管理。作用在數(shù)據(jù)庫(kù)緩沖區(qū)緩存上的DBWn進(jìn)程,為了避免頻繁的磁盤IO導(dǎo)致系統(tǒng)性能下降,會(huì)盡可能少地執(zhí)行寫入,且DBWn的寫入和commit操作沒有任何關(guān)系;
而作用在日志緩沖區(qū)上的LGWR進(jìn)程,則會(huì)非常積極地進(jìn)行寫入,一般情況下,它幾乎是實(shí)時(shí)地將重做日志記錄轉(zhuǎn)儲(chǔ)到磁盤中去。LGWR是Oracle體系結(jié)構(gòu)中最大的瓶頸之一。DML的速度不可能超過LGWR將變更向量寫入磁盤的速度。
?。?)共享池
共享池包含共享SQL區(qū)和數(shù)據(jù)字典存儲(chǔ)區(qū)。共享SQL區(qū)包含執(zhí)行特定的SQL語句所用的信息。數(shù)據(jù)字典區(qū)用于存放數(shù)據(jù)字典,它為所有用戶進(jìn)程所共享。
它是最復(fù)雜的SGA結(jié)構(gòu),它有許多子結(jié)構(gòu),我們來看看常見的幾個(gè)共享池組件:
1)庫(kù)緩存:庫(kù)緩存這塊內(nèi)存區(qū)域會(huì)按已分析的格式緩存最近執(zhí)行的代碼,這樣,同樣的sql代碼多次執(zhí)行的時(shí)候,就不用重復(fù)地去進(jìn)行代碼分析,可以很大程度上提高系統(tǒng)性能。
2)數(shù)據(jù)字典緩存:存儲(chǔ)oracle中的對(duì)象定義(表,視圖,同義詞,索引等數(shù)據(jù)庫(kù)對(duì)象),這樣在分析sql代碼的時(shí)候,就不用頻繁去磁盤上讀取數(shù)據(jù)字典中的數(shù)據(jù)了
3)PL/SQL區(qū):緩存存儲(chǔ)過程、函數(shù)、觸發(fā)器等數(shù)據(jù)庫(kù)對(duì)象,這些對(duì)象都存儲(chǔ)在數(shù)據(jù)字典中,通過將其緩存到內(nèi)存中,可以在重復(fù)調(diào)用的時(shí)候提高性能。
?。?)大池
大池是個(gè)可選的內(nèi)存區(qū)域,前面我們提到專有服務(wù)器連接和共享服務(wù)器連接,如果數(shù)據(jù)庫(kù)采用了共享服務(wù)器連接模式,則要使用到大池;RMAN(Oracle的高級(jí)備份恢復(fù)工具)備份數(shù)據(jù)也需要大池。
?。?) JAVA池
Oracle 的很多選項(xiàng)使用java寫的,Java池用作實(shí)例化Java對(duì)象所需的堆空間
?。?)流池
從重做日志中提取變更記錄的進(jìn)程和應(yīng)用變更記錄的進(jìn)程會(huì)用到流池(如實(shí)例不正常關(guān)閉,譬如斷電導(dǎo)致實(shí)例關(guān)閉,在重啟時(shí),Oracle會(huì)自動(dòng)執(zhí)行實(shí)例恢復(fù)過程,在此過程需要提取重做日志記錄和應(yīng)用重做日志兩個(gè)動(dòng)作)
以上列舉了Oracle常見的內(nèi)存結(jié)構(gòu),要注意的是,上面列舉的內(nèi)存區(qū)域,除了日志緩沖區(qū)是固定的,不能動(dòng)態(tài)調(diào)整也不能進(jìn)行自動(dòng)管理外,其他內(nèi)存區(qū)域都可以進(jìn)行動(dòng)態(tài)調(diào)整,也可以進(jìn)行自動(dòng)管理。
3.實(shí)例進(jìn)程結(jié)構(gòu)
oracle中的進(jìn)程共分為三類:用戶進(jìn)程、服務(wù)進(jìn)程、后臺(tái)進(jìn)程。其中后臺(tái)進(jìn)程伴隨實(shí)例的啟動(dòng)而啟動(dòng),他們主要是維護(hù)數(shù)據(jù)庫(kù)的穩(wěn)定,相當(dāng)于一個(gè)企業(yè)中的管理者及內(nèi)部服務(wù)人員。他們并不會(huì)直接給用戶提供服務(wù)。
下面說說Oracle 的比較常見的后臺(tái)進(jìn)程,不是所有的進(jìn)程。(DBWn和LGWR較重要,前面已做了了解,在此不再展開)其中DBWn,ARCn可以設(shè)置數(shù)據(jù)庫(kù)啟動(dòng)時(shí)的數(shù)量。這些進(jìn)程在系統(tǒng)中可以不止一個(gè)。
?。?)DBWn 數(shù)據(jù)庫(kù)寫進(jìn)程:數(shù)據(jù)庫(kù)緩沖區(qū)的治理進(jìn)程。(請(qǐng)參考上面的“數(shù)據(jù)庫(kù)緩沖區(qū)緩存&數(shù)據(jù)庫(kù)寫入器”中的描述)
在它的治理下,數(shù)據(jù)庫(kù)緩沖區(qū)中總保持有一定數(shù)量的自由緩沖塊,以確保用戶進(jìn)程總能找到供其使用的自由緩沖塊。
(2)LGWR 日志文件寫進(jìn)程:(請(qǐng)參考上面的“日志緩沖區(qū)&日志寫入器”中的描述)
是日志緩沖區(qū)的治理進(jìn)程,負(fù)責(zé)把日志緩沖區(qū)中的日志項(xiàng)寫入磁盤中的日志文件上。每個(gè)實(shí)例只有一個(gè)LGWR進(jìn)程。
(3)SMON(System Monitor):安裝和打開數(shù)據(jù)庫(kù),負(fù)責(zé)完成自動(dòng)實(shí)例恢復(fù)和回收分類(sort)表空間。
作用:
a.負(fù)責(zé)實(shí)例恢復(fù),前滾(Roll Forward)恢復(fù)到實(shí)例關(guān)閉的狀態(tài),使用最后一次檢查點(diǎn)后的日志進(jìn)程重做。這時(shí)包括提交和未提交的事務(wù)。打開數(shù)據(jù)庫(kù),進(jìn)行回滾(Roll Back):回滾未提交的事務(wù)。(oracle承諾commit之后數(shù)據(jù)不會(huì)丟失,現(xiàn)在我們可以大致的了解是如何實(shí)現(xiàn)這個(gè)承諾,以及在數(shù)據(jù)的安全性和數(shù)據(jù)庫(kù)性能之間的平衡選擇。)
b.負(fù)責(zé)清理臨時(shí)段,以釋放空間
觸發(fā)條件:定期被喚醒或者被其他事務(wù)主動(dòng)喚醒。
?。?)PMON(Process Monitor):進(jìn)程監(jiān)視器,主要監(jiān)視服務(wù)器進(jìn)程。前面提到過,專有服務(wù)器體系模式下,用戶進(jìn)程和服務(wù)器進(jìn)程是一對(duì)一的關(guān)系,如果某個(gè)會(huì)話發(fā)生異常,PMON會(huì)銷毀對(duì)應(yīng)的服務(wù)器進(jìn)程,回滾未提交的事務(wù),并回收會(huì)話專有的PGA內(nèi)存區(qū)域。
作用:
a.發(fā)現(xiàn)用戶進(jìn)程異常終止,并進(jìn)行清理。釋放占用資源。(清理異常終止用戶使用的鎖)
b.向監(jiān)聽程序動(dòng)態(tài)的注冊(cè)實(shí)例。
觸發(fā)條件:定時(shí)被喚醒,其他進(jìn)程也會(huì)主動(dòng)喚醒它。
?。?)CKPT(Checkpoint Process):CKPT負(fù)責(zé)發(fā)起檢查點(diǎn)信號(hào),手動(dòng)設(shè)置檢查點(diǎn)的語法:
1 alter system checkpoint;
檢查點(diǎn)可強(qiáng)制DBWn寫入臟緩沖區(qū),當(dāng)數(shù)據(jù)庫(kù)崩潰后,由于大量臟緩沖區(qū)未寫入數(shù)據(jù)文件,在重新啟動(dòng)時(shí),需要由SMON進(jìn)行實(shí)例恢復(fù),實(shí)例恢復(fù)需要提取和應(yīng)用重做日志記錄,提取的位置就是從上次檢查點(diǎn)發(fā)起的位置開始的(檢查點(diǎn)之前的數(shù)據(jù)已經(jīng)被強(qiáng)制寫入到數(shù)據(jù)文件中去了),這個(gè)位置稱為RBA(redo byte address),CKPT會(huì)不斷將這個(gè)位置更新到控制文件中去(以確定實(shí)例恢復(fù)需要從哪兒開始提取日志記錄)。
觸發(fā)條件:日志切換(log switch)會(huì)觸發(fā)檢查點(diǎn)。
?。?)MMON(Manageability Monitor)--AWR主要的進(jìn)程
數(shù)據(jù)庫(kù)的自我監(jiān)視和自我調(diào)整的支持進(jìn)程。實(shí)例在運(yùn)行中,會(huì)收集大量有關(guān)實(shí)例活動(dòng)和性能的統(tǒng)計(jì)數(shù)據(jù),這些數(shù)據(jù)會(huì)收集到SGA中,MMON定期從SGA中捕獲這些統(tǒng)計(jì)數(shù)據(jù),并將其寫入到數(shù)據(jù)字典中,便于后續(xù)對(duì)這些快照進(jìn)行分析。(默認(rèn)情況,MMON每隔一個(gè)小時(shí)收集一次快照)
作用:
a.收集AWR必須的統(tǒng)計(jì)數(shù)據(jù),把統(tǒng)計(jì)數(shù)據(jù)寫入磁盤。10g中保存在SYSAUX表空間中。
b.生成server--generated報(bào)警
觸發(fā)條件:每小時(shí)把shared pool中的統(tǒng)計(jì)信息寫入磁盤,或者shared pool占用超過15%。
?。?)ARCn(archiver process)
歸檔進(jìn)程,這個(gè)進(jìn)程是可選的,如果數(shù)據(jù)庫(kù)配置為歸檔模式,這個(gè)進(jìn)程就是必須的。所謂歸檔,就是將重做日志文件永久保存(生產(chǎn)庫(kù)一般都會(huì)配置為歸檔模式)到歸檔日志文件中。歸檔日志文件和重做日志文件作用是一樣的,只不過重做日志文件會(huì)不斷被重寫,而歸檔日志文件則保留了關(guān)于數(shù)據(jù)更改的完整的歷史記錄。
作用:發(fā)生日志切換時(shí)把寫滿的聯(lián)機(jī)日志文件拷貝到歸檔目錄中。
觸發(fā)條件:日志切換時(shí)被LGWR喚醒。
設(shè)置:LOG_ARCHIVE_MAX_PROCESSES可以設(shè)置oracle啟動(dòng)的時(shí)候ARCn的個(gè)數(shù)。
(8)manageability monitor light(MMNL):輕量級(jí)的MMON
?。?)memory manager(MMAN):自動(dòng)內(nèi)容管理
作用:每分鐘都檢查AWR性能信息,并根據(jù)這些信息來決定SGA組件最佳分布。
設(shè)置:STATISTICS_LEVEL:統(tǒng)計(jì)級(jí)別
SGA_TARGET:SGA總大小
?。?0)job queue coordinator(CJQ0):數(shù)據(jù)庫(kù)定時(shí)任務(wù)
?。?1)recover writer(RVWR):作用是為flashback database提供日志記錄。把數(shù)據(jù)塊的前鏡像寫入日志。
?。?2)change tarcking writer(CTWR): 作用是跟蹤數(shù)據(jù)塊的變化,把數(shù)據(jù)塊地址記錄到 change_tracking file文件中。RMAN的增量備份將使用這個(gè)文件來確定那些數(shù)據(jù)塊發(fā)生了變化,并進(jìn)行備份。
(13)LCKn 封鎖進(jìn)程:用于并行服務(wù)器系統(tǒng),主要完成實(shí)例之間的封鎖
4.總結(jié):
至此,Oracle基礎(chǔ)的內(nèi)存結(jié)構(gòu)和進(jìn)程結(jié)構(gòu)我們已大概了解,來看下完成的進(jìn)程和內(nèi)存的交互情況,可以根據(jù)前面的理解將整個(gè)交互流程串聯(lián)一下。
![]() 二、Oracle數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu)
這一部分主要參考(抄襲):
根據(jù)上文描述,Oracle數(shù)據(jù)庫(kù)服務(wù),由實(shí)例+數(shù)據(jù)庫(kù)構(gòu)成。上面講了實(shí)例,下面開始介紹數(shù)據(jù)庫(kù)對(duì)象(存儲(chǔ)結(jié)構(gòu)——邏輯結(jié)構(gòu)和物理結(jié)構(gòu))
Oracle數(shù)據(jù)庫(kù)的存儲(chǔ)結(jié)構(gòu)可以分為邏輯存儲(chǔ)結(jié)構(gòu)和物理存儲(chǔ)結(jié)構(gòu),對(duì)于這兩種存儲(chǔ)結(jié)構(gòu),Oracle是分別進(jìn)行管理的。
邏輯存儲(chǔ)結(jié)構(gòu):Oracle內(nèi)部的組織和管理數(shù)據(jù)的方式。
物理存儲(chǔ)結(jié)構(gòu):Oracle外部(操作系統(tǒng))組織和管理數(shù)據(jù)的方式——真實(shí)存儲(chǔ)數(shù)據(jù)的地方。
![]() 1.邏輯存儲(chǔ)結(jié)構(gòu):
Oracle在邏輯上將保存的數(shù)據(jù)劃分為一個(gè)個(gè)小單元來進(jìn)行存儲(chǔ)和維護(hù),更高一級(jí)的邏輯存儲(chǔ)結(jié)構(gòu)都是由這些基本的小單元組成的。
邏輯結(jié)構(gòu)類型按照尺寸從小到大分可分為:塊(block)-->區(qū)(extent)-->段(segment)-->表空間(tablespace)。
圖示如下:
![]() 我們可以用下面的比喻來描述邏輯結(jié)構(gòu)關(guān)系:
塊 :一張張白紙 ---> 區(qū):白紙組成的本子---> 段:多個(gè)本子放到一個(gè)文件袋中---> 表空間:文件柜(存放多個(gè)文件袋)
下面對(duì)每一個(gè)概念具體介紹:
?。?)塊(block):
Oracle用來管理存儲(chǔ)的最小單元,也是最小的邏輯存儲(chǔ)結(jié)構(gòu)。Oracle數(shù)據(jù)庫(kù)在進(jìn)行輸入輸出時(shí),都是以塊為單位進(jìn)行讀寫操作的。塊的大小由參數(shù)DB_BLOCK_SIZE設(shè)置,不同的Oracle版本DB_BLOCK_SIZE的默認(rèn)值是不同的。我們建議數(shù)據(jù)塊的尺寸為操作系統(tǒng)塊尺寸的整數(shù)倍(1、2、4等)。另外,塊的大小是在創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候決定的,之后不能修改。當(dāng)然,oracle同時(shí)也支持不同的表空間擁有不同的數(shù)據(jù)塊尺寸。下面,我們對(duì)塊的結(jié)構(gòu)進(jìn)行一些介紹。
1)塊的頭部信息區(qū):
塊頭:包含塊的一般屬性信息,如,塊的物理地址、塊所屬的段的類型
表目錄:如果塊中存儲(chǔ)的數(shù)據(jù)是表數(shù)據(jù), 則在表目錄中保存塊中所包含的表的相關(guān)信息
行目錄:行記錄的相關(guān)信息 如,ROWID
2)塊的存儲(chǔ)區(qū):主要包含空閑空間和已經(jīng)使用的空間。Oracle主要是通過下面的兩個(gè)參數(shù)對(duì)這部分空間進(jìn)行管理的
注意:以上兩個(gè)參數(shù)(PCTFREE、PCTUSED)既可以在表空間級(jí)別進(jìn)行設(shè)置,也可以在段級(jí)別進(jìn)行設(shè)置。段級(jí)別的設(shè)置優(yōu)先級(jí)更高。
?。?)區(qū)(extent):
比塊高一級(jí)的邏輯存儲(chǔ)結(jié)構(gòu),由連續(xù)的塊組成,它是oracle在進(jìn)行存儲(chǔ)空間的分配和回收的最小單位(區(qū)是磁盤分配的最小單位)。在創(chuàng)建具有獨(dú)立段結(jié)構(gòu)的數(shù)據(jù)庫(kù)對(duì)象時(shí),例如表、索引等,Oracle會(huì)為數(shù)據(jù)庫(kù)對(duì)象創(chuàng)建一個(gè)數(shù)據(jù)段,并為數(shù)據(jù)段分配一個(gè)'初始區(qū)’。后續(xù)區(qū)的分配方式,則根據(jù)表的空間管理辦法不同,而采用不同的分配方式,例如autoextent,uniform size 或者在創(chuàng)建表或表空間時(shí)設(shè)置default storage 子句。另外,用戶還能夠通過執(zhí)行下面的命令來回收表、索引等對(duì)象中未使用的區(qū):
1 -- 相關(guān)表:DBA_EXTENTS 、USER_EXTENTS 2 select * from dba_extents; 3 select * from user_extents; 4 5 --回收表、索引等對(duì)象中未使用的區(qū) 6 alter table table_name deallocate unused; ?。?)段(segment):
由多個(gè)區(qū)組成,這些區(qū)可以是連續(xù)的,也可以是不連續(xù)的。當(dāng)用戶在數(shù)據(jù)庫(kù)中創(chuàng)建各種具有實(shí)際存儲(chǔ)結(jié)構(gòu)的對(duì)象時(shí)(保存有數(shù)據(jù)的對(duì)象),比如表、索引等,Oracle將為這些對(duì)象創(chuàng)建“段”。 一般一個(gè)對(duì)象只擁有一個(gè)段。在創(chuàng)建段時(shí),可以為它指定PCTFREE、PCTUSED等參數(shù)來控制其中的塊的存儲(chǔ)空間管理方式,也可以為它指定INITIAL、NEXT、PCTINCREASE等存儲(chǔ)參數(shù),以指定其中區(qū)的分配方式。如果沒有為段指定這些參數(shù),段將自動(dòng)繼承表空間的相應(yīng)參數(shù)。不同類型的數(shù)據(jù)庫(kù)對(duì)象擁有不同類型的段:
概括來說:每建立一張表,往往對(duì)應(yīng)一個(gè)段,如果是分區(qū)表,那么各個(gè)分區(qū)又獨(dú)立成段。在表上建一個(gè)索引,則又會(huì)有一個(gè)對(duì)應(yīng)的索引段。
1 --相關(guān)表:DBA_SEGMENTS 、 USER_SEGMENTS 2 select * from dba_segments; 3 select * from user_segments; (4)表空間(tablespace):
最高級(jí)的邏輯存儲(chǔ)結(jié)構(gòu),一個(gè)Oracle數(shù)據(jù)庫(kù)是由多個(gè)表空間組成的, 但一個(gè)表空間只隸屬于一個(gè)數(shù)據(jù)庫(kù),一個(gè)表空間可以有多數(shù)據(jù)文件,但是一個(gè)數(shù)據(jù)文件只能屬于一個(gè)表空間。一個(gè)表空間就是一片磁盤區(qū)域,他由一個(gè)或者多個(gè)磁盤文件組成,一個(gè)表空間可以容納許多表、索引或者簇等。每個(gè)表空間有一個(gè)預(yù)制的磁盤區(qū)域稱為初始區(qū)間(initial extent)用完這個(gè)區(qū)間后再用下一個(gè),直到用完表空間,這時(shí)候需要對(duì)表空間進(jìn)行擴(kuò)展,增加數(shù)據(jù)文件或者擴(kuò)大已經(jīng)存在的數(shù)據(jù)文件。在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)會(huì)自動(dòng)創(chuàng)建一些默認(rèn)的表空間,例如 SYSTEM表空間,SYSAUX表空間等。通過使用表空間,Oracle將所有相關(guān)的邏輯結(jié)構(gòu)和對(duì)象組合在一起。我們可以在表空間級(jí)別指定存儲(chǔ)參數(shù),也可以在段級(jí)別指定。下面我們列出常見的表空間,和他們所存儲(chǔ)的信息:
1)事務(wù)回滾,我們對(duì)數(shù)據(jù)進(jìn)行DML操作的時(shí)候,如果撤銷修改,就會(huì)通過undo表空間記錄的修改前數(shù)據(jù)把數(shù)據(jù)恢復(fù)到修改前。有些存儲(chǔ)過程中通過exception捕捉異常的時(shí)候經(jīng)常會(huì)有一句rollback,也是這個(gè)作用,對(duì)當(dāng)前事務(wù)的數(shù)據(jù)操作進(jìn)行回滾恢復(fù)。
2)數(shù)據(jù)庫(kù)恢復(fù),數(shù)據(jù)庫(kù)異常關(guān)閉,重新啟動(dòng)的時(shí)候依據(jù)undo表空間的記錄回退未提交的事務(wù),將數(shù)據(jù)庫(kù)恢復(fù)。
3)讀一致性,在一個(gè)會(huì)話操作數(shù)據(jù)未提交的時(shí)候,通過undo表空間保證其他人訪問的數(shù)據(jù)的一致性(就是未修改的樣子)。
4)閃回查詢,這是個(gè)很有趣的功能??梢圆榭茨硞€(gè)時(shí)間點(diǎn)時(shí)候的數(shù)據(jù),經(jīng)常,算了,也不經(jīng)常,主要用于誤操作、誤刪數(shù)據(jù)等的恢復(fù)。
綜上所述,這些東西日常來說基本都不用管。
表空間的模式,也可以稱為狀態(tài),可以設(shè)置表空間的online(聯(lián)機(jī))或者offline(脫機(jī)),Read/write(讀/寫) 或者 Read-only(只讀)
表空間可以自動(dòng)或手動(dòng)脫機(jī)。例如,您可以將表空間脫機(jī),以進(jìn)行維護(hù)或備份與恢復(fù)。數(shù)據(jù)庫(kù)在遇到某些錯(cuò)誤時(shí)會(huì)自動(dòng)將一個(gè)表空間脫機(jī),比如數(shù)據(jù)庫(kù)寫進(jìn)程 (DBWn)多次試圖寫入數(shù)據(jù)文件但均遭遇失敗時(shí)。當(dāng)用戶試圖訪問一個(gè)脫機(jī)表空間中的表時(shí),將收到一個(gè)錯(cuò)誤。
※安裝Oracle時(shí),表空間的一些默認(rèn)配置:
1)Oracle Database 11g r2在用dbca數(shù)據(jù)庫(kù)管理助手創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候,默認(rèn)會(huì)創(chuàng)建三個(gè)永久表空間(SYSTEM、SYSAUX、USERS),一個(gè)臨時(shí)表空間(TEMP),一個(gè)撤銷表空間(UNDOTBS1)。
2)Oracle數(shù)據(jù)庫(kù)有幾個(gè)缺省表空間,其中SYSTEM和SYSAUX 表空間是一個(gè)Oracle數(shù)據(jù)庫(kù)必須有的。系統(tǒng)必須表空間是SYSTEM,SYSAUX,TEMP,UNDOTBS1
※各類表空間的操作方法,以及實(shí)踐:
1)查詢表空間
1 select * from dba_tablespaces;
2)創(chuàng)建數(shù)據(jù)表空間
1 CREATE TABLESPACE "ts_test" --表空間名WEIXIN 2 LOGGING --啟動(dòng)重做日志 3 DATAFILE 'D:\app\oradata\orcl\ts_test.dbf' --指定對(duì)應(yīng)的數(shù)據(jù)文件,可以一個(gè)或者多個(gè) 4 SIZE 512M --數(shù)據(jù)文件大小 5 AUTOEXTEND ON --數(shù)據(jù)文件自動(dòng)擴(kuò)展 6 NEXT 1024K --一次擴(kuò)展的大小 7 MAXSIZE UNLIMITED --數(shù)據(jù)文件最大容量:無限 8 EXTENT MANAGEMENT LOCAL --表空間本地管理 9 SEGMENT SPACE MANAGEMENT AUTO ; --存儲(chǔ)管理方式,AUTO為自動(dòng)方式 3)創(chuàng)建臨時(shí)表空間
1 CREATE TEMPORARY TABLESPACE tmp_ts_test 2 TEMPFILE 'D:\app\oradata\orcl\tmp_ts_test.DBF' 3 SIZE 100M; 4)回滾段表空間
1 create undo tablespace undo_ts_test 2 datafile 'D:\app\oradata\orclundo_ts_test.DBF' 3 size 100M; 5)新建用戶,并將先前建的表空間 ts_test 和臨時(shí)表空間 tmp_ts_test 作為testuser用戶的默認(rèn)使用空間。
1 --創(chuàng)建新用戶,同時(shí)指定表空間和臨時(shí)表空間 2 CREATE USER testuser --創(chuàng)建用戶testuser 3 PROFILE "DEFAULT" --忽略對(duì)profile中的一些資源限制(什么鬼,不明白) 4 IDENTIFIED BY "pwd123456" --密碼為weixin 5 default tablespace ts_test --默認(rèn)表空間ts_test,即數(shù)據(jù)默認(rèn)存此表空間 6 temporary tablespace tmp_ts_test --臨時(shí)表空間 7 QUOTA 500m ON ts_test --用戶在表空間中的限額 8 ACCOUNT UNLOCK; --解鎖用戶 9 10 --通常建完用戶后會(huì)給用戶授予一些基本的權(quán)限 11 Grant connect, resource to testuser; 12 13 --或者直接給用戶賦予dba權(quán)限(只是測(cè)試,生產(chǎn)請(qǐng)不要這么做) 14 --with admin option 表示在獲得權(quán)限的同時(shí)也獲得了將這個(gè)權(quán)限授予其他用戶的能力。 15 GRANT "DBA" TO "testuser" WITH ADMIN OPTION; oracle的安全策略方面默認(rèn)一個(gè)用戶的密碼有效期為180天,我們可以直接把這個(gè)有效期調(diào)成永久。
1 ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
6)如果表空間不足,可以有兩種方法:
第一種,增加數(shù)據(jù)文件:
1 ALTER TABLESPACE ts_test(表空間名) 2 ADD DATAFILE '......'(數(shù)據(jù)文件全路徑名) 3 SIZE 1000M; 第二種,把表空間設(shè)置為自動(dòng)擴(kuò)展:
1 ALTER DATABASE DATAFILE '.......'(數(shù)據(jù)文件全路徑名) 2 autoextend on; (在創(chuàng)建表空間時(shí),就可以加上這個(gè)關(guān)鍵字,表示該表空間自動(dòng)擴(kuò)展) 7)刪除表空間
1 drop tablespace ts_test 2 including contents and datafile; 如果表空間有數(shù)據(jù),不增加 including contents 將無法刪除成功,增加 and datafiles 關(guān)鍵字在linux 及 unix 下可自動(dòng)刪除數(shù)據(jù)文件,而在windows 環(huán)境下需要手動(dòng)刪除
8)UNDO 表空間和 TEMP 表空間在數(shù)據(jù)庫(kù)建好是必然已經(jīng)創(chuàng)建好了,不過,它們都可以新建,并且用戶都可以指定新建的空間。
9)oracle 可以為不同的用戶指定不同的臨時(shí)表空間,而且可以為同一用戶的不同session 設(shè)置不同的臨時(shí)表空間(臨時(shí)表空間組),從而減緩IO 競(jìng)爭(zhēng)。
2. oracle物理存儲(chǔ)結(jié)構(gòu):
Oracle數(shù)據(jù)庫(kù)邏輯上由一個(gè)或多個(gè)表空間組成,每個(gè)表空間在物理上由一個(gè)或多個(gè)數(shù)據(jù)文件組成,而每個(gè)數(shù)據(jù)文件由數(shù)據(jù)塊構(gòu)成的。所以,邏輯上數(shù)據(jù)存放在表空間中,而物理上存儲(chǔ)在表空間所對(duì)應(yīng)的數(shù)據(jù)文件中。我們可以用這張圖來描述數(shù)據(jù)文件和表空間的關(guān)系。
![]() 或者用下面這張圖理解下:
![]() (1)構(gòu)成Oracle數(shù)據(jù)庫(kù)物的物理文件組織結(jié)構(gòu):
![]() ※基礎(chǔ)文件:
1)控制文件:
控制文件雖小,但作用重大,它存放數(shù)據(jù)庫(kù)的基本信息。它包含指向數(shù)據(jù)庫(kù)其余部分的指針(包括重做日志文件,數(shù)據(jù)文件,歸檔日志文件等的位置),存儲(chǔ)重要的序列號(hào)和時(shí)間戳,存儲(chǔ)RMAN備份的詳細(xì)信息??刂莆募坏┦軗p,那實(shí)例會(huì)立馬終止,一般對(duì)控制文件的保護(hù)采用多路復(fù)用機(jī)制,就是冗余多份在不同物理位置。
2)重做日志文件
重做日志文件的作用為:存放對(duì)數(shù)據(jù)的改變,重做日志按時(shí)間順序存儲(chǔ)應(yīng)用于數(shù)據(jù)庫(kù)的一連串的變更向量(包含聯(lián)機(jī)重做日志文件和歸檔日志文件)。由SMON在數(shù)據(jù)庫(kù)啟動(dòng)時(shí)自動(dòng)執(zhí)行的實(shí)例恢復(fù)和磁盤損壞所要求的提取備份恢復(fù)都會(huì)應(yīng)用到重做日志進(jìn)行相應(yīng)的數(shù)據(jù)恢復(fù)
重做日志文件也建議進(jìn)行多路復(fù)用,一個(gè)數(shù)據(jù)庫(kù)至少要有兩組重做日志文件。一組供LGWR進(jìn)行寫入,日志文件是固定大小,業(yè)務(wù)高峰期會(huì)很快寫滿,寫滿之后會(huì)切換到第二組上,在配置為歸檔模式的數(shù)據(jù)庫(kù)中,這時(shí)由歸檔進(jìn)程(ARCn)開始將第一組的內(nèi)容進(jìn)行歸檔備份,如此循環(huán)地進(jìn)行寫入和歸檔。需要注意的是,在歸檔進(jìn)程還未對(duì)當(dāng)前組的日志歸檔完畢前,是不允許LGWR對(duì)其進(jìn)行重寫的。
3)數(shù)據(jù)文件
數(shù)據(jù)文件存儲(chǔ)著實(shí)際的數(shù)據(jù),它是具體的存儲(chǔ)數(shù)據(jù)的物理文件,是一個(gè)物理概念。DBWn會(huì)將數(shù)據(jù)庫(kù)緩沖區(qū)中的內(nèi)容寫入到這類文件中去,數(shù)據(jù)文件的大小和數(shù)量是不受限制的。Oracle從10g開始,創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)至少需要兩個(gè)數(shù)據(jù)文件,一個(gè)用于SYSTEM表空間,該表空間用來存儲(chǔ)數(shù)據(jù)字典;一個(gè)用于SYSAUX表空間,這個(gè)表空間用來存儲(chǔ)一些數(shù)據(jù)字典的輔助數(shù)據(jù)。
數(shù)據(jù)文件由一個(gè)個(gè)的Oracle塊組成,這是Oracle的I/O基礎(chǔ)單元,與操作系統(tǒng)塊是不同的概念,Oracle塊要比操作系統(tǒng)塊大,這當(dāng)然有出于性能的一些考慮,但我們考慮這樣一種情況,當(dāng)用戶使用操作系統(tǒng)命令進(jìn)行數(shù)據(jù)文件的備份的時(shí)候(假設(shè)1個(gè)Oracle塊=8個(gè)操作系統(tǒng)塊),已經(jīng)復(fù)制了4個(gè)操作系統(tǒng)塊,然后CPU被DBWn搶占了,DBWn又重新對(duì)這個(gè)Oracle塊進(jìn)行了更新,這時(shí),當(dāng)復(fù)制命令又得到了CPU時(shí)間去復(fù)制剩余的4個(gè)塊的時(shí)候,就造成了整個(gè)Oracle塊的數(shù)據(jù)不一致,所以,這也是在執(zhí)行這種備份(用戶自行備份)的時(shí)候,需要做一些額外處理,比如將表空間置為備份模式的原因。當(dāng)然,使用RMAN是不存在這樣的問題的,RMAN的備份機(jī)制是肯定可以得到數(shù)據(jù)一致的塊的。(這塊內(nèi)容作了解即可)
對(duì)于數(shù)據(jù)文件的保護(hù),一般可進(jìn)行定期備份,或者使用RAID也可以。
※外部文件:
所謂外部文件,意味著這些文件從嚴(yán)格意義上來講并不屬于Oracle數(shù)據(jù)庫(kù)的一部分。
1)實(shí)例參數(shù)文件
這個(gè)文件存儲(chǔ)了數(shù)據(jù)庫(kù)所需的一些參數(shù)設(shè)置,比如各個(gè)內(nèi)存區(qū)域的大小,可允許的最大進(jìn)程數(shù),最大會(huì)話數(shù),控制文件的位置,數(shù)據(jù)庫(kù)的名稱等等,參數(shù)文件也是實(shí)例啟動(dòng)時(shí)首先要加載的文件。
2)口令文件
一般稱為外部口令文件。一般的用戶名和口令是存放在數(shù)據(jù)字典中,不會(huì)存放在這個(gè)文件中。在一些特殊場(chǎng)景下,比如實(shí)例還未啟動(dòng),這時(shí),我可能需要以管理員的身份登入系統(tǒng)去執(zhí)行一些恢復(fù)或者啟動(dòng)操作,然而此時(shí),數(shù)據(jù)字典由于實(shí)例還沒啟動(dòng)是不存在的,這時(shí)就需要外部口令文件進(jìn)行用戶身份的驗(yàn)證。
3)歸檔日志文件
ARCn將聯(lián)機(jī)重做日志文件會(huì)備份歸檔到這類文件中去,歸檔日志文件保留了數(shù)據(jù)更改的完整歷史信息。
三、Oracle數(shù)據(jù)庫(kù)的啟動(dòng)流程
這一部分主要參考(抄襲):
Oracle 的啟動(dòng)需要經(jīng)歷四個(gè)狀態(tài),SHUTDOWN 、NOMOUNT 、MOUNT 、OPEN、
![]() 1.數(shù)據(jù)庫(kù)流程詳解
(1)startup nomount
啟動(dòng)實(shí)例(不加載數(shù)據(jù)庫(kù)),這個(gè)過程,會(huì)讀取配置文件(spfile / pfile)文件的相關(guān)參數(shù)來創(chuàng)建實(shí)例,也就是一系列的進(jìn)程,啟動(dòng)完成后實(shí)例是 STARTED 狀態(tài)。
(2)alter database mount;
加載(關(guān)聯(lián))數(shù)據(jù)庫(kù),這個(gè)過程的時(shí)候,實(shí)例讀取控制文件,關(guān)聯(lián)到對(duì)應(yīng)的數(shù)據(jù)庫(kù),此時(shí)實(shí)例為MOUNTED狀態(tài)。
?。?)alter database open;
打開數(shù)據(jù)庫(kù),實(shí)例連接到數(shù)據(jù)文件,這個(gè)時(shí)候其他用戶就可以訪問到數(shù)據(jù)庫(kù)進(jìn)行讀寫操作了,此時(shí)實(shí)例的狀態(tài)是OPEN。
所以,我們打開的過程中實(shí)例的狀態(tài)就是:Deaded(idle)>>Started >> Mounted >> Open。
2.數(shù)據(jù)庫(kù)啟動(dòng)流程實(shí)踐
一般一臺(tái)機(jī)子上都會(huì)建立多個(gè)數(shù)據(jù)庫(kù)的,那么怎么啟動(dòng)自己想啟動(dòng)的那個(gè)實(shí)例呢?答案是:通過oracle_sid控制,oracle_sid是數(shù)據(jù)庫(kù)在操作系統(tǒng)的一個(gè)唯一標(biāo)識(shí),在演示數(shù)據(jù)庫(kù)啟動(dòng)流程前,我們先設(shè)定oracle_sid,然后再啟動(dòng)實(shí)例。
(1)準(zhǔn)備工作如下:
1)設(shè)定要啟動(dòng)的數(shù)據(jù)庫(kù),可以不設(shè),使用安裝時(shí)默認(rèn)啟動(dòng)的那個(gè)數(shù)據(jù)庫(kù)即可
1 C:\Users\anand>set oracle_sid=orcl
2)和數(shù)據(jù)庫(kù)建立連接(其實(shí)一般這樣就可以使用了)
1 C:\Users\anand>sqlplus / as sysdba 2 SQL*Plus: Release 11.2.0.1.0 Production on 星期六 6月 2 10:58:17 2018 3 Copyright (c) 1982, 2010, Oracle. All rights reserved. 4 連接到: 5 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 6 With the Partitioning, OLAP, Data Mining and Real Application Testing options ?。?)測(cè)試數(shù)據(jù)庫(kù)啟動(dòng)流程
1)啟動(dòng)實(shí)例(不加載數(shù)據(jù)庫(kù))
1 SQL> startup nomount 2 ORACLE 例程已經(jīng)啟動(dòng)。 3 4 Total System Global Area 1068937216 bytes 5 Fixed Size 2182592 bytes 6 Variable Size 624951872 bytes 7 Database Buffers 436207616 bytes 8 Redo Buffers 5595136 bytes 2)加載(關(guān)聯(lián))數(shù)據(jù)庫(kù)
1 SQL> alter database mount; 2 3 數(shù)據(jù)庫(kù)已更改。 3)打開數(shù)據(jù)庫(kù)
1 SQL> alter database open; 2 3 數(shù)據(jù)庫(kù)已更改。 4)驗(yàn)證
1 SQL> select status from v$instance; 2 3 STATUS 4 ------------ 5 OPEN
四、ORACLE 的用戶、SCHEMA、數(shù)據(jù)庫(kù)、表空間、數(shù)據(jù)文件的相互關(guān)系
這一部分主要參考(抄襲):
|
|
|