Exchange 儲存結構

 

上次修改主題的時間: 2005-05-23

Exchange 伺服器將檔案儲存在兩種檔案中:.edb 檔及 .stm 檔。.edb 檔與 .stm 檔合在一起,即組成 Exchange 存放庫。例如,Exchange 伺服器上的預設信箱儲存區,使用名為 Priv1.edb 及 Priv1.stm 的檔案。預設的公用資料夾儲存區則使用 Pub1.edb 及 Pub1.stm 這些檔案。.edb 檔包含許多表格,這些表格除了保存 MAPI 郵件的內容之外,還可為 Exchange 儲存區中所有的電子郵件與其他項目保存中繼資料。.edb 檔是一種 ESE 資料庫,由於它主要用來儲存 MAPI 郵件與附件,因此也稱為 MAPI 型資料庫。相反的,.stm 檔則儲存原生網際網路內容。因為網際網路內容是以原生格式撰寫,所以不需要將郵件及其他項目轉換為 Exchange 格式 (如同 Exchange 5.5 與較早的版本)。.stm 檔也是一種 ESE 資料庫,稱為資料流資料庫。.edb 及 .stm 檔以成對的方式運作,且資料庫簽章 (以資料庫建立時間隨機組成的 32 位元號碼) 以標頭的型式儲存在這兩個檔案中。.stm 頁的內部架構儲存在 .edb 檔案中。

note附註:
您可以在 Exchange 系統管理員中重新命名 .edb 及 .stm 資料庫,並將它們移到其他目錄中。完整的 Exchange 儲存存放庫是由 .edb 與 .stm 檔案組合建立而成,因此您必須將這兩個檔存放在一起,並以不同的副檔名 (就是 .edb 及 .stm) 為它們指派相同的名稱。

Exchange Server 2003 使用交易來控制儲存群組中的變更。這些交易會記錄在交易記錄中,類似於在傳統的資料庫中儲存交易的情形。變更將根據交易的成功與否而確認或復原。若交易失敗,則可以使用交易記錄 (搭配使用資料庫檔案,在某些情況中是搭配檢查點檔案) 來還原資料庫。這項能夠管理交易的功能,即為 Microsoft Exchange Information Store 服務 (Store.exe)。任何未經確認的交易記錄項目,也會視為目前 Exchange 資料庫的一部份,如下圖所示。

c236b0b1-1e8b-4f56-9643-4813d0d54acc

Exchange Server 2003 中有下列兩種資料庫:

  • 私人儲存區資料庫   這些資料庫可儲存信箱與 MAPI 型郵件連接器的郵件佇列。
  • 公用儲存區資料庫   這些資料庫可儲存公用資料夾階層與公用資料夾內容。

下圖說明內部 Exchange 儲存區結構。Microsoft Exchange Information Store 服務 (Store.exe) 使用「可延伸式儲存引擎 (ESE)」來存取檔案系統中的資料庫檔案,並透過不同的介面,如 MAPIsvr、ExPOP、ExIMAP、ExSMTP 及 ExOLEDB,來提供資料的存取。用戶端應用程式及應用程式發展介面 (如 Collaboration Data Objects for Exchange (CDOEX)) 可以使用這些介面,或與郵件資料庫 (MDB) 模組進行通訊。

40668745-b91e-4505-a7b9-ab88974a9ad0

儲存群組

每個儲存群組,都是由儲存群組之中所有資料庫 (.edb 檔與 .stm 檔) 的一組記錄檔與輔助檔 (內部暫存資料庫、檢查點檔案及保留記錄) 所組成。Exchange Server 2003 支援多個儲存群組,並在每個儲存群組中支援多個資料庫。在 Exchange Server 2003 中,一部伺服器可支援多達 4 個儲存群組,而一個儲存群組最多可支援 5 個資料庫。對多個資料庫的支援,能讓您將數個信箱與公用資料夾分配到多個小型資料庫中,使得資料庫管理更加容易。Exchange 2000 Server 與 Exchange Server 2003 在同一部伺服器上最多可支援 20 個信箱與公用資料夾資料庫。

儲存群組結構

如下圖所述,所有儲存群組皆是由相同的 Store.exe 處理程序所主控。一個 ESE 執行個體代表 一個儲存群組。

6ff925c2-ec78-489a-b8ed-30891a3d25f2

在每個儲存群組中,每對 .edb 與 .stm 資料庫組合即代表一個信箱儲存區或公用資料夾儲存區。如圖 10.3 所示,儲存在特定儲存群組中的所有信箱與公用資料夾,會共用同一組記錄檔與其他系統檔案。這些檔案能啟用交易導向的處理程序。

