【00】Oracle體系結構詳解
零.概述:
oracle server由instance和database組成。
每當資料庫(database)啟動時,將在記憶體中分配SGA(system global area),並將一組oracle後臺程式啟動。
例項(instance)用於控制資料庫,資料庫用於為例項提供各種資料。
一組例項只能服務一個資料庫,某些時候,一個資料庫可以有多組例項。
這樣的多例項結構,就是real application clusters(RAC)。
例項:由一組後臺程式及在伺服器中分配的共享區域。
資料庫:基於磁碟的各類物理檔案的集合。
一.資料庫結構:
- ·邏輯儲存結構:
從小至大可排序為:資料塊(block)、區(extent)、段(segment)、表空間(tablespace)。
資料塊(block):
也叫logical blocks,oracle blocks,或者pages(摘自oracle 10g concept)
是資料儲存最小的邏輯單元,也是輸入輸出操作的最小單位。
通過以下語句可以查詢oracle標準塊的大小。
SQL> select name,value from v$parameter where name='db_block_size';
block無論儲存的是table、index、還是clustered data,其內部結構都相似。
Header (common and variable header):包含塊的實體地址,所屬段的型別。
Table Directory:儲存資料表的相關資訊。(?如果是非表塊如何處理?)
Row Directory:儲存每個資料行片斷(row piece)在行資料區中的地址。
Free Space:剩餘空間,用於新的資料行插入和更新。
如果一個block屬於表或簇表的資料段,或屬於索引的索引段,那麼在其可用空間區中還可能會儲存事務條目。
這樣的資料塊的資料行如果在執行DML訪問時,資料塊中就需要儲存事務條目。
Row Data:行資料包含了表或索引資料,行可以跨塊(以後會提到行連結和行遷移)。
其中header、table directory、row directory統稱為Overhead,用於存放整個塊的引導資訊。
區(extent):
是oracle儲存分配與回收的最小單位。
當一個段已有的空間被用完之後,oracle將為該段分配新的區。
段(segment):
由一組區構成,
包括資料段、索引段、臨時段、回滾段。
資料段:表資料段、索引表資料段、分割槽表資料段、聚簇資料段
索引段:包括ROWID與索引鍵值
臨時段:當進行group by、order by、union、intersect、minus、distinct、create index時,
若記憶體不足,則oracle將為這些操作分配臨時段來儲存產生的臨時資料。
回滾段:儲存資料修改前的資訊,可以用於事務回滾、資料庫恢復、讀一致性。
根據使用者不同,還可以分為系統回滾段、非系統回滾段。
表空間(tablespace):
一個資料庫被分割到1到n個被稱作表空間的邏輯儲存單位。
表空間可分為:system表空間、sysaux表空間、undo表空間、temporary表空間。
也可以分為:大檔案表空間(Bigfile tablespace)和小檔案表空間(Smallfile tablespace)即預設建立的表空間。
大檔案表空間可以增強oracle資料庫的儲存能力,小檔案表空間預設可以存放1024個datafile(10g資料)
注:若無特殊說明(如bigfile tablespace),一般“表空間”就是“小檔案表空間”。
大檔案表空間:
大檔案表空間只可用於locally managed,而且段只能為自動管理。
但是對於撤銷表和臨時表而言,段為manually managed時,也可以使用大檔案表空間。
system表空間:
用於存放系統內部表與資料字典。
sysaux表空間:
充當system表空間的輔助表空間,儲存除資料字典之外的其他資料物件。
undo表空間:
只用於儲存撤銷資訊,不可建立如表和索引等資訊,一個資料庫中可以有零到多個。
當事務內的第一條DML執行時,當前使用的撤銷表空間就回被分配一個撤銷段和一個事務表。
temporary表空間:
如果system表空間是locally managed,在建立資料庫時必須指定一個預設的臨時表空間。
如果system表空間是dictionary managed,且建立資料庫時沒有定義預設臨時表空間,oracle則會將system表空間作為預設的臨時儲存空間。並且在alert.log中生成一條警告。
表空間是邏輯儲存單位,而實際上資料是儲存在資料檔案(datafile)中。
下圖是兩者的關係:
資料檔案只能存在於一個表空間中,一個表空間可以存放多個資料檔案。
舉個例子,一個最簡單的資料庫最少需要一個表空間和一個資料檔案。
- ·物理儲存結構:
Oracle 資料庫由多種作業系統的物理檔案組成。
其中主要包括:資料檔案、控制檔案、引數檔案、重做日誌檔案、歸檔日誌檔案、口令檔案、跟蹤檔案、警告檔案。
資料檔案:(.dbf)
用於存放使用者應用程式資料和oracle系統內部資料的檔案。
建立表空間時,同時會建立資料檔案,在建立表,索引,簇等資料庫物件時,但無法指定用哪個資料檔案存放。
控制檔案:(.ctl)
是一種二進位制檔案,在資料庫例項開啟的時候,控制檔案必須可寫,如果控制檔案無法被訪問,資料庫也將無法工作。
用於存放資料庫名及其建立日期,資料檔案、日誌檔案的名稱和位置、表空間資訊、離線的資料檔案、日誌歷史資訊、當前日誌檔案序列號、資料庫檢查點、系統更改號、歸檔當前資訊、回滾段的起止、備份集和備份塊等。
每當新增、重新命名或者移除資料檔案或重做日誌檔案時,控制檔案就會被更新以反映這些資料庫物理結構變化,目的是:oracle可以藉此在資料庫啟動時識別開啟的資料庫檔案和重做日誌檔案,也可以在恢復資料庫時識別當前可用及需要恢復的檔案。
因此,每次更改物理結構時(alter database),如新增一個資料檔案,一定要備份控制檔案,同時更新備份檔案。
此外,資料庫恢復(database recovery)時也要用到控制檔案。
至少需要一個控制檔案,否則例項無法啟動。
重做日誌檔案:(.log)
記錄資料庫發生過的更改資訊,如修改,新增,刪除及由oracle內部行為而引起資料庫變化的操作。
如果某種故障導致無法將修改過的資料永久的寫入資料檔案,那麼這些修改內容可以從重做日誌中獲得。
每個oracle資料庫都有兩個或更多的重做日誌檔案。
歸檔日誌檔案:(.log)
oracle將在重做日誌檔案被覆蓋之前,將其內容儲存至指定位置,被儲存的重做日誌集合稱為“歸檔日誌檔案”。
可以通過
SQL> select name,log_mode from v$database;來查詢歸檔情況。
伺服器引數檔案:(.ora)
引數檔案包含了資料庫與例項的配置引數列表,在安裝oracle DB的時候會自動建立,檔名為SPFILEsid.ora
spfile為二進位制檔案,為動態的,被修改的引數可立即生效。
口令檔案(密碼檔案):
用於驗證sysdba許可權的二進位制檔案,當遠端使用者以sysdba或sysoper連線時,將用該檔案驗證。
該檔案會在建立例項的時候自動建立。
警告檔案(.log):
即警告日誌檔案,為文字檔案,記錄執行資訊與錯誤資訊。
執行資訊:oracle例項的祁東和關閉,建立表空間,增加資料檔案等。
錯誤資訊:如空間擴充套件失敗,啟動例項失敗等。
查詢路徑:
SQL> select name,value from v$parameter where name = 'background_dump_dest';
跟蹤檔案(.trc):
包括後臺跟蹤檔案與使用者程式跟蹤檔案,
後臺程式跟蹤檔案:用於記錄後臺經常的警告或錯誤資訊。命名格式為__.trc。
使用者程式跟蹤檔案:用於記錄與使用者程式的相關資訊,用於跟蹤sql語句,用於判斷sql預計執行效能,由user_dump_dest確認,命名格式為_ora_.trc。
查詢路徑:
SQL> select value from v$parameter where name = 'background_dump_dest';
或者改為'user_dump_dest';
二.例項結構:
- ·記憶體(SGA&PGA):
Oracle在記憶體中儲存以下資訊:
程式程式碼、已連線的會話資訊、程式執行過程中所需的資訊、需要在oracle程式間共享並進行通訊的資訊、以及快取。
其中基本的記憶體結構包括SGA與PGA:
SGA(System global area):
此區域由所有的伺服器程式和後臺程式共享。
主要包括了database buffer cache、redo log buffer、shared pool、large pool、java pool、streams pool。
buffer cache:
存放oracle最近訪問過的資料塊(緩衝塊),若請求資料在緩衝區中,oracle便直接讀取出來並返回給使用者,否則伺服器程式將資料從磁碟的資料檔案中讀出,存入緩衝區;
最常訪問的資料塊將放置到緩衝區前端,反之放入後端,緩衝區填滿時,會擠掉不常被訪問的塊、
髒資料塊:存放著已被修改過的資料,等待被寫入到資料檔案,當某緩衝塊中的資料被修改後,這些塊被標記為“髒”。
空閒快取塊:等待被從資料檔案中讀取的資料讀滿。
保留快取塊(命中):包含正被使用者訪問的資料塊和明確保留以作為將來使用的資料塊。
redo log buffer:
日誌資訊在寫入重做日誌檔案前,首先存放到redo log buffer中,再由LGWR寫入檔案,緩衝區大小由log_buffer決定,可以在例項啟動後修改該引數,較大的緩衝區能減少redo log file的I/O次數。
shared pool:
用於快取SQL語句、資料字典、PL/SQL語句,資源所,字符集及其他控制結構。
庫高速緩衝區(又分為共享SQL區與私有SQL區):
共享SQL區存放SQL於PL/SQL語句的語法分析結果和執行計劃。
私有SQL區存放繫結變數,環境和會話等資訊,屬於某使用者所私有的。
資料字典緩衝區:
存放oracle系統內部所需要的資料字典,如使用者名稱,資料物件等。
large pool:
非必須結構,特殊情況時用於減輕共享池的壓力:
當使用恢復管理器進行備份和恢復操作時;
使用I/O slave模擬非同步I/O功能時;
執行大量排序操作的SQL語句時;
當使用並行查詢時,大型池作為並行查詢程式被彼此交換資訊的地方;
大小由large_pool_size決定。
java池:
用來提供記憶體給java虛擬機器用,用於支援在資料庫中執行java程式包,大小由java_pool_size決定。
streams池:
用於資料庫與資料庫之間進行資料共享,若沒用到oracle流,則不需設定流池,大小由streams_pool_size決定。
- ·後臺程式:
是一組執行於oracle伺服器端的後臺程式,是例項的重要組成部分。
其中SMON、PMON、DBWR、LGWR和CKPT必須正常啟動。
DBWR(資料寫入程式):
將資料告訴緩衝區中的髒資料寫入資料檔案的程式。
發生的三種情況:
在database buffer cache中沒有找到足夠的空閒緩衝塊時;
在CKPT程式啟動後;
在“髒”資料庫在database buffer cache中存放超過3秒時;
可修改spfile的db_writer_processes來允許多個DBWR,但DBWR數量不應超過CPU數量。
CKPT(檢查點程式):
可視為一個事件,作用就是執行檢查點,目的為減少崩潰恢復時間。
通過修改spfile的checkpoint_process引數為true來啟動。
LGWR(日誌寫入程式):
將redo log buffer中的重做記錄寫入重做日誌檔案中。
發生的三種情況:
發生提交時;
redo log buffer的資訊滿1/3時;
日誌資訊存放超過3秒時;
ARCH(歸檔程式):
將已寫滿的重做日誌檔案複製到歸檔日誌檔案中(歸檔模式中)。
可通過修改log_archive_max_processes啟動多個ARCH從而提高歸檔寫磁碟的速度。
SMON(系統監控程式):
用於在例項啟動時負責對資料庫進行恢復,回收不再使用的臨時空間,將各個表的空間碎片合併。
PMON(程式監控程式):
用於在程式啟動失敗或未響應時,清除此類程式,並釋放所佔用的資源。
LCKn(鎖定程式):
用於在並行伺服器模式下,例項間的封鎖。
RECO(恢復程式):
用於分散式資料庫環境,解決資料不一致,進行恢復工作。
Dnnn(排程程式):
在共享伺服器模式下(多執行緒)使用。
SNPn(快照程式):
使用者處理資料庫快照的自動重新整理,並通過DMBS_JOB包執行預定的資料庫儲存過程。
查詢當前例項程式的資訊:
SQL> select name,description from v$bgprocess;
三.其他:
- ·其他程式:
使用者程式:
指那些可以產生或執行SQL語句的應用程式。
連線:指使用者程式與例項之間建立的通訊路徑,通過作業系統上相關通訊機制或者網路連線來實現。
會話:指使用者程式與例項之間建立連線後形成的使用者與例項間的互動方式,在使用者連線的過程中,會話始終存在,直到使用者斷開連線或終止應用程式。
伺服器程式:
解析並執行SQL與PL/SQL;
在database buffer cache中搜尋使用者程式所需要的資料,若不在,則需從硬碟的資料檔案中讀取至緩衝區;
將執行結果返回給使用者程式;
四.附錄:
原創,參考自官方文件。
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px 'Helvetica Neue'}
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px 'Helvetica Neue'}
作者微訊號(持續更新)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-1427793/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【DATAGUARD】Oracle Dataguard體系架構詳解Oracle架構
- oracle體系結構(轉)Oracle
- 【Oracle體系結構】 Oracle19C 系統結構介紹Oracle
- 3:Oracle體系結構(邏輯結構)Oracle
- 0718_oracle 體系結構Oracle
- Tungsten Fabric架構解析丨詳解vRouter體系結構架構VR
- 【PG體系結構】Postgresql 配置檔案詳解SQL
- Oracle OCP(37):Database 體系結構OracleDatabase
- Java Servlet詳解(體系結構+註解配置+生命週期)JavaServlet
- Oracle體系結構學習筆記Oracle筆記
- Go 結構體標籤詳解Go結構體
- .NET平臺系列7 .NET Core 體系結構詳解
- Oracle體系結構概述與SQL解析剖析OracleSQL
- JVM之記憶體結構詳解JVM記憶體
- c 結構體記憶體對齊詳解結構體記憶體
- RNN 結構詳解RNN
- oracle 12c 多租戶體系結構概念Oracle
- Oracle 19c資料庫體系結構-2Oracle資料庫
- Oracle 19c資料庫體系結構-1Oracle資料庫
- Oracle 20C 多租戶_體系結構介紹Oracle
- Oracle記憶體結構(二)----Shared Pool的詳細資訊(轉)Oracle記憶體
- Oracle記憶體結構(三)----Process Memory的詳細資訊(轉)Oracle記憶體
- Tomcat結構原理詳解Tomcat
- 瞭解計算機體系結構(4)計算機
- 詳細瞭解 InnoDB 記憶體結構及其原理記憶體
- 【PG體系結構】PG體系結構簡單說明
- Oracle多租戶管理員指南-體系結構介紹01Oracle
- MySQL 體系結構MySql
- 【JVM體系結構】JVM
- BeanFactory體系結構Bean
- MongoDB 體系結構MongoDB
- Servlet 體系結構Servlet
- JavaScript --- Map集合結構詳解JavaScript
- MachO 檔案結構詳解Mac
- JavaScript — Map集合結構詳解JavaScript
- 資料結構:棧詳解資料結構
- 詳解 Go 空結構體的 3 種使用場景Go結構體
- Oracle OCP(39):Database 記憶體結構OracleDatabase記憶體
- Spring框架系列(6) - Spring IOC實現原理詳解之IOC體系結構設計Spring框架