Oracle 資料庫體系結構
資料庫伺服器是現代資訊系統中的一個關鍵元件。
通常而言,伺服器能夠可靠地管理多使用者環境中的大量資料,為使用者提供併發的資料訪問。資料庫伺服器同時能夠阻止未授權的訪問,並提供有效的故障恢復方案。
資料庫與例項
一個 Oracle 資料庫伺服器(database server)由一個數據庫(database)以及至少一個資料庫例項(database instance,通常簡稱例項)組成。正是由於例項和資料庫之間的關係如此緊密,Oracle database 有時候同時表示例項和資料庫。
嚴格來說,這些術語的意義如下:
-
資料庫(Database)
資料庫代表磁碟上的一組檔案,用於儲存資料。這些檔案可以獨立於例項而存在。
-
資料庫例項(Database instance)
例項是一組記憶體結構,用於管理資料庫檔案。例項由一個稱為系統全域性區(SGA)的共享記憶體區域以及一組後臺程序組成。例項可以獨立於資料庫檔案而存在。
下圖顯示了一個數據庫和它的例項。對於每個連線到例項的使用者連線,客戶端程序負責執行應用程式。每個客戶端程序與自己的伺服器程序關聯。伺服器程序擁有自己的私有會話記憶體,稱為程式全域性區(PGA)。
圖 1-1 Oracle 例項與資料庫
圖中 SGA 包括資料庫緩衝區快取記憶體(Database Buffer Cache)、重做日誌緩衝區(Redo Log Buffer)、共享池(Shared Pool)、大池(Large Pool)、固定 SGA(Fixed SGA)、Java 池(Java Pool)以及流池(Streams Pool)。SGA 右邊是後臺程序:PMON、SMON、RECO、MMON、MMNL 等。SGA 下邊也是後臺程序:DBWn、CKPT、LGWR、ARCn 以及 RVWR。再往下是 PGA 和伺服器程序。伺服器程序和客戶端程序相互連線。客戶端程序右邊是資料庫檔案(資料檔案、控制檔案以及線上重做日誌)、歸檔重做日誌以及閃回日誌。
雖然嚴格來說,一個 Oracle 資料庫就是一組物理結構(檔案和記憶體結構),應用程式可以與一個物理資料庫中的多個邏輯資料庫進行互動,也可以與跨越多個物理資料庫的一個邏輯資料庫進行互動。
本節包含以下主題:
- 多租戶體系結構
- 分片系統結構
多租戶體系結構
多租戶體系結構(multitenant architecture)使得 Oracle 資料庫能夠成為一個多租戶容器資料庫(CDB)。
一個非 CDB 表示傳統的 Oracle 資料庫,不能包含可插拔資料庫(PDB)。一個 CDB 表示一個物理資料庫,可以包含零個、一個或者多個使用者建立的可插拔資料庫。一個可插拔資料庫(PDB)是一個包含模式、模式物件以及非模式物件的可移動的集合,對於 Oracle Net 客戶端而言,它就像一個傳統的非 CDB。
注意:CDB 與 非 CDB 的體系結構不同,除非特定指出,本手冊主要介紹非 CDB 的體系結構。
多租戶體系結構的優勢
多租戶體系結構解決了傳統的非 CDB 結構帶來的諸多問題。
大型企業往往需要成百上千個數據庫,它們通常執行在許多物理伺服器中的不同平臺之上。現代伺服器能夠處理更多的負載。資料庫可能只利用了一部分的伺服器硬體能力。這種方式即浪費了硬體,又浪費了人力。
多租戶體系結構通過將不同計算機上的多個物理資料庫進行合併,整合為單個計算機上的單個數據庫,帶來了以下優勢:
- 降低了硬體成本
- 更加簡單快速地移動資料和程式碼
- 更加簡單地管理和監控物理資料庫
- 資料和程式碼的分離
- 管理員職責分離,PDB 管理員值管理授權的 PDB,CDB 管理員管理整個 CDB
同時,也為可管理性帶來了以下優勢:
- 通過 PDB 的插拔操作,資料和程式碼的升級更加簡單
- 測試更加簡單,在開發環境中使用 PDB,測試完成後將它們插入到生產環境中的 CDB
- 支援將單個 PDB 閃回到之前的 SCN
- 允許在 PDB 級別設定記憶體和 I/O 的效能限制
- 能夠在一個應用容器(application container)內安裝、升級和管理一個總體的應用(application),應用容器包含一組插入到應用根容器(application root)中的 PDB。
資料庫合併
資料庫合併(Database consolidation)是將一個或多個非 CDB 中能夠的資料遷移到一個 CDB 中的一般過程。
從 Oracle Database 12c 開始,建立資料庫時必須指定建立 CDB 還是非 CDB。可以將一個傳統的非 CDB 作為 PDB 插入到 CDB 中。PDB/非 CDB 相容性保證意味著對於使用 Oracle Net 進行連線的客戶端而言,PDB 和 非 CDB 一樣。
下圖顯示了兩個獨立的非 CDB:hr 和 sales。每個非 CDB 位於獨立的伺服器,擁有各自的記憶體和資料庫檔案。每個非 CDB 擁有專用的應用程式。
圖 1-2 非 CDB
接下來是合併到一個叫做 MYCDB 的容器資料庫之後的結構圖。
圖 1-3 合併非 CDB 到 CDB
從物理上來說,MYCDB 是一個 Oracle 資料庫。 MYCDB 擁有一個數據庫例項(在 Oracle Real Application Clusters 環境中可以存在多個例項)以及一組資料庫檔案,這些和非 CDB 一樣。
MYCDB 包含兩個 PDB:hrpdb 和 salespdb。如圖 1-3 所示,這些 PDB 對於它們的應用程式而言,與合併之前沒無差別。管理 CDB 或者其中的任何 PDB 時,CDB管理員可以連線到 CDB 根容器(root),它包含了一組模式、模式物件以及非模式物件的集合,所有的 PDB 都屬於該容器。
應用容器
從 Oracle Database 12c Release 2 (12.2) 開始,使用者可以建立應用容器(application container),用於儲存一個或多個應用模型(application model)的資料和元資料。
應用(也稱為應用模型)是儲存在應用根容器(application root)中,一個命名的版本化的公共資料和元資料集合。例如,應用模型可以包含表、檢視、使用者帳戶以及PL/SQL 包的定義,這些公共物件為一組 PDB 所共享。
某種程度而言,一個應用容器就是 CDB 中與某個應用相關的 CDB。應用容器和 CDB 一樣可以包含多個應用 PDB,並且共享 PDB中 的資料和元資料。
例如,一個 SaaS 部署可以使用多個應用 PDB,每個客戶分配一個 PDB,它們共享應用的資料和元資料。比如,下圖中 sales_app 是應用根容器中的應用模型。應用 PDB cust1_pdb 只包含客戶 1 的銷售資料,cust2_pdb 只包含客戶 2 的銷售資料。可以針對單獨的客戶 PDB 執行插入、拔出、複製以及其他的 PDB 級別的操作。
圖 1-4 SaaS 案例
分片系統結構
Oracle 分片(Sharding)是一種資料庫擴充套件技術,它基於跨資料庫的水平資料分割槽。對於應用程式而言,這些分片的資料庫整體就像是一個邏輯上的資料庫。
Sharding 對於 OLTP 應用主要的好處包括線性可擴充套件性、故障隔離以及地理資料分佈。Sharding 非常適合雲端部署。與支援分片的 NoSQL 資料儲存不同的是,Oracle Sharding 既提供了分片的優勢,同時又不需要犧牲企業級 RDBMS 的功能。
在分片體系結構中,每個資料庫都位於專用的伺服器上,用於各自的本地資源:CPU、記憶體、快閃記憶體或者磁碟。其中的每個資料庫都是一個分片(shard)。所有的分片共同組成一個邏輯的資料庫,稱為分片資料庫(SDB)。
水平分割槽將資料庫中的表分割到各個分片中,每個分片包含相同的列,以及資料行的不同子集。以這種方式分割的表被稱為分片表(sharded table)。
下圖顯示了一個被三個節點水平分割的分片表。
圖 1-5 跨分片的水平分割槽表
一種使用場景就是跨多個物理資料庫分散式儲存客戶的帳戶資料。例如,ID 為 28459361 的客戶需要查詢他的記錄。下圖顯示了一種可能的架構。客戶的請求通過一個連線池進行路由,sharding directors(網路監聽器)將該請求分發到合適的分片, 該分片包含了該客戶的所有資料。
圖 1-6 Oracle 分片體系結構
資料庫儲存結構
資料庫可以從物理角度和邏輯角度進行分析。
物理資料是從作業系統層面可見的資料。例如,作業系統工具如 Linux 下的 ls 和 ps 能夠顯示資料庫檔案和程序。邏輯資料,例如表,只對資料庫而言具有意義。SQL 語句能夠檢視 Oracle 資料庫中的表,但是作業系統工具無法檢視。
資料庫儲存物理結構和邏輯結構。由於物理結構和邏輯結構相互獨立,使用者可以管理資料的物理儲存,而不會影響邏輯儲存結構的訪問。例如,重新命名一個數據庫檔案不會修改儲存在檔案中的表的名稱。
物理儲存結構
資料庫的物理結構是指儲存資料的檔案。
當管理員執行一個 CREATE DATABASE
語句時,將會建立一些檔案:
-
資料檔案
每個資料庫包含一個或多個物理資料檔案(data file),它們儲存了資料庫中所有的資料。資料庫邏輯結構中的資料,例如表和索引,儲存在這些物理檔案中。
-
控制檔案
每個 Oracle 資料庫包含一個控制檔案(control file)。控制檔案中儲存了描述資料庫物理結構的元資料,包括資料庫名稱以及資料庫檔案的名稱和位置。
-
線上重做日誌檔案
每個資料庫包含一個線上重做日誌(online redo log),它包含兩個或更多線上重做日誌檔案組。線上重做日誌由重做日誌項(也稱為重做日誌記錄)組成,其中記錄了針對資料的所有變更。
除此之外,還有一些其他的檔案,對於 Oracle 資料庫也非常重要。其中包括引數檔案和網路配置檔案。備份檔案和歸檔日誌檔案是一些離線的檔案,對於備份和恢復至關重要。
邏輯儲存結構
邏輯儲存結構使得 Oracle 資料庫能夠對磁碟的使用進行細粒度控制。
邏輯儲存結構包括:
-
資料塊
從最細粒度來說,Oracle 資料庫中的資料儲存在資料塊(data block)中。一個數據塊對應於磁碟上的特定數量的位元組。
-
區
一個區(extent)是邏輯上連續的一定數量的資料塊,通過一次分配獲取,用於儲存特定型別的資訊。
-
段
段(segment)是為使用者物件(例如表或索引)、回滾資料或者臨時資料分配的一組區。
-
表空間
一個數據庫邏輯上由多個表空間(tablespace)組成。表空間是段的邏輯容器。每個表空間至少包含一個數據檔案。
資料庫例項結構
Oracle 資料庫通過一些記憶體結構和程序來管理和訪問資料庫。所有的記憶體結構都位於資料庫伺服器的主存中。
當應用程式連線到 Oracle 資料庫時,它們實際上是連線到資料庫的例項上。例項為連線分配 SGA 之外的其他記憶體區域,並且啟動後臺程序之外的其他伺服器程序。
Oracle 資料庫程序
程序(process)是作業系統中能夠執行一系列操作的機制。某些作業系統使用其他的術語,包括作業(job)、任務(task)或者執行緒(thread)。
在本節內容中,執行緒等價於程序。一個 Oracle 資料庫例項包含以下程序:
-
客戶端程序
這些程序用於執行應用程式程式碼或者 Oracle 工具。通常客戶端程序來自於多個不同的計算機。
-
後臺程序
這些程序代替 Oracle 伺服器程序完成各種資料庫操作。後臺程序非同步地執行 I/O 操作,並且監控其他 Oracle 資料庫程序,提供了更高的併發,獲得了更好的效能和可靠性。
-
伺服器程序
這些程序用於和客戶端程序通訊,並且和 Oracle 資料庫進行互動,完成各種請求操作。
Oracle 程序包括伺服器程序(server process)和後臺程序(background process)。在大多數情況下,Oracle 程序和客戶端程序執行在不同的計算機上。
例項記憶體結構
Oracle 資料庫為程式程式碼、資料共享以及使用者私有資料區域建立不同的記憶體結構。
資料庫例項涉及以下記憶體結構:
-
系統全域性區(SGA)
SGA 是一組共享的記憶體結構,包含了一個數據庫例項的資料和控制資訊。SGA 元件包括資料庫緩衝區快取記憶體(database buffer cache)和共享的 SQL 區域等等。從 Oracle Database 12c Release 1 (12.1.0.2) 開始, SGA 可以包含一個可選的記憶體列儲存(IM 列儲存),支援資料在記憶體中按照列的方式儲存。
-
程式全域性區(PGA)
PGA 是一個記憶體區域,用於儲存伺服器程序或後臺程序的資料和控制資訊。只有所屬的程序才能夠訪問相應的 PGA。每個伺服器程序和後臺程序都擁有自己的 PGA。
應用及網路體系結構
為了充分利用計算機系統或網路的能力,Oracle 資料庫將整個處理流程劃分為資料庫伺服器和客戶端程式兩部分。執行 RDBMS 的計算機完成資料庫伺服器的職責,執行應用程式的計算機負責解釋和顯示資料。
應用體系結構
應用體系結構(application architecture)是指連線到 Oracle 資料庫的應用程式所在的計算環境。兩種最常見的資料庫體系結構就是客戶端/伺服器(C/S)和多層結構。
-
在客戶端/伺服器結構中,客戶端發起一個操作請求到資料庫伺服器。
伺服器執行 Oracle 資料庫軟體,完成併發的共享資料訪問操作。伺服器接收並處理客戶端的請求。
-
在傳統的多層結構中,一個或者多個應用伺服器承擔一部分資料操作。
應用伺服器(application server)包含大量業務量邏輯,為客戶端提供資料訪問,並且執行一些查詢的處理工作。這種方式下,資料庫的負載得以減輕。應用伺服器可以作為客戶端和各種資料庫之間的介面,並且提供多一層的安全。
面向服務架構(SOA)是一種多層體系結構,應用的功能封裝在服務中。SOA 服務通常作為 Web services 來實現。Web services 可以通過 HTTP 進行訪問,採用基於 XML 的標準傳送資料,例如網路服務描述語言(WSDL)和 SOAP。
Oracle 資料庫可以在傳統的多層結構或 SOA 環境中扮演一個 Web service 提供者。
Oracle 網路體系結構
Oracle 網路服務(Oracle Net Services)是資料庫和網路通訊協議之間的一個介面,支援分散式處理和分散式資料庫。
通訊協議定義了資料在網路上傳輸和接受的方式。Oracle 網路服務支援所有主要的網路協議,包括TCP/IP、HTTP、FTP 以及 WebDAV。
Oracle Net 是 Oracle 網路服務的一個元件,用於建立和維護客戶端與資料庫伺服器之間的網路會話。在網路會話建立之後,Oracle Net 繼續扮演客戶端應用和資料庫伺服器之間的資料信使,為它們完成資訊的交換。Oracle Net 之所以能夠完成這些操作,是因為它存在於網路中的每個計算機之上。
一個重要的網路服務元件就是 Oracle Net Listener(稱為監聽器),它是一個位於資料庫伺服器或者網路中其他位置的程序。客戶端應用將連線請求傳送到監聽器,監聽器管理這些資料庫請求。連線建立之後,客戶端與資料庫直接進行通訊,不再通過監聽器。
最常見的Oracle 資料庫服務配置方式包括:
-
專用伺服器模式
每個客戶端程序連線到一個專用的伺服器程序。伺服器程序在客戶端會話期間不被任何其他客戶端共享。每個新的會話都會分配一個專用的伺服器程序。
-
共享伺服器模式
資料庫為多個會話建立一個共享伺服器程序池。客戶端程序與排程器(dispatcher)進行通訊,它支援多個客戶端連線到同一個資料庫例項,而不需要為每個客戶端分配一個專用的伺服器程序。