各儲存群組中的記錄檔與其他系統檔案具有下列用途:

  • <記錄檔前置詞>xxx.chk   這是檢查點檔案 (例如,E00.chk),可判斷那些交易須使用處理程序從交易記錄檔移至資料庫中。當 ESE 將特定的交易寫入磁碟中的資料庫檔案時,檢查點檔案會更新。此更新一律會將檢查點檔案指向上一個成功傳輸到資料庫的交易。此項更新提供了快速的復原機制。然而,將交易確認到資料庫時,不需使用檢查點檔案。ESE 具有直接處理交易記錄檔的能力,並且能夠判斷哪些交易尚未傳輸。使用此處理程序比使用檢查點費時得多。

    note附註:
    可延伸式儲存引擎能確保交易不會重複寫入資料庫中。
  • Exx.log   此為儲存群組目前的交易記錄檔。交易記錄檔讓 ESE 能夠以快速的效率來管理資料儲存。ESE 會將新交易 (如郵件傳遞) 同時儲存在記憶體快取以及交易記錄中。後續將會寫入資料。不需複雜的資料庫作業,新資料就會附加到現有的資料中。稍後,交易會以群組的形式從記憶體快取傳輸到實際的資料庫中,再由資料庫加以更新。
    依預設,名為「預設儲存群組」的預設儲存群組會使用前置詞 E00,因此交易記錄檔的名稱將為 E00.log。E00.log 適用於此儲存群組中所有的信箱與公用儲存區。若您建立其他的儲存群組,則前置號碼會遞增為 E01、E02 及 E03。

  • <記錄檔前置詞>XXXXX.log   這些交易記錄檔沒有任何空間可容納其他資料。依預設,交易記錄檔的大小一律為 5.242.880 個位元組 (5 MB)。理論上記錄檔大小可以變更,但是不建議您這樣做。當記錄已滿時,會重新予以命名,以便重新建立一個空的交易記錄檔。重新命名的交易記錄檔將沿用舊記錄檔的名稱。舊記錄檔的命名格式為 <記錄檔前置詞>XXXXX.log (例如 E00XXXXX.log),其中 XXXXX 代表從 00000 到 FFFFF 的 5 位數十六進位數字。舊記錄檔與目前的交易記錄檔位於相同的目錄中。

  • Res1.log 及 Res2.log   這些是針對儲存群組所保留的交易記錄檔。保留的記錄檔可作為交易的緊急存放庫。即使伺服器的磁碟已滿,無法將新交易寫入記錄檔,這些保留的記錄檔仍能提供足夠的磁碟空間,讓交易從記憶體寫入硬碟中。保留的記錄檔位於交易記錄目錄中。初始資料庫時,即會自動建立保留的記錄檔。在這之後即無法建立。
    ESE 會先使用保留交易記錄檔來完成目前的交易處理程序。接著會傳送錯誤通知到 Store.exe,以安全地卸載 Exchange 儲存區。在應用程式事件日誌中,會有一個項目負責指出此問題。在這種情況下,您應該建立額外的可用硬碟空間 (例如新增硬碟),才能重新裝載資料庫。

  • Tmp.edb   此為處理交易的暫時工作區。Tmp.edb 所包含的暫時資訊,會在儲存群組中所有的儲存區卸載時,或在 Exchange Information Store 服務停止時,遭到刪除。

    note附註:
    Tmp.edb 不包含在線上備份中。
  • <檔案名稱>.edb   這些是適用於個別的私人儲存區或公用儲存區的 RTF 資料庫檔案。預設私人儲存區的 RTF 資料庫檔案名稱為 Priv1.edb。預設公用儲存區的檔案名稱則為 Pub1.edb。

  • <檔案名稱>.stm   這些為適用於個別資料庫的資料流網際網路內容檔。預設私人儲存區的資料流資料庫檔案名稱為 Priv1.stm。預設公用儲存區的檔案名稱則為 Pub1.stm。

Active Directory 中的儲存群組屬性

您可以在 Exchange 系統管理員中決定儲存群組交易記錄檔的路徑,以及記錄檔的名稱。在所需的儲存群組上按一下滑鼠右鍵,選取 [內容],然後在 [一般] 索引標籤中查看 [交易記錄位置] 與 [記錄檔前置詞] 欄位中的資訊。您可以使用 [瀏覽] 按鈕,將交易記錄與系統檔案移至新位置 (例如個別的實體磁碟機) 中。

