Oracle體系結構 主要用來分析數據庫的組成、工作過程與原理,以及數據在數據庫中的組織與管理機制。Oracle數據庫是一個邏輯概念,而不是物理概念上安裝了Oracle數據庫管理系統的服務器。
在Oracle數據庫管理系統中有3個重要的概念需要理解,那就是實例(Instance)、數據庫(Database)和數據庫服務器(Database Server)。其中,實例是指一組Oracle后台進程以及在服務器中分配的共享內存區域;數據庫是由基於磁盤的數據文件、控制文件、日志文件、參數文件和歸檔日志文件等組成的物理文件集合;數據庫服務器是指管理數據庫的各種軟件工具(比如,sqlplus、OEM等)和實例及數據庫三個部分。從實例與數據庫之間的辯證關系來講,實例用於管理和控制數據庫;而數據庫為實例提供數據。一個數據庫可以被多個實例裝載和打開;而一個實例在其生存期內只能裝載和打開一個數據庫。
邏輯存儲結構
Oracle的邏輯結構是一種層次結構。主要由:表空間、段、區和數據塊等概念組成。邏輯結構是面向用戶的,用戶使用Oracle開發應用程序使用的就是邏輯結構。數據庫存儲層次結構及其構成關系,結構對象也從數據塊到表空間形成了不同層次的粒度關系。
從上圖可以看到,Oracle數據庫由多個表空間組成(數據庫自身也屬於邏輯概念),而表空間又由多個段組成,段由多個數據區組成,數據區又由多個數據塊組成。
數據塊
數據塊是Oracle邏輯存儲結構中最小的邏輯單位,也是執行數據庫輸入輸出操作的最小存儲單位。數據塊中可以存放表數據、索引數據和簇數據,無論存放那種類型的數據,其結構都是相同的。數據塊有數據頭、表目錄、行目錄、空余空間和行數據組成。
塊頭、表目錄、行目錄三部分為頭部信息區,頭部信息區不存放數據,它存放整個塊的引導信息,引導系統讀取系統數據。若頭部信息遭到破壞,則Oracle系統將無法讀取此數據塊數據。空余空間和行數據共同構成塊的存儲區,用於存儲數據記錄。
頭部信息區:
塊頭存放塊的基本信息,塊的物理地址、所屬段的類型等;表目錄存放表相關的信息;行目錄存放行信息。
存儲區:
空余空間是一塊未被使用的區域,該區域用於新行的插入以及已經存在的行的更新;行數據用於存放表數據和索引數據。
通過v$parameter數據字典來查詢Oracle標准數據塊的大小:
col name format a30 col value format a20 select name,value from v$parameter where name = 'db_block_size' ;
數據區(Extent)
數據區(也可稱作數據擴展區)是由一組連續的Oracle數據塊所構成的Oracle存儲結構,一個或多個數據塊組成一個數據區,一個或多個數據區再組成一個段(Segment)。當一個段中的所有空間被使用完后,Oracle系統將自動為該段分配一個新的數據區,這也正符合Extent這個單詞所具有的“擴展”的含義,可見數據區是Oracle存儲分配的最小單位,Oracle就以數據區為單位進行存儲控件的擴展。
使用數據區的目的是用來保存特定數據類型的數據,也是表中數據增長的基本單位。在Oracle數據庫中,分配存儲空間就是以數據區為單位的。一個Oracle對象包含至少一個數據區。設置一個表或索引的存儲參數包含設置它的數據區大小。
段(Segment)
段由一個或多個數據區構成的,它不是存儲空間的分配單位,而是一個獨立的邏輯存儲結構,它用於存儲表、索引或簇等占用空間的數據對象,Oracle也把這種占用空間的數據對象統一稱為段。一個段只屬於一個特定的數據對象,每當創建一個具有獨立段的數據對象時,Oracle將為它創建一個段。
段是為特定的數據對象(如表、索引、回滾等)分配的一系列數據區。段內包含的數據區可以不連續,而且可以跨越多個文件,使用段的目的是用來保存特定對象。一個Oracle數據庫通常有四種類型的段。
- 數據段:數據段中保存的是表中的數據記錄。在創建數據表時,Oracle系統將為表創建數據段。當表中的數據量增大時,數據段的大小自然也隨着變大,數據的增大過程是通過向其添加新的數據區來實現的。當創建一個表時,系統自動創建一個以該表的名字命名的數據段。
- 索引段:索引段中包含用於提高系統性能的索引。一旦建立索引,系統自動創建一個以該索引的名字命名的索引段。
- 回滾段:也叫撤銷段,回滾段保存了回滾條目,Oracle將修改前的舊值保存在回滾條目中。利用這些信息,可以撤銷未提交的操作,以便為數據庫提供讀入一致性和回滾未提交的事務,即用來回滾事務的數據空間。
- 臨時段:當執行創建索引、查詢等操作時,Oracle可能會使用一些臨時存儲空間,用於暫時性的保存解析過的查詢語句以及在排序過程中產生的臨時數據。Oracle系統將在專門用於存儲臨時數據的表空間中為操作分配臨時段。
注:在執行“create index”、“select order by”、“select distinct”和“select group by”等幾種類型的sql語句時,Oracle系統就會在臨時表空間中為這些語句的操作分配一個臨時段。
表空間(TableSpace)
Oracle使用表空間將相關的邏輯結構(如段、數據區)組合在一起,表空間是數據庫最大的邏輯划分區域,通常用來存放數據表、索引、回滾段等數據對象,任何數據對象在創建時都必須被指定存儲在某個表空間中。表空間(屬邏輯存儲結構)與數據文件(屬物理存儲結構)相對應,一個表空間由一個或多個數據文件組成,一個數據文件只能屬於一個表空間;Oracle數據的存儲空間在邏輯上表現為表空間,而在物理上表現為數據文件。表空間類似於操作系統中的文件夾,而數據文件就相當於文件夾中的文件。每個數據庫至少有一個表空間(SYSTEM表空間),表空間的大小等於所有從屬於它的數據文件大小的總和。
在創建數據庫時,Oracle會自動創建多個默認的表空間,這些表空間除了管理用於管理用戶數據的表空間之外,還包括用於管理Oracle系統內部數據的表空間。Oracle11g默認創建的主要表空間:
SYSTEM表空間:存放Oracle系統內部表和數據字典的數據。Oracle本身不贊成將用戶創建的表、索引等存放到系統表空間。表空間中的數據文件不是固定不變的,可以根據需要向表空間中追加新的數據文件。
SYSAUX表空間:此表空間是Oracle 11g新增的表空間,是隨着數據庫的創建而創建,它充當SYSTEM的輔助表空間,降低SYSTEM表空間的負荷,主要存儲數據字典以外的其他數據對象。此表空間一般不存儲用戶數據,由Oracle系統內部自動維護。
UODO表空間:撤銷表空間,用於存儲撤銷信息的表空間。
USERS表空間:用戶表空間,Oracle建議用戶使用的表空間,可以在這個表空間上創建各種數據對象(創建表、索引、用戶等數據對象)。(除了Oracle系統默認創建的表空間外,用戶可以根據應用系統的實際情況及其所要存放的對象類型創建多個自定義的表空間,以區分用戶數據與系統數據。不同的數據應存放在不同的表空間,而不同的表空間的文件應該存放在不同的盤上,從而減少IO沖突,提高應用系統的操作性能)
物理存儲結構
物理存儲結構描述了Oracle數據庫中數據在操作系統中的組織和管理,它是指存儲在磁盤上的物理文件,包括數據文件、控制文件、重做日志文件、初始化參數文件、跟蹤文件、歸檔文件等。
數據文件
數據文件是用於保存用戶應用程序數據和Oracle系統內部數據的文件,這些文件在操作系統中就是普通的操作系統文件,Oracle在創建表空間的同時會創建數據文件。Oracle數據庫在邏輯上由表空間組成,每個表空間可以包含一個或多個數據文件,一個數據文件只能隸屬於一個表空間。
通過查詢dba_data_files或v$datafile數據字典來了解Oracle系統的數據文件信息:
col file_name for a50; set linesize 100; select file_name,tablespace_name from dba_data_files;
控制文件
控制文件是一個二進制文件,它記錄了數據庫的物理結構,其中主要包含數據庫名、數據文件與日志文件的名字和位置、數據庫建立日期等信息。控制文件一般在Oracle系統安裝時或創建數據庫時自動創建,控制文件所存放的路徑由服務器參數文件spfileorcl.ora的control_files參數值來指定。
由於控制文件存放有數據文件、日志文件等的相關信息,因此,Oracle實例在啟動時必須訪問控制文件。如果控制文件正常,實例才能加載並打開數據庫;但若控制文件中記錄了錯誤的信息,或者實例無法找到一個可用的控制文件,則實例無法正常啟動。
日志文件
日志文件的主要功能是記錄對數據所作的修改,對數據庫所作的修改幾乎都記錄在日志文件中。在出現問題時,可以通過日志文件得到原始數據,從而保障不丟失已有操作成果。Oracle的日志文件包括重做日志文件(Redo Log File)和歸檔日志文件(Archive Log File),它們是Oracle系統的主要文件之一,尤其是重做日志文件,它是Oracle數據庫系統正常運行所不可或缺的。
- 重做日志文件:用於記錄數據庫所有發生過的更改信息(修改、添加、刪除等)及由Oracle內部行為(創建數據表、索引等)而引起的數據庫變化信息(方便數據庫恢復)。
- 歸檔日志文件:用於保存已經寫滿的重做日志文件
服務器參數文件
服務器參數文件SPFILE(Server parameter File)是二進制文件,用來記錄了Oracle數據庫的基本參數信息(如,數據庫名、控制文件所在路徑、日志緩沖大小等)。數據庫實例在啟動之前,Oracle系統首先會讀取SPFILE參數文件中設置的這些參數,並根據這些初始化參數來配置和啟動實例。比如,設置標准數據塊的大小(即參數db_block_size的值)、設置日志緩沖區的大小(即參數log_buffer的值)等等,所以SPFILE參數文件非常重要。服務器參數文件在安裝Oracle數據庫系統時由系統自動創建,文件的名稱為SPFILEsid.ora,sid為所創建的數據庫實例名。
與早期版本的初始化參數文件INITsid.ora不同的是,SPFILE中的參數由Oracle系統自動維護,如果要對某些參數進行修改,則盡可能不要直接對SPFILE進行編輯,最好通過企業管理器(OEM)或ALTER SYSTEM命令來修改,所修改過的參數會自動寫到SPFILE中。
1.查看服務器參數
2.修改服務器參數
密碼文件、警告文件和跟蹤文件
Oracle系統運行時,除了必須的數據文件、控制文件、日志文件及服務器參數文件外,還需要一些輔助文件,如,密碼文件、警告文件和跟蹤文件(一般稱之為外部文件)
Oracle服務器結構
系統全局區
系統全局區(System Global Area)是所有用戶進程共享的一塊內存區域,也就是說,SGA中的數據資源可以被多個用戶進程共同使用。SGA主要由高速數據緩沖區、共享池、重做日志緩存區、java池和大型池等內存結構組成。SGA隨着數據庫實例的啟動而加載到內存中,當數據庫實例關閉時,SGA區域也就消失了。
程序全局區
程序全局區(Program Global Area)也可稱作用戶進程全局區,它的內存區在進程私有區而不是共享區中。雖然PGA是一個全局區,可以把代碼、全局變量和數據結構都可以存放在其中,但區域內的資源並不像SGA一樣被所有的用戶進程所共享,而是每個Oracle服務器進程都只擁有屬於自己的那部分PGA資源。
在程序全局區(PGA)中,一個服務進程只能訪問屬於它自己的那部分PGA資源區,各個服務進程的PGA區的總和即為實例的PGA區的大小。通常PGA區由私有SQL區和會話區組成。
前台進程
1、用戶進程
用戶進程是指那些能夠產生或執行SQL語句的應用程序,無論是SQL*Plus,還是其它應用程序,只要是能生成或執行SQL語句,都被稱作用戶進程。
2、服務器進程
服務進程就是用於處理用戶會話過程中向數據庫實例發出的SQL語句或SQL*Plus命令,它可以分為專用服務器模式和共享服務器模式。
前台進程
Oracle后台進程是一組運行於Oracle服務器端的后台程序,是Oracle實例的重要組成部分。進程包括DBWR、CKPT、LGWR、ARCH、SMON、PMON、LCKN、RECO、DNNN、SNPN。其中SMON、PMON、DBWR、LGWR和CKPT這5個后台進程必須正常啟動,否則將導致數據庫實例崩潰。此外,還有很多輔助進程,用於實現相關的輔助功能,如果這些輔助進程發生問題,只是某些功能受到影響,一般不會導致數據庫實例崩潰。
數據字典
Oracle數據字典的名稱由前綴和后綴組成,使用下划線“_”連接,其代表的含義如下:
- DBA_:包含數據庫實例的所有對象信息。
- V$_:當前實例的動態視圖,包含系統管理和系統優化等所使用的視圖。
- USER_:記錄用戶的對象信息。
- GV_:分布式環境下所有實例的動態視圖,包含系統管理和系統優化使用的視圖。
- ALL_:記錄用戶的對象信息機被授權訪問的對象信息。
常用數據字典
數據字典名稱 | 說明 |
dba_tablespaces | 關於表空間的信息 |
dba_ts_quotas |
所有用戶表空間限額 |
dba_free_space | 所有表空間中的自由分區 |
dba_segments | 描述數據庫中所有段的存儲空間 |
dba_extents | 數據庫中所有分區的信息 |
dba_tables | 數據庫中所有數據表的描述 |
v$database | 描述關於數據庫的相關信息 |
v$datafile | 數據庫使用的數據文件信息 |
v$log | 從控制文件中提取有關重做日志組的信息 |
v$logfile | 有關實例重置日志組文件名及其位置的信息 |