標籤:復原 核心部分 檔案 acl 共用池 inf 整合 指令 動態
Oracle RDBMS架構圖
一般我們所說的Oracle指的是Oracle RDBMS(Relational databases Management system),一套Oracle資料庫管理系統,也稱之為Oracle Server。而Oracle Server主要有兩大部分:
Oracle Server = 執行個體 + 資料庫 (Instance和Database是相互獨立的)
資料庫 = 資料檔案 + 控制檔案 +記錄檔 執行個體 = 記憶體池 + 後台進程
所以可以細分為: Oracle Server = 記憶體池 + 後台進程 + 資料檔案 + 控制檔案 + 記錄檔
一台Oracle Server支援建立多個Database,而且每個Datacase是互相隔離而獨立的。不同的Database擁有屬於自己的全套相關檔案,例如:有各自的密碼檔案,參數檔案,資料檔案,控制檔案和記錄檔。
Database由一些物理檔案(如:存放在存放裝置中的二維表檔案)組成。二維表格儲存體在Database中,但Database的內容不能被使用者直接讀取,使用者必須通過Oracle instance才能夠訪問Database,一個Instance只能串連一個Database,但是一個Database可以被多個Instance串連。
將上面的Oracle RDBMS架構圖進行抽象分類,可以將Oracle架構抽象為:Oracle體系 = 記憶體結構 + 進程結構 + 儲存結構
記憶體結構
Oracle Instance是Oracle RDBMS的核心之一,負責RDBMS的管理功能。Oracle Instance主要由記憶體池SGA和後台進程組成。
系統全域區SGA
SGA(System Global Area)是與Oracle效能關係最大的核心部分,也是對Oracle進行調優的主要考量。SGA記憶體池會在Instance啟動時被分配,在Instance關閉時被釋放。在一定範圍內,SGA可以在Instance運行時通過自動方式響應DBA的指令。
如果想對SGA進行調優還必須理解SGA所包含如下幾種資料結構:
快取緩衝區(資料庫緩衝區)
資料庫緩衝區是oracle執行SQL語句的地區。
例如在更新資料時,使用者執行的SQL語句不會直接對磁碟上的資料檔案變更操作,而是首先將資料檔案複製到資料庫緩衝區快取(就是說資料庫緩衝區裡會存放著SQL相關資料檔案副本),再更改應用於資料庫緩衝區快取中這些資料區塊的副本。而且資料區塊副本將在緩衝中保留一段時間,直至其佔用的緩衝區被另一個資料庫覆蓋為止(緩衝區Size有限)。
在查詢資料時,為了提高執行效率,查詢的資料也要經過緩衝。建立的Session會計算出那些資料區塊包含關鍵的行,並將它們複製到資料庫緩衝區中進行緩衝。此後,相關關鍵行會傳輸到Session的PGA作進一步處理。這些資料區塊也會在資料庫緩衝區緩衝中保留一段時間。
一般情況下,被頻繁訪問的資料區塊會存在於資料庫緩衝區快取中,從而最大程度地減少對磁碟I/O的需要。
那什麼時候會將被更新的資料區塊副本寫入到磁碟中的資料檔案呢?
答案就是:如果在緩衝區快取中儲存的資料區塊與磁碟上的資料區塊不同時,那麼這樣的緩衝區常稱為”髒緩衝區”,髒緩衝區中的資料區塊副本就必須寫回到磁碟的資料檔案中。
調優:資料庫緩衝區快取的大小會對效能產生至關重要的影響,具體需要多大的Size才能成為最佳配比還要結合實際的生產環境而言。總體而言可以依據以下兩點基本要求來判斷:
1. 緩衝應足夠大,以便能緩衝所有被頻繁訪問的資料區塊。如果緩衝過小,那麼將導致磁碟I/0活動過多,因為頻繁訪問的資料區塊持續從磁碟讀取,並由其他資料區塊使用和重寫,然後再從磁碟讀取。
2. 但也不能太大,以至於它會將極少被訪問的塊也一併加入到緩衝中,這樣會增長在緩衝中搜尋的時間。
資料庫緩衝區快取在Instance啟動時被分配。從資料庫9i開始,可以隨時將其調大或調小。可以採用手動方式重調,也可以根據工作負載自動重調大小(事務)。
日誌緩衝區
日誌緩衝區是小型的、用於短期儲存將寫入到磁碟上的重做日誌的變更向量的臨時地區。主要作用是提供更加快的Tlog效率。
共用池
共用池的大小也對效能產生重要影響
1. 它應該足夠大,以便緩衝所有頻繁執行的代碼和頻繁訪問的對象定義。如果共用池過小,則效能下降,因為伺服器會話將反覆搶奪其中的空間來分析語句,此後,這些語句會被其他語句重寫,在重新執行時,將不得不再次分析。如果共用池小於最優容量,則效能將下降。但有一個最小容量,如果低於此限度,則語句將失敗。
2. 但也不能過大,以至於連僅執行一次的語句也要緩衝。過大的共用池也會對效能產生不良影響,因為搜尋需要的時間過長。
確定最優容量是一個效能調整問題,大多數資料庫都需要一個數百MB的共用池。有些應用程式需要1GB以上的共用池,但很少有應用程式能夠在共用池小於100MB時充分運行。共用池內有下列三種資料結構:
庫緩衝:儲存最近執行的代碼 資料字典緩衝:儲存最近使用的對象定義 PL/SQL緩衝區:儲存的PL/SQL對象是過程、函數、打包的過程、打包的函數、物件類型定義和觸發器。
手動的調整共用池的大小:
select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE from v$sga_dynamic_components; //顯示可以動態調整大小的SGA組件的當前最大和最小容量
ALTER SYSTEM SET SHARED_POOL_SIZE = 110M;
其他結構
這裡暫時不做詳細介紹。
大型池
主要用途是供共用的伺服器處理序使用。
JAVA池
只有當應用程式需要在資料庫中運行java儲存程式時,才需要java池。
進程結構
進程結構主要有後台進程和使用者串連進程兩大類。
使用者串連進程
使用者串連進程是串連使用者和Oracle Instance的橋樑。只有在User與Instance建立了串連以後,User才能夠對Oracle Server進行操作。
使用者串連進程 = 使用者進程 + 服務進程 + PGA
使用者進程User Process
當一個Database User請求串連到Oracle Server時,Oracle Server會建立User Process。
User Process的作用:
為Database User與Server Process建立串連 並不會直接與Oracle Server互動
connect串連:是User和Server Process之間的通訊通道。
Server Process服務進程
用於處理Database User和Oracle Server之間的串連。
當一個User與User Process建立了一個connect後,Oracle Server會建立一個Server Process。然後再由User Process與Server Process建立了串連之後,Server Process會通過使用者提交的請求資訊來確定與oracle instance建立一個會話。
Server Process的作用:
與Oracle Server直接互動 複製執行和返回結果
Session會話:一個使用者通過User Process(本質是通過Server Process)與Oracle Instance建立串連後稱之為一個會話,一個使用者可以建立多個會話,即同時使用同一個使用者可以多次的串連到同一個執行個體,也就是說多個session可以使用同一個connect。
程式全域區PGA
PGA:Oracle Server Process分配來專門用於當前User Session的記憶體區。該地區是私人的,不同的使用者擁有不同的PGA。
PGA包含了Server Process資料和控制資訊的記憶體地區。,由下列3個部分組成:
1. 棧空間:儲存Session的變數、數組等的記憶體空間。
2. Session Info:如果啟動並執行不是多線程伺服器,會話資訊將儲存在PGA中,如果是多線程伺服器,則儲存在SGA中。
3. 私人SQL區:用來儲存綁定變數(binding variables)和運行時緩衝區(runtime buffers)等資訊。
Oracle的connect串連和session會話與User Process緊密相關
注意:在RDBMS中由db\_name和instance\_name共同確定一個Database,所以Instance_name被用於Oracle與OS之間的聯絡同時也被用於Oracle Server與外部串連時使用。
所以在User提交串連請求的時候,User Process首先會與Server Process建立Connect,然後Server Process會通過請求中所包含的db\_name和Instance\_name來確定需要且可以被串連的資料庫(RDBMS可以存在多個資料庫),這樣就確保了RDBMS在擁有多個資料庫的情況下,還能夠保證每一個Database的獨立性。而且同一個Database可以被多個屬於這個Databse的不同使用者發起的Instance串連。這一個功能是非常有必要的,因為每一個不同的資料庫中都包含有同名的sys、system等系統使用者。
後台進程
後台進程主要是完成資料庫管理工作 ,後台進程是Oracle Instance和Oracle Database的聯絡紐帶,分為核心進程和非核心進程。
1. 核心進程:核心進程,必須存在,有一個終止,所有資料庫進程全部終止,執行個體崩潰!其中五大進程全都是核心進程。
2. 非核心進程:完成資料庫的額外功能,非核心進程死亡資料庫不會崩潰!
常用的核心進程:
在使用者訪問資料庫時,首先會提交請求,再分配SGA記憶體,建立並啟動後台進程和執行個體,最後建立串連和會話。Oracle Server運行過程中必須啟動上面的前五個進程。否則執行個體無法建立
資料庫寫入進程(DBWn)
Server process串連Oracle後,通過資料庫寫進程(DBWn)將資料緩衝區中的“髒緩衝區”的資料區塊寫入到儲存結構(資料檔案、磁碟檔案)
Database writer (DBWn)資料庫寫進程:
只做一件事,將資料寫到磁碟。就是將資料庫的變化寫入到資料檔案。
該進程最多20 個,即使你有36 個CPU 也只能最多有20 個資料庫寫進程。
進程名稱DBW0-DBW9 DBWa-DBWj
注意:資料庫寫進程越多,寫資料的效率越高。該進程的個數應該和cpu的個數對應,如果設定的資料庫寫進程數大於CPU 的個數也不會有太明顯的效果,因為CPU 是分時的。
檢查點(CKPT)
Checkpoint (CKPT)檢查點進程:
主要使用者更新資料檔案頭,更新控制檔案和觸發DBWn資料庫寫進程。
Ckpt 進程會降低資料庫效能,但是提高資料庫崩潰時,自我恢複的效能。我們可以理解為階段性的儲存資料,一定的條件滿足就觸發,執行DBWn存檔操作。
進程監視進程(PMON)
Process monitor (PMON)進程監測進程:
PMON在後台進程執行失敗後負責清理資料庫緩衝和閑置資源,是Oracle的自動維護機制。
清除死進程 重新啟動部分進程(如調度進程) 監聽的自動註冊 復原事務 釋放鎖 釋放其他資
系統監視進程(SMON)
System monitor (SMON)系統監測進程:
SMON啟動後會自動的用於在執行個體崩潰時進行資料庫執行個體自動回復。
清除作廢的排序臨時段,回收整理片段,合并空閑空間,釋放臨時段,維護閃回的時間點。
在老資料庫版本中,當我們大量刪除表的時候,會觀測到SMON進程很忙,直到把所有的片段空間都整理完畢。
重做記錄檔和日誌寫入進程
主要用於記錄資料庫的改變和記錄資料庫被改變之前的原始狀態,所以應當對其作多重備份,用於恢複和排錯。
啟用LGWR的情況:
提交指令 日誌緩衝區超過1/3 每三秒 每次DBWn執行之前
歸檔進程(ARCn)
歸檔進程(ARCn)是非核心進程。
儲存結構
Oracle RDBMS儲存結構主要由Database組成。
又能夠將Database分為物理結構和邏輯結構來理解。
物理結構
Database物理結構:是Database在作業系統中的檔案集合,即:磁碟上的物理檔案,主要由資料檔案、控制檔案、重做記錄檔、歸檔記錄檔、參數檔案、口令檔案組成。
Data Files
資料檔案是資料的儲存倉庫。
? 包括所有的資料庫資料
? 只能屬於一個資料庫
? 來自於被稱為”資料表空間”的資料庫存放裝置邏輯單元
? 可以直接被讀進記憶體,在執行SQL語句的時候,會將相關的資料檔案副本載入如資料緩衝區。
? 通過備份策略可以使資料檔案得到保護
Redo Log Files
重做記錄檔包含對資料庫所做的更改操作記錄,在Oracle發生故障時能夠恢複資料。
能夠恢複資料的原理:重做記錄檔會按時間的順序,將應用於資料庫的一連串的變更向量(做了什麼操作)儲存起來(即將變更的地方標記起來)。其中包含了所有已經完成操作的資訊和完成操作之前的資料庫狀態。如果資料檔案受損,就可以將這些變更向量應用於資料檔案備份來進行重做(重建)工作,將它恢複到發生故障的那一刻前的狀態。重做記錄檔又分為下面兩種類型:
聯機重做記錄檔:記錄連續的資料庫操作 歸檔記錄檔Archived Log Files:用於時間點恢複,當RedoLogFiles存滿時,會對這些日誌進行歸檔備份,以便以後還原資料時使用。
查看redo log info:
SQL> select member from v$logfile; # v$logfile資料字典,記錄了redolog檔案的列表
MEMBER
--------------------------------------------------------------------------------
/u01/oradata/demo/redo03.log
/u01/oradata/demo/redo02.log
/u01/oradata/demo/redo01.log
Control Files
控制檔案包含維護和驗證資料庫完整性的必要的資訊。
它記錄了聯機重做記錄檔、資料檔案的位置、更新的歸檔記錄檔的位置。它還儲存著維護資料庫完整性所需的資訊,如資料庫名。控制檔案是以二進位型式儲存的,使用者無法修改控制檔案的內容。控制檔案不過數MB,卻起著至關重要的作用。
Parameter File
執行個體參數檔案,當啟動oracle執行個體時,SGA結構會根據此參數檔案的設定記憶體,後台進程會據此啟動。
Password File
使用者通過提交username/password來建立會話,Oracle根據儲存在資料字典的使用者定義對使用者名稱和口令進行驗證。
邏輯結構
資料表空間就是典型的Oracle邏輯結構類型 —— 裡面存放著若干的資料檔案
資料表空間:用於儲存資料庫物件的邏輯空間,資料表空間是在資料庫中開闢的一個空間,用於存放資料庫的對象,它是資訊儲存的最大邏輯單位,是存放資料庫檔案的地方,其中資料又被存放在資料表空間中的資料檔案中。一個資料庫可以由多個資料表空間組成,Oracle的調優就是通過資料表空間來實現的。(Oracle資料庫獨特的進階應用程式)
資料表空間的作用:分類管理、批量處理; 將瑣碎的磁碟檔案整合、抽象處理成為邏輯結構。這樣更加便於我們去管理資料庫。
邏輯空間到物理空間的映射
段、區和塊:
執行一條寫入的SQL語句時在RDBMS中都發生了什麼
1. 將SQL語句載入入資料庫緩衝區
2. 將SQL語句要操作的資料檔案副本載入入資料庫緩衝區
3. 執行SQL語句,修改資料檔案副本,形成“髒緩衝區”
4. CKPT檢測到“髒緩衝區”,調用DBWn
5. 在DBWn運行之前,先運行了LGWR,將資料檔案的原始狀態和資料庫的改變記錄到Redo Log Files
6. 運行DBWn,將“髒緩衝區的內容寫入到資料檔案”
7. 同時CKPT修改控制檔案和資料檔案頭
8. SMON回收不必要的空閑資源
最後
最後我們舉個例子來看看Oracle RDBMS是怎麼運作的
User訪問Oracle Server之前提交一個請求(包含了db_name、instance_name、username、password等資訊),Oracle Server接收到請求並通過Password File的驗證後,分配SGA記憶體池,啟動後台進程同時建立並啟動執行個體。 在啟動執行個體之後User Process與Server Process建立Connect。 再通過Server process和Oracle Instance完成建立Sesscion。 使用者執行SQL語句,由server process接收到並直接與Oracle互動。 SQL語句通過Server Process到達Oracle Instance,再將SQL載入資料庫緩衝區。 Server Process通知Oracle Database將與SQL語句相關的資料區塊副本載入到緩衝區中。 在資料庫緩衝區執行SQL語句,併產生”髒緩衝區”。 由CKPT檢查點進程檢查到”髒緩衝區”,並調用DBWn資料庫寫進程,但在DBWn執行之前,應該由LGWR先將資料檔案的原始狀態、資料庫的改變等資訊記錄到Redo Log Files。 將更新的內容寫入到磁碟中的資料檔案。 返回結果給使用者
轉自http://www.2cto.com/database/201606/515344_3.html
Oracle架構實現原理(轉)