儲存群組的組態設定儲存在 Active Directory 中。若您想要使用 ADSI 編輯器來尋找儲存群組的目錄物件,您必須開啟組態命名連絡人,然後依序展開服務節點、CN=Microsoft Exchange、Exchange 組織物件、系統管理群組及伺服器容器。您可以在此處找到名為 CN=InformationStore 的容器,其中包含了儲存群組,如 CN=First Storage Group。儲存群組物件的物件類別為 msExchStorageGroup。若您計劃使用自訂的指令碼來管理 Exchange 儲存區資源,您可以使用「Active Directory 服務介面 (ADSI)」來存取 msExchStorageGroup 物件。

下列程式碼範例將說明如何在名為 Contoso 的 Exchange 組織之中,存取 SERVER01 伺服器上的預設儲存群組。它會顯示該儲存群組的交易記錄檔目前的路徑。

strStorageGroupDN = "CN=First Storage Group," _
                  & "CN=InformationStore," _
                  & "CN=SERVER01,CN=Servers," _
                  & "CN=First Administrative Group," _
                  & "CN=Administrative Groups," _
                  & "CN=Contoso,CN=Microsoft Exchange," _
                  & "CN=Services,CN=Configuration," _
                  & "DC=Contoso,DC=com"
Set oStorageGroup = GetObject("LDAP://" & strStorageGroupDN)
MsgBox oStorageGroup.Get("msExchESEParamLogFilePath")

以 ADSI 為基礎的自訂指令碼中,您可以使用 msExchStorageGroup 物件的下列重要 Exchange 屬性:

  • msExchESEParamCircularLog   此為 Boolean 旗標,可決定循環記錄為啟用或停用。值 0 表示循環記錄停用;值 1 表示循環記錄啟用。
    當確認的變更傳輸到磁碟機上的資料庫時,循環記錄會促使 ESE 捨棄交易。檢查點檔案可指出哪些記錄檔及交易項目已順利確認到資料庫中。任何現存的舊記錄都會被刪除,而目前交易記錄檔中的交易,則會標示為過時的交易。新的交易最終會覆寫目前交易記錄中過時的項目,之後才會建立新的記錄檔。

    note附註:
    循環記錄可透過清除交易而減少磁碟空間的耗損。然而,對於複雜的容錯移轉組態以及某些依賴交易記錄的線上備份類型,循環記錄並不具相容性。啟用循環記錄時,您只能執行完整備份。至於差異或增量備份,由於須依賴交易記錄檔,將無法執行。當您復原資料時,並不能重新顯示交易記錄檔,因此您無法復原最近備份之前的資料。相反的,若並未透過循環記錄自動刪除交易,即有可能復原最近的備份之前的資料,方法是重新顯示仍存在於硬碟上的交易。雖然 Exchange Server 5.5 的循環記錄預設為啟用,但在 Exchange 2000 Server 與 Exchange Server 2003 中,則預設為停用。
  • msExchESEParamEventSource   這是一項與語言無關的程序描述元字串,指向 Exchange Information Store 服務機碼 (MsExchangeIS),此機碼位於 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 下的登錄中。

  • msExchESEParamLogFilePath   此屬性可決定儲存區群組交易記錄檔的路徑,例如 C:\Program Files\Exchsrvr\mdbdata。

  • msExchESEParamLogFileSize   此屬性可指定記錄檔大小,以 KB 為單位。預設值是 5120。請勿變更這個值。

  • msExchESEParamSystemPath   此屬性除了可為任何可能存在的暫存資料庫指定路徑外,還可指定檢查點檔案的路徑,例如 C:\Program Files\Exchsrvr\mdbdata。

  • msExchESEParamZeroDatabaseDuringBackup   這是一種 Boolean 旗標,可決定在備份作業期間,是否要以零來覆寫刪除的記錄與長數值。值 0 表示不覆寫記錄。值 1 表示要以零覆寫資料庫。

  • msExchESEParamEnableOnlineDefrag   這是一種 Boolean 旗標,可決定 Microsoft Exchange Information Store 服務是否應該執行線上資料庫磁碟重組。值 0 表示不執行線上磁碟重組。值 1 表示應該在排定的維護循環期間,執行線上磁碟重組。

    note附註:
    線上磁碟重組可釋放資料庫的可用空間,但是不會減少資料庫檔案的大小。在每次伺服器開關機期間所執行的所謂軟復原程序中,會修正資料庫的不一致。
  • msExchESEParamEnableIndexChecking   這是一種 Boolean 旗標,可決定是否要檢查作業系統版本的 Unicode 索引。值 0 表示不執行索引檢查。值 1 表示要執行索引檢查。此參數會偵測作業系統中由於升級到新版本或套用 Service Pack 而造成的變更。此旗標可判定 Unicode 的排序順序是否已變更。只要作業系統曾以這種方式進行變更,就會自動重新編製索引。

  • msExchESEParamBaseName   此屬性可為儲存群組中的記錄檔指定基本名稱。例如,E00 這個基本名稱,會產生交易記錄檔名稱 E00.log。

  • msExchESEParamDbExtensionSize   此屬性會指定資料庫延伸大小,以分頁為單位。預設值是 2 MB。

  • msExchESEParamDbExtensionSize   此屬性會指定暫存資料庫大小的最小值,以分頁為單位。預設值為 0。

  • msExchESEParamCheckpointDepthMax   此屬性會指定慣用的 (非固定) 檢查點深度上限,以位元組為單位。

