Oracle 和 DB2,比較與相容性/架構/DB2
用於儲存有關 DB2 通用資料庫 (DB2) 和資料庫資料的資訊的物理檔案是在檔案系統上使用 CREATE DATABASE 命令在目錄中建立的。以下描述的是實際儲存在磁碟上的結構。它們用於儲存使用者資訊和管理資料庫例項的操作。它們是日誌檔案、控制檔案、鎖定檔案和配置檔案等。DB2 如何將這些物理結構對映到 DBMS 使用的邏輯結構(如容器、頁面和表空間)將在後面介紹。
這些檔案可以儲存在原始裝置上,也可以儲存在檔案系統檔案和目錄中。在這個層次結構中,為每個例項建立一個子目錄,以便在同一個目錄中建立的不同例項中的資料庫不會使用相同的路徑。在這個目錄中建立的第一個資料庫名為 SQL00001,它包含與第一個資料庫關聯的所有資料庫物件。
在每個例項子目錄下面,建立另一個名為 NODE0000 的目錄,用於標識邏輯分割槽資料庫中的分割槽。在這個目錄中建立的第一個資料庫名為 SQL00001,它包含與第一個資料庫關聯的所有資料庫物件。隨後建立的資料庫按順序命名,如 SQL00002、SQL00003 等。
物理結構是
Directory identified in CREATE DATABASE
|
+→ Instance
|
+→ NODE0000
|
+→ SQL00001
|
+→ SQL00002
資料庫目錄包含以下檔案和目錄
- SQLDBCON – database configuration information
- The SQLOGDIR directory – contains database log files
|
+ --> SQLLOGCTL.LFH and SQLOGMIR.LFH – log control information files.
These files contain information about the active logs and are used in database recovery
- SQLINSLK – a lock files that ensures that each database is used by only one databasze instance
- DB2RHIST.ASC – a housekeeping file that contains the following data
backup
restore
Table loads
Table reorganizations
Tablespace alterations
- DB2RHIST.BAK – a backup of the DB2RHIST.ASC file
- SQLSPCS.1 and SQLSPCS.2 – table space information, each file is duplicated as a backup
- SQLBP.1 and SQLBP.2 – buffer pool information, each file is duplicated as a backup
DB2 在四個不同的塊中管理記憶體。可以認為記憶體從上到下組織。為資料庫例項分配了記憶體 - 資料庫管理系統 (DBMS),它處理 DBMS 中的所有單個數據庫以及所有例項級任務和活動。在其下方,為每個包含資料庫緩衝池和恢復資訊的單個數據庫分配了記憶體。對於與資料庫關聯的每個應用程式集,都會有記憶體分配,並且在應用程式中,DB2 稱為代理的東西就像做應用程式工作的小子例程或實用程式。因此,從上到下,我們有
• 資料庫例項記憶體(每個 DBMS 例項一個)
• 資料庫全域性記憶體(每個資料庫一個)
• 應用程式全域性記憶體
• 代理私有記憶體(每個應用程式一個)
為每個 DBMS 例項分配的記憶體是資料庫例項記憶體,它每個 DB2 例項分配一個,用於例項級任務,如監控、審計和節點間通訊。它在 DBMS 啟動時分配(db2start),並在停止時釋放(db2stop)。
資料庫例項記憶體中的記憶體池是
• 監控堆
• 審計緩衝區和
• FCM 緩衝區
執行狀況監控器捕獲有關資料庫管理器、資料庫、表空間和表空間容器的資訊。它根據來自資料庫系統監控器、作業系統和 DB2 本身的資料來評估例項的執行狀況。監控堆將為每個指標最多保留十個歷史記錄,並且只能在資料庫處於活動狀態時評估資料庫上的執行狀況指標。
歷史記錄儲存在
Directory specified in CREATE DATABASE
|
+→ Instance
|
+→ hmonCache directory.
歷史記錄在執行狀況監控器停止時被清除。執行狀況監控器在達到十條記錄時也會修剪舊的歷史記錄。
DB2 中的審計功能監控對超出既定身份驗證憑據、許可權和特權的資料的訪問。此功能會生成記錄,這些記錄儲存在審計緩衝區中,然後儲存在磁碟上的審計日誌檔案中。
審計日誌 (db2audit.log) 和審計配置檔案 (db2audit.cfg) 位於
Directory specified in CREATE DATABASE
|
+→ Instance
|
+→ security directory.
DB2 使用快速通訊管理器 (FCM) 來控制資料庫分割槽和代理之間資訊流。FCM 所需的記憶體被分配為資料庫例項的 FCM 緩衝區。
為資料庫例項記憶體預留的記憶體大小在 instance_memory 引數中指定。預設值為 AUTOMATIC,DB2 將根據監控堆、審計緩衝區和 FCM 緩衝區的大小計算記憶體量。還會為溢位緩衝區分配額外的記憶體,以滿足堆超出配置限制時的記憶體請求。
這樣,可以看出 DB2 透過動態管理其組成部分來有效地處理資料庫例項記憶體。
為每個資料庫分配的記憶體是資料庫全域性記憶體,它每個資料庫分配一個,用於備份和恢復、鎖定和 SQL 執行。它在您啟動或首次連線到資料庫時分配,並在您停止或斷開連線時釋放。資料庫啟動時,DB2 會根據需要完全或部分分配記憶體池。
在資料庫全域性記憶體中,有多個記憶體池。這些記憶體池中大多數的大小由它們的配置設定預先確定,但是包快取和目錄快取是動態的,因為您可以有任意數量的應用程式連線到資料庫。包快取用於快取 SQL 查詢的訪問計劃。目錄快取是 DB2 資料字典。此外,實用程式堆是動態分配的。它用於備份等實用程式,並且最初僅為此分配了 16 KB 記憶體。實用程式啟動後,將分配實用程式堆的全部記憶體。鎖定列表是儲存有關資料庫上持有的鎖定的資訊的緩衝區。它是在多使用者併發訪問中維護資料庫一致性的重要組成部分。
您可以配置 DB2 根據其包含的記憶體池的大小計算資料庫全域性記憶體的大小。它還會為溢位緩衝區分配額外的記憶體,以處理記憶體需求峰值(例如,如果備份由於某種原因需要超過配置的記憶體)。
這樣,可以看出 DB2 透過動態管理其組成部分來有效地處理資料庫全域性記憶體。
通常,資料庫全域性記憶體的最大組成部分是緩衝池。資料庫必須至少有一個緩衝池,所有資料和索引都在其中處理。資料庫可能有多個緩衝池,具體取決於工作負載和資料庫頁面大小。緩衝池的大小受可定址記憶體架構的限制。如果資料庫配置檔案 SQLBP.1 和 SQLBP.2 中的緩衝池分配太大而無法放入可定址記憶體空間,則資料庫將無法啟動。為了解決這個問題,在資料庫啟動時會分配四個小的附加緩衝池。它們分別為頁面大小 4K、8K、16K 和 32K,這些緩衝池將用於啟動 DB2(帶錯誤),以便您可以更改主緩衝池的大小。此外,可以擴充套件主緩衝池以解決此問題。此擴充套件儲存充當從主緩衝池中彈出頁面的快取。它們不會被寫入磁碟,而是儲存在擴充套件儲存中,這將它們保留在主記憶體中並減少磁碟 I/O。存在權衡,因為主記憶體是有限的,擴充套件儲存以犧牲其他記憶體池為代價分配。
排序堆閾值記憶體池用於排序,DB2 執行兩種型別的排序 - 私有排序和共享排序。共享排序使用資料庫共享記憶體池中的記憶體,私有排序在代理的私有記憶體中進行(稍後介紹)。
如果檢索的行沒有索引,或者最佳化器決定排序比索引掃描更有效,則執行排序。配置引數 SHEAPTRES 指定例項可以用於私有排序(代理私有記憶體)的記憶體量的軟上限。DB2 透過在達到此限制時限制可用於其他排序的記憶體量來管理這些排序的記憶體。
如果使用並行處理或集中器,DB2 可能會選擇共享排序而不是私有排序。在這種情況下,排序堆將在資料庫全域性記憶體中分配。用於共享排序的最大記憶體量由 SHEAPTHRES_SHR 資料庫引數控制。這是一個針對整個資料庫的硬性限制,用於共享排序的可用記憶體總量。當達到此限制時,請求的應用程式將收到錯誤,並且在記憶體使用量降至 SHEAPTHRES_SHR 限制以下之前,將不再允許任何共享排序記憶體請求。
DB2 應用程式全域性記憶體
[edit | edit source]![]() |
在以下情況下會分配應用程式全域性記憶體:
• 分割槽資料庫
• 使用內部並行處理的非分割槽資料庫
• 啟用了連線集中器
在上述情況不成立的環境中(即非分割槽資料庫),應用程式全域性記憶體的使用最少。
分割槽。
到目前為止,我們一直在描述單片式架構,其中資料庫中的所有使用者資料都表示為一個單元 - 資料、索引、配置檔案和事務日誌都用於完整的資料集。分割槽是一種將整個資料集分解為離散單元的技術,所有單元都在單個數據庫例項下執行,但每個單元都擁有自己的獨立資料、索引、配置檔案和事務日誌集合。
這允許組織將大型資料集分散到多個不同的伺服器上(或在一個大型伺服器上建立多個獨立執行的邏輯分割槽)。這樣做有很多好處 - 可以對單個分割槽進行管理,而不會影響完整的資料集(例如,可以逐分割槽進行備份和恢復)。資料的分離意味著整個資料集不易受到停機的影響(不是所有資料都不可用,而只有一個分割槽不可用)。分割槽可以任意進行 - 按地理區域、日期範圍、組織部門,應有盡有。這允許處理和 I/O 負載分散。總體優勢包括靈活性、安全性、可擴充套件性和速度。DB2 資料庫分割槽功能 (DPF) 的一個很好的特性是,無論您是否使用它,它都是相對透明的 - 按照 DB2 SQL 參考
"分割槽關係資料庫是一個關係資料庫,其資料跨多個分割槽管理 [..]. 資料跨分割槽的分離對大多數 SQL 語句的使用者來說是透明的。"
這意味著將資料庫進行分割槽以實現可擴充套件性或效能目的的決定不需要考慮重新設計現有設計。當然,這個選項不是免費的,但當決定變得更大或更快時,它就很好,因為這僅僅歸結為硬體和許可證成本效益分析。
分割槽將在第 4 章中詳細介紹。它在這裡介紹是因為它與應用程式全域性記憶體有關。提高分割槽效率的一種方法是,應用程式邏輯可以在應用程式級別(在代理私有記憶體中)本地化,或者在應用程式全域性記憶體中的分割槽級別本地化 - 這樣,針對特定分割槽的處理可以在應用程式級別在該分割槽內完成,但針對整個資料集的處理可以抽象到分割槽級別。這對應用程式全域性記憶體有影響,其中一個影響是,需要為每個應用程式分配記憶體 - 應用程式控制堆,以及為所有應用程式分配記憶體 - 應用程式組共享堆。
應用程式組共享堆由代理用於在分割槽之間共享資訊。它還用於儲存有關臨時表的資訊,以及執行代理的 SQL 語句。從本質上講,它是一個用於分割槽的記憶體池。
非分割槽資料庫上的內部並行處理是指多個代理和子代理可以在同一時間為一個應用程式活動。這些代理在該例項中使用應用程式組共享堆進行應用程式級別的通訊(而不是分割槽級別)。
連線集中器是一種連線池方式。每個到資料庫的連線(來自應用程式和代理)都使用一部分記憶體(以維護連線狀態等)。在擁有數千個連線的大型多使用者資料庫中,這會佔用大量記憶體。問題是,這些連線中可能沒有一個在執行有用的工作,它們可能處於等待狀態 - 這是浪費的。集中器充當多路複用器,所有連線都進入集中器,它保留這些邏輯連線,然後將每個代理的資源請求多路複用到較少數量的實際資料庫連線上。為了做到這一點,集中器需要儲存有關連線的資訊,它使用應用程式組共享堆來完成此操作。
DB2 代理私有記憶體
[edit | edit source]
代理為應用程式執行工作,它們用於以下內容:
• 生成查詢計劃
• 執行查詢計劃
• 處理遊標
• 排序
• 收集統計資訊
每個代理程序都需要記憶體來執行其功能,並且在將代理分配為連線請求或新 SQL 請求的結果時分配此記憶體。從圖中可以看出,代理私有記憶體池是:
• 應用程式堆 - 用於在代表相同請求工作的代理之間共享資訊(對於未使用內部並行處理的非分割槽資料庫來說,這最少)。它還用於儲存臨時表的描述符資訊。
• 排序堆 - 用於處理排序操作,包括排序、雜湊連線和動態點陣圖。
• 語句堆 - 用作 SQL 或 XQuery 編譯器的工作空間,它為每個 SQL 或 XQuery 語句分配和釋放。
• 統計資訊堆 - 用於儲存有關表、關聯索引或統計檢視的特徵的統計資訊,例如:
o number of records
o number of pages
o average record length
最佳化器使用這些統計資訊來確定訪問路徑。
• 查詢堆 - 用於將查詢儲存在代理的私有記憶體中。每個查詢的資訊是:
o the input and output SQL descriptor area
o the statement text
o the SQL communication area
o the package name, creator, section number, and consistency token.
• Java 直譯器堆 - 由 Java 直譯器用於服務 Java 儲存過程和使用者定義函式。
• 代理堆疊大小 - 代理堆疊是每個代理的虛擬記憶體,在 Windows 中,初始堆疊大小設定為防止堆疊溢位錯誤。
為了平衡記憶體限制與速度,您可以讓代理在空閒時保留記憶體。這些空閒代理的記憶體分配會佔用記憶體,因此您可以設定對任何時間點允許的空閒代理數量的限制。擁有空閒代理保留其記憶體的優勢在於,當新的請求進來時,您不需要建立和銷燬它們,而是呼叫空閒代理來處理該請求。
DB2 程序模型
[edit | edit source]
之前,我們描述了資料庫資料是如何佈局在物理磁碟上的,包括使用者資料和 DBMS 執行所需的資訊。接下來,我們描述了 DB2 在 RAM 中使用這些資料時使用的記憶體結構。記憶體中的結構不僅用於資料庫資料,還用於資料庫程式 - 以程序和執行緒形式實現的使用者程式和 DB2 程式。上面的圖是所有 DB2 資料庫共有的程序和執行緒的代表性子集,並提供了對資料庫如何執行的洞察。
DB2 系統控制器 - db2sysc - 是主要的 DB2 執行緒,它是您啟動資料庫時啟動的。每個活動分割槽只有一個多執行緒 db2sysc,它會生成我們接下來要描述的所有其他執行緒 - 其中一些是明確命名的,例如 db2lock,而另一些則簡單地標識為 EDU(引擎可排程單元)。所有程序和執行緒都由 db2sysc 生成(或排程),EDU 是一個統稱,儘管語法上不正確。
資料庫是這些伺服器程序的集合。當它啟動時,它正在執行諸如監視資料庫執行狀況之類的操作,但它基本上只是在執行,它不會執行任何有用的工作,直到客戶端程序連線到它。在本例中,客戶端程序是您的程式 - 您用於建立、管理和訪問資料庫中的資料的 SQL。
客戶端程式可以在遠端或與資料庫伺服器相同的機器上執行。它們透過偵聽器連線到資料庫,併為它們分配協調代理(由 db2sysc 啟動的 db2agent)。如果客戶端在與資料庫例項相同的機器上本地執行,它將透過 db2ipccm 連線,否則它將透過特定於客戶端通訊方法的偵聽器連線,例如,使用 TCP/IP 的客戶端將連線到 db2tcpm 偵聽器,使用 SNA / APPC 的客戶端將使用 db2snacm。
與記憶體架構被分解為例項、資料庫、應用程式和代理記憶體池一樣,程序架構也將被分解為與例項、資料庫、連線和請求程序相關的程序。
防火牆之外有一些程序,這些程序本身不屬於資料伺服器。這些是前面已經描述的使用者程序(本地和遠端),以及諸如以下程序:
• db2fmp - 柵欄模式程序,負責在防火牆之外執行柵欄儲存過程和使用者定義函式。db2fmp 始終是單獨的程序,但根據它執行的例程型別,它可能是多執行緒的。
• db2vend - 為其他程序和執行緒執行供應商程式碼 (*nix 僅限)
例項級執行緒。
前面提到的系統控制器 db2sysc 必須存在,否則您的資料庫無法正常工作。程序模型圖中的其他例項級執行緒是:
• 偵聽器執行緒 db2ippcm 和 db2tpcm 既是例項執行緒,也是連線執行緒,所有子代理執行緒(db2agent、db2agnta、db2agntp 和 db2agnsc)也是如此
• db2wdog - DB2 看門狗僅適用於 *nix 系統,因為 *nix 只能識別其父程序。每當啟動一個新程序時,另一個僅限 *nix 的程序 - 全域性守護程序服務 - db2gds - 會通知 db2wdog。如果任何程序收到異常訊號,此訊號將傳遞給 db2wdog,db2wdog 會通知所有其他例項程序。• db2acd - 自主計算守護程序執行執行狀況監視器、維護實用程式和管理任務計劃程式。
連線執行緒。
所有客戶端連線都獲得一個與之關聯的協調代理 -db2agent-,無論它們是直接與代理通訊,還是透過例項級偵聽器執行緒(例如 db2ipccm 或 db2tcpm)通訊。代理處理應用程式的所有資料庫操作。如果您使用的是內部並行處理,db2agent 會將資料庫請求分發到子代理 - db2agntp。代理可以連線到資料庫、例項或客戶端。代理池儲存空閒代理(在之前的 DB2 記憶體模型中進行了描述)。
資料庫執行緒。
以下是圖 10 中標識的資料庫級別執行緒的列表。這不是一個完整的列表,它用於識別與資料庫操作(如日誌記錄和死鎖檢測)相關的具有 Oracle 和 DB2 公共性的主要執行緒。
• db2pfchr:緩衝池預取器從磁盤獲取資料到記憶體。
• db2pclnr:緩衝池頁面清理器從緩衝池中彈出頁面。
• db2loggr:日誌記錄器處理事務處理和恢復的日誌檔案。
• db2loggw:日誌寫入器將日誌記錄寫入日誌檔案。
• db2logts:表空間日誌記錄器收集有關修改表空間時哪些日誌處於活動狀態的資訊。
• db2dlock:死鎖檢測器識別鎖衝突。在分割槽資料庫中,全域性死鎖程序 - db2glock - 協調每個分割槽上每個 db2dlock 程序的資訊。






