標籤:應用 核心 通過 角度 不能 資料恢複 base delete 卸載
一、
什麼是Oracle資料庫?
眾所周知,Oracle DataBase是一款關係型資料庫管理系統(不瞭解何謂關係型資料庫的童鞋自行google,baidu),同類的產品還有mySql,sqlServer等,很多時候,我們會把那個承載我們核心資料的系統籠統地成為資料庫伺服器,但從嚴格意義上來講Oracle DataBase是由兩個部分組成:
執行個體:執行個體是資料庫啟動時初始化的一組進程和記憶體結構
資料庫:資料庫則指的是使用者儲存資料的一些物理檔案
正因為如此我們一般才會說 關閉和啟動執行個體,載入卸載資料庫,就是這個道理。
從執行個體和資料庫的概念上來看,我們能知道,執行個體暫時的,它不過是一組邏輯劃分的記憶體結構和進程結構,它會隨著資料庫的關閉而消失,而資料庫它其實就是一堆物理檔案(控制檔案,資料檔案,記錄檔等等),它是永久存在的(除非磁碟損壞)。資料庫和執行個體通常是一對一的,這種結構我們成為單一實例體繫結構;當然還有一些複雜的分布式的結構,一個資料庫可以對多個執行個體,像Oracle的RAC(有興趣的童鞋可以瞭解下)。
二、互動流程
下面是從網上找的一張圖,描述了單一實例體繫結構大致的互動流程
1.使用者和使用者進程互動
使用者進程可以是一般的用戶端軟體,像Oracle的sqlplus,sql developer,或者是一些驅動程式等等都屬於使用者進程。
2.使用者進程和伺服器處理序互動
伺服器處理序有時會稱為前台進程,當然是相對於後台進程(後面會提到的資料庫寫入器,日誌寫入器等)來說的,伺服器處理序的主要作用就是處理串連到當前執行個體的使用者進程的請求,對用戶端發來的sql進行執行並返回執行結果。在專有伺服器結構中,使用者進程和伺服器處理序是一對一的,也就是說,當監聽程式監聽到用戶端來了一個請求,會為其分配一個對應的伺服器處理序。還有一種結構為共用伺服器,這種結構就不是一個使用者進程對應一個伺服器處理序了,會通過發送器進行協調處理,關於共用伺服器串連,本文就不在贅述了。
3.伺服器處理序和執行個體進程互動
4.執行個體和資料庫進程互動
上面描述了一些我們在進行資料庫連接操作的時候,大致的互動流程是什麼樣的。下面,我們就來看看Oracle 的執行個體記憶體結構
三、執行個體記憶體結構和進程結構
oracle執行個體記憶體結構由兩部分組成SGA(系統全域區)和PGA(使用者全域區)組成,SGA是一塊共用的記憶體地區,也是最大的一塊記憶體地區;PGA則是使用者會話專有的記憶體地區,每個會話在伺服器端都有一塊專有的記憶體地區就是PGA。本文主要對SGA進行分析描述。SGA組成如下
資料庫緩衝區快取&資料庫寫入器
緩衝區快取 是Oracle用來執行sql 的工作區域,在更新資料時,使用者會話不會直接去更新磁碟上的資料,想想,如果允許這麼做,那麼頻繁的磁碟IO對於系統效能的影響是毀滅性的。所以,實際的處理流程是這樣的:
1 |
select ename,salary from emp where name = ‘東方不敗‘ ; |
我們來看這麼一條簡單的查詢語句,oracle是如何處理的。首先,當使用者提交了該條sql語句,由對應的使用者進程(比如我們常用的sql developer)將其發送給伺服器,監聽程式監聽到該條請求,會為其建立一個對應的伺服器處理序,然後伺服器處理序會先掃描緩衝區中有沒有包含關鍵行("東方不敗")的資料區塊,如果有,這就算一次快取命中了,然後相關行會傳輸到PGA進行進一步處理,最終經過格式化後展示給使用者;如果沒有命中,那麼伺服器處理序會首先將對應行複製到緩衝區內,然後再返回給用戶端。
DML(insert,update,delete)操作同理,加入使用者發送一條update語句,服務進程依然先去掃描緩衝區,如果快取命中,則直接更新,資料變髒;如果沒有命中,由伺服器處理序將對應資料區塊先從磁碟上複製到緩衝區內,再進行更新操作。
髒緩衝區
如果緩衝區儲存的塊和磁碟上的塊不一致,該緩衝區就叫做“髒緩衝區”,髒緩衝區最終會由資料庫寫入器(DBWn)寫入到磁碟中去。
資料庫寫入器(DBWn)
資料庫寫入器是Oracle的一個後台進程,所謂後台進程是相對於前台進程(伺服器處理序)來講的。DBWn的"n"意味著一個執行個體是可以有多個資料庫寫入器的。
作用:簡而言之,DBWn的作用就是將變髒了的緩衝區從資料庫緩衝區快取中寫入到磁碟中的資料檔案中去。
資料庫緩衝區快取這塊記憶體地區和資料庫寫入器這塊是比較重要的概念,別的資料庫產品像mySql也都有對應的實現,只不過叫法不一樣罷了。瞭解這塊的時候,要時刻意識到會話是不會直接更新磁碟資料的,會話的更新,插入,刪除包括查詢等都是先作用到緩衝區上,隨後,DBWn會將其中的髒緩衝區轉儲到磁碟上去。
DBWn什麼時候寫入?
DBWn是個比較懶的進程,它會儘可能少的進行寫入,在以下四種情況它會執行寫入:
a.沒有任何可用緩衝區(不得不寫啊)
b.髒緩衝區過多
c.3秒逾時(最晚3秒會執行一次寫入)
d.遇到檢查點,即checkPoint(檢查點),檢查點是個Oracle事件,遇到檢查點,DBWn會執行寫入。比如執行個體有序關閉的時候會有檢查點,DBWn會將所有髒緩衝區寫入到磁碟上去的,這很容易理解,要保持資料檔案的一致性。
注意:
從上述DBWn的幾個寫入時機,我們能意識到,DBWn的寫入不是直接依賴於會話的更新操作的。不是一有髒緩衝區,它就執行寫入。而且,DBWn執行寫入跟commit操作也沒有任何關係,不要以為commit操作的影響結果會即時資料流入到磁碟中去。
DBWn採用極懶演算法進行寫入,原因我們應該要清楚:頻繁的磁碟IO對系統的壓力很大,如果DBWn很積極地去寫入磁碟,那對系統效能的影響就太大了,換個角度想,如果DBWn很勤快的寫磁碟,那麼資料庫緩衝區存在的意義也就不大了。
當然,講到這兒,我們可能會意識到一個問題,DBWn如此懶地進行資料轉儲,如果在某一時刻,資料庫緩衝區快取記憶體在著大量的髒緩衝區(生產環境中,這是常態),也就是有大量的未commit和已commit的資料還在記憶體中,沒有持久化到磁碟中,然後突然系統斷電了,這種情況下,資料是不是就丟掉了?資料當然不會丟失,這就引出了重做日誌(redo log)的概念,接下來,我們就來談談對應重做日誌的記憶體結構和後台進程。
日誌緩衝區&日誌寫入器
當我們執行一些DML操作(insert,update,delete),資料區塊發生改變了,產生的變更向量則會寫入到重做記錄檔中去。有了這些記錄,當系統由於斷電等因素突然宕掉,資料庫緩衝區快取內的大量髒資料還沒來得及寫入到資料檔案中去,在重新啟動的時候,會有一個執行個體恢複的過程,在此過程中就應用了重做日誌記錄來使資料保持一致;或者資料庫遭遇了物理損壞,比如磁碟損壞了,此時可以通過Oracle的備份恢複工具(如RMAN)進行資料恢複,原理就是 提取備份組-->應用重做記錄檔中的變更記錄。
日誌緩衝區
日誌緩衝區是一塊比較小的記憶體地區,它是用來短期儲存將寫入到磁碟中的重做記錄檔中的變更向量的。
日誌緩衝區存在的意義依然是為了減少磁碟IO,減少使用者的等待時間,試想下,如果每一次使用者DML操作都要進行等待重做記錄被寫入到磁碟中去,體驗會有多差勁。
日誌寫入器(LGWR)
顧名思義,日誌寫入器(LGWR)就是把日誌緩衝區內的內容寫入到磁碟的重做記錄檔中去,相比資料庫寫入器(DBWn),日誌寫入器就勤快多了。
以下三種情況LGWR會執行寫入:
a.commit時寫入
前面提過,DBWn的寫入和commit沒有任何關係,如果commit時資料庫沒有任何記錄,那資料就真的丟失了,Oracle 的重做日誌就是為了保證資料安全而存在的,commit時,會話會先掛起,等待LGWR將這些記錄寫入到磁碟上的重做記錄檔中,才會通知使用者提交完成。所以,LGWR在commit時執行寫入,是為了確保事務永不丟失。
b.日誌緩衝區的佔用率達到1/3。
c.DBWn要寫入髒緩衝區前
這個寫入是為了資料復原考慮的。DBWn完全可能寫入還沒提交的事務(參照上面提到的寫入時機),那如何保證交易回復呢?
首先要知道,DBWn除了寫入實際的資料,還會寫入撤銷資料(不瞭解的同學可參考我的另一篇博文中對於撤銷段的描述 Oracle閃回技術詳解。)簡單說,交易回復需要撤銷資料,在寫入撤銷資料前,會先寫入針對撤銷資料的日誌記錄(有點繞),若使用者要進行交易回復,就可以應用這些日誌記錄來構造撤銷資料,然後進行復原。
我們對這兩塊最重要的記憶體地區和對應的後台進程做個總結:
資料庫緩衝區快取和日誌緩衝區都是為了提高效能,避免頻繁IO而存在的。日誌緩衝區相比資料庫緩衝區快取要小的多,並且不能進行自動管理,對於日誌緩衝區的修改需要重啟執行個體,資料庫緩衝區快取可進行自動管理。作用在資料庫緩衝區快取上的DBWn進程,為了避免頻繁的磁碟IO導致系統效能下降,會儘可能少地執行寫入,且DBWn的寫入和commit操作沒有任何關係;
而作用在日誌緩衝區上的LGWR進程,則會非常積極地進行寫入,一般情況下,它幾乎是即時地將重做日誌記錄轉儲到磁碟中去。LGWR是Oracle體繫結構中最大的瓶頸之一。DML的速度不可能超過LGWR將變更向量寫入磁碟的速度。
oracle學習一