儲存群組最小磁碟空間需求

每個儲存群組會消耗大約 50 MB 的可用磁碟空間。上述儲存群組所需的檔案至少會使用 11 MB 磁碟空間。私人與公用儲存區的最小磁碟空間分別為 5 MB 及 8 MB。雖然使用的磁碟空間總計約為 24 MB,但仍需要額外的磁碟空間,才能建立實際的儲存群組,以及進行讀寫作業。

使用儲存群組時,切記下列事項:

  • 執行 Exchange Server 2003 的伺服器最多可擁有 5 個儲存群組。因為已預留其中一個儲存群組供資料庫復原作業使用,所以只剩下 4 個儲存群組可用來保存用戶端可存取的資料庫。若嘗試建立 4 個以上的儲存群組,則會產生錯誤訊息。
  • 您只能在一個儲存群組中建立 5 個資料庫。若嘗試建立更多的資料庫,則會產生錯誤訊息。

Exchange 儲存區資料庫

Exchange Server 使用 ESE 作為內嵌的資料庫引擎,用以決定資料庫的結構以及管理記憶體。資料庫引擎藉由將 4 KB 大小的資料區塊 (分頁) 傳出或傳入記憶體,來快取記憶體中的資料庫。此引擎會更新記憶體中的分頁,並將新增或更新的分頁寫回磁碟中。當要求到達系統時,資料庫引擎可以緩衝記憶體中的資料,因此系統不需要經常存取磁碟。寫入記憶體大約比寫入磁碟快 200,000 倍,因此可讓系統運作更有效率。當使用者提出要求時,資料庫引擎即會將要求載入記憶體,並將分頁標示為記錄變更旗標 (Dirty)。記錄變更旗標頁是指記憶體中含有資料的分頁。這些記錄變更旗標頁稍後會寫入磁碟上的 Microsoft Exchange Information Store 服務資料庫中。

雖然快取記憶體中的資料是處理資料最快也最有效率的方法,但是這表示在執行 Exchange 時,磁碟中的資訊必定有某些部份不是最新的。資料庫的最新版本位於記憶體中,且因為記憶體中有許多變更尚未存入磁碟,所以資料庫與記憶體並未同步。若在記憶體中有任何記錄變更旗標頁尚未傳輸並寫入磁碟中,則會將資料庫標示為不一致。只有在記憶體中的所有記錄變更旗標頁都傳輸到磁碟之後,Exchange 資料庫才會同步。在您妥善地關閉 Microsoft Exchange Information Store 服務之後,就會執行上述動作。在關閉程序中,Microsoft Exchange Information Store 服務會將所有分頁清除到磁碟中。

MAPI 資料庫檔案

Exchange Server 2003 MAPI 資料庫檔案包含表格,可保存所有電子郵件的中繼資料、資料庫中的其他物件以及 MAPI 郵件的內容。在 Microsoft Office Outlook 中顯示的每個資料夾,都是 Exchange 儲存區中的個別資料庫表格。用來檢視這些資料夾的每個排序順序,由表格中不同的索引來表示。Store.exe 處理程序負責管理這些排序順序。

來自 MAPI 用戶端 (如 Outlook) 的郵件會儲存在 MAPI 資料庫中,儲存方式與儲存在舊版 Exchange Server 相同。接著,MAPI 型用戶端不需轉換就可存取這些郵件。然而,若網際網路通訊協定的用戶端嘗試讀取此資料庫中的郵件,則郵件會轉換成要求的格式。

傳統的 .edb 檔與其伴隨的 .stm 檔須視為一體。這兩個檔案在單獨存在的情況下並沒有多大的用處。請務必瞭解,Microsoft Exchange Server Information Store 服務的單一資料庫含有兩個檔案,.edb 檔與 .stm 檔。

.edb 檔案中的記錄含有 JET_coltypSLV 資料類型的欄位,此欄位參照到含有原始資料之資料流檔案中的分頁清單。資料流檔案中資料的空間使用 (最大頁碼,每頁 4 KB) 與總和檢查碼資料,都儲存在 .edb 檔案中。

資料流資料庫檔案

Exchange Server 5.5 與較舊版本會將郵件儲存為郵件資料庫封裝格式 (MDBEF)。此為 Outlook 用戶端的原生格式。當非 MAPI 用戶端要求郵件時,Microsoft Exchange Information Store 服務會根據用戶端的要求,將內容從 MDBEF 轉換為適當的格式。此項轉換會耗損處理器頻寬,並降低伺服器的效能。

較新的 ESE 版本能讓網際網路郵件用戶端以原生格式儲存原始資料。這種原始資料的存放庫就稱為資料流資料庫,或資料流檔案。資料流檔上面沒有平衡樹狀目錄 (B-tree)。但其中包含了兩頁 4 KB 的標頭資訊,以及多頁 4 KB 的原始資料。這種一般的資料結構是針對資料的二進位大型物件 (BLOB) 而設計的,因為這些大型物件不太需要內容轉換,並可快速的接收與傳送。

屬性升級

屬性升級可決定資料儲存在 ESE 資料庫中的位置,因此是一項必須瞭解的重要概念。將保存在 .stm 檔中的屬性升級到 .edb 檔中的這項作業,Microsoft Exchange Information Store 服務可予以支援。屬性升級可讓您更有效率地維護資料夾檢視與索引。例如,串流到 .stm 檔的郵件可將其各種屬性 (如寄件者、主旨、傳送與接收日期) 升級,成為 .edb 檔案中郵件的記錄。

當 MAPI 用戶端 (如 Microsoft Outlook) 提交郵件到 Microsoft Exchange Information Store 服務時,郵件的內容會儲存在 .edb 檔中。若非 MAPI 用戶端開啟了該郵件,Microsoft Exchange Information Store 服務會立即將 MAPI 內容轉換為網際網路格式,方法是執行部份轉換,然後呼叫 IMAIL,接著 IMAIL 會呼叫 RTFHTML 來完成轉換。此種轉換永遠不會持續,亦即不會將資料移出 .edb 檔而寫入 .stm 檔中。

當網際網路用戶端提交郵件到 Microsoft Exchange Information Store 服務時,郵件的內容會儲存在 .stm 檔中。某些來自於網際網路郵件的標頭會被複製到 .edb 檔,讓 Microsoft Exchange Information Store 服務能夠找到該郵件。此即為狀態 0 轉換。

若有任何用戶端要求屬性 (例如 PR_Subject,或其眾多別名之一),則 Microsoft Exchange Information Store 服務會將網際網路郵件的所有標頭資訊升級到屬性中。此即為狀態 1 轉換。

若有任何用戶端要求附件資訊,則 Microsoft Exchange Information Store 服務會建立網際網路郵件的相近複本 (MAPI 格式)。首先,郵件仍位於 .stm 檔中。然而,MAPI 存取所需的大部份資料,位於 .edb 檔中。如果用戶端變更郵件時,也使「多用途網際網路郵件延伸 (MIME)」產生改變,則會丟棄郵件的 .stm 檔案版本,而保留郵件的 .edb 檔。此即為狀態 2 轉換。

不管郵件以哪種方式提交到 Microsoft Exchange Information Store 服務,若 Exchange Server 接收的網際網路內容含有 Application/ms-tnef 內容,則郵件一開始會傳到 .stm 檔,但隨即會進行解碼並移動到 .edb 檔。具有 winmail.dat 附件、以 UUEncode 編碼的郵件也適用上述流程。傳輸中性封裝格式 (TNEF) 與 Winmail.dat 是 MAPI 郵件的封裝方式,可用來在不支援 MAPI 的傳輸上保留 MAPI 屬性。因此,MAPI 郵件位於 .edb 檔而網際網路郵件位於 .stm 檔的這項一般性原則是正確的。目前的功能會先將 TNEF 解碼,然後再讀取其中的 MAPI 屬性。