適用於:SQL Server 2022 (16.x)
包含式可用性群組是支援下列項目的 Always On 可用性群組:
除了在執行個體層級之外,還在可用性群組層級管理中繼資料物件(例如使用者、登入、權限、SQL Agent 作業等)。
可用性群組 (AG) 中專門的封閉系統資料庫。
本文詳細說明封裝 AG 的相似性、差異和功能。
概觀
AG 通常由一個或多個使用者資料庫組成,這些資料庫旨在作為協調的群組運作,並會複寫到叢集中的若干節點。 當節點或主機主副本節點的 SQL Server 健康狀況發生故障時,資料庫群組會作為一個單位移動到 AG 中的另一個副本節點。 所有使用者資料庫在所有 AG 副本間保持同步,無論是同步或非同步模式。
這種架構非常適合只與該組使用者資料庫互動的應用程式。 然而,當應用程式同時依賴使用者、登入、權限、代理工作及其他儲存在系統資料庫中的master 物件(或 msdb)時,挑戰就會出現。 為確保應用程式順暢且可預測地運作,管理員必須 手動 確保這些物件的任何變更都能在 AG 中所有副本實例中重複進行。 如果你在可用性群組中添加一個新實例,你可以用一個簡單的流程自動或手動初始化資料庫。 不過,你必須重新配置新實例上的所有系統資料庫自訂,以匹配其他副本。
自主可用性群組擴充了所複寫的資料庫群組概念,加入 master 和 msdb 資料庫的相關部分。 您可以將其想成是使用自主可用性群組之應用程式的執行內容。 其理念是,包含在 AG 環境中的設定會影響依賴這些設定的應用程式。 因此,自主 AG 環境會影響與應用程式互動的所有資料庫、所使用的驗證 (登入、使用者、權限)、預期執行的任何排程工作,以及影響應用程式的其他組態設定。
此概念與包含式資料庫不同,後者使用不同的使用者帳號機制,將使用者資訊儲存在資料庫本身中。 自主資料庫只會複寫登入和使用者,而複寫登入或使用者的範圍僅限於該單一資料庫 (及其複本)。
相較之下,在受控的 AG 中,你可以在 AG 層級建立使用者、登入、權限等等。 這些物件在 AG 內的副本 間自動 一致,也在該 AG 內的資料庫間保持一致。 這種一致性讓管理員不必手動做這些變更。
SQL Server 2025 變更
SQL Server 2025(17.x)引入了針對包含可用性群組的 分散式可用性群組 支援。
差異
當你使用受控的AG時,請考慮一些實際的差異。 這些差異包括建立受包含的系統資料庫,以及強制在受包含的 AG 層級進行連線,而非在實例層級連接。
封閉系統資料庫
每個包含的可用性群組都有自己的 master 和 msdb 系統資料庫,這些資料庫是以該可用性群組的名稱命名的。 例如,在受限自動可用性群組 MyContainedAG 中,您會擁有名為 MyContainedAG_master 和 MyContainedAG_msdb 的資料庫。 這些系統資料庫會自動初始化到新的副本,而更新會像可用性群組中的其他資料庫一樣複製到這些資料庫。 當您連接到包含式可用性群組(AG)時,即使新增物件如登入或代理工作,您仍然可以看到代理工作。而當包含式可用性群組發生故障轉移至另一伺服器實例時,仍然可以使用在該包含式可用性群組中建立的登入帳戶進行驗證。
重要
封裝可用性群組是一種機制,用於在可用性群組的複本之間保持執行環境配置的一致性。 它們「不」代表安全性界限。 舉例來說,沒有邊界能阻止連接到包含的 AG 的連線存取 AG 以外的資料庫。
新建立的獨立可用性群組 (Contained AG) 內的系統資料庫並不是從執行 CREATE AVAILABILITY GROUP 命令的實例中複製來的。 它們一開始是沒有資料的空白範本。 建立後立即,程序會將建立包含 AG 的實例上的管理員帳號複製到 包含的 AG master中。 這樣管理員就能登入封裝的 AG,並設定其餘的設定。
如果您在執行個體中建立本機使用者或設定,當您建立內嵌系統資料庫時,這些項目不會自動出現,而當您連線到內嵌可用性群組時,這些項目也無法看到。 一旦使用者資料庫加入受控的 AG,這些使用者就會立即失去存取權限。 您需要在受控可用性群組環境中的系統資料庫內,手動重新建立這些項目,可以直接連接到資料庫,或使用聆聽器端點進行操作。 此規則的例外是,父實例中系統 管理員 角色的所有登入資料都會在建立包含的 AG 時複製到新的 AG 專用 master 資料庫中。
注意
由於 master 資料庫對每個包含的可用性群組是獨立的,在包含的 AG 上下文中執行的伺服器範圍活動只會在包含的系統資料庫中持續存在。 此規則包含審計。 如果您使用 SQL Server 稽核來稽核伺服器層級活動,則必須在每個容器型 AG 中建立相同的伺服器稽核。
初始資料同步
包含的系統資料庫僅支援自動播種作為初始資料同步方式。
在 SQL Server 2022 (16.x) 和較早版本中,獨立的可用性群組在建立時必須使用自動載入。 在使用 CREATE AVAILABILITY GROUP 陳述式或 SQL Server Management Studio 中的 New Availability Group 精靈時,僅包含支援自動種植的使用者資料庫。 若要使用手動做種JOIN ONLY(),加入大型資料庫,請等到已建立包含的 AG 之後。
在 SQL Server 2025(17.x)中,包含系統資料庫始終使用自動種子,即使 CREATE AVAILABILITY GROUP 語句中明確指定手動種子。 你可以將灌溉模式設為手動設定,以建立封閉型 AG,然後可以透過非自動灌溉的同步方法新增使用者資料庫。
還原受限系統資料庫
若要還原自主系統資料庫的備份,請遵循下列步驟:
移除所含的 AG。
在獨立 AG 的原始主要副本上還原獨立
master和msdb資料庫。從次要副本中刪除包含
master和msdb的資料庫。在主要副本上,使用原始名稱和節點,搭配
WITH (CONTAINED, REUSE_SYSTEM_DATABASES)和SEEDING_MODE = AUTOMATIC語法重新建立所包含的 AG。
重新建立封閉的可用性群組時,請勿在語句中包含內嵌系統資料庫 CREATE AVAILABILITY GROUP。 SQL Server 會在你指定 REUSE_SYSTEM_DATABASES時自動偵測到。 在 SQL Server 2022 (16.x) 和舊版中,只包含支援自動植入的小型用戶資料庫。 使用 JOIN ONLY,在建立封裝 AG 之後,分別新增大型資料庫。
受限可用性群組作業
屬於封裝可用性群組的工作只在主要複本上執行。 它們不會在次要複製品上運行。
連線 (封閉環境)
請務必區分連線到執行個體與連線到所含自主可用性群組 (AG) 有何不同。 存取自主可用性群組環境的唯一方式是連線到自主可用性群組接聽程式,或連線到位於自主可用性群組中的資料庫。
"Persist Security Info=False;
User ID=MyUser;Password=*****;
Initial Catalog=MyContainedDatabase;
Server=MyServer;"
在包含 MyContainedDatabase 的 AG 中,是你想要互動的資料庫。
你必須為內嵌的 AG 建立一個監聽器,才能有效使用內嵌 AG。 如果您連線到承載可用性群組的其中一個「執行個體」,而不是「透過接聽程式直接連線到可用性群組」,您將會在該執行個體的環境中,而不是在可用性群組的環境中。
例如,如果您的可用性群組 MyContainedAG 裝載於伺服器 SERVER\MSSQLSERVER,而且您使用 MyContainedAG_Listener 連線到執行個體,而不是連線到接聽程式 SERVER\MSSQLSERVER,您將會在執行個體的環境中,而不是在 MyContainedAG 的環境中。 你必須受制於實例系統資料庫中的內容(使用者、權限、工作等等)。 若要存取封閉可用性群組的系統資料庫中找到的內容,請改為連線至封閉可用性群組的監聽程式 (例如 MyContainedAG_Listener)。 當您透過包含型可用性群組接聽程式連線到執行個體並與 master 互動時,實際上會被重新導向至包含型 master 資料庫(例如 MyContainedAG_master)。
唯讀路由和封閉式可用性群組
如果你設定唯讀路由將帶有讀取意圖的連線重新導向到次要副本(參見 「設定 Always On 可用性群組的唯讀路由」),且你想使用只在包含的 AG 內建立的登入帳號連線,還有其他考量:
- 你必須在連接字串中指定包含 AG 的資料庫。
- 連接字串中指定的使用者必須有權存取包含的 AG 中的資料庫。
例如,以下連接字串中,AdventureWorks 是包含 AG 內的資料庫且擁有 MyContainedListener,而 MyUser 是包含 AG 中定義的使用者,並且不屬於任何參與實例:
"Persist Security Info=False;
User ID=MyUser;Password=*****;
Initial Catalog=AdventureWorks;
Server=MyContainedListener;
ApplicationIntent=ReadOnly"
這個例子會把你連接到屬於 ReadOnly 路由配置的可讀次級裝置,並且你在包含的 AG 的上下文中。
連線到實例與連線到專屬可用性群組之間的差異
- 連線到自主 AG 時,使用者只會看到自主 AG 中的資料庫,加上
tempdb。 - 在實體層級,包含的 AG
master與msdb名稱為[contained AG]_master、 與[contained AG]_msdb。 在受控 AG 內,其名稱為master和msdb。 - 包含 AG
master的資料庫識別碼在包含的 AG 內是1,但連接到執行個體時則會有所不同。 - 雖然使用者在
sys.databases自主 AG 連線中連線時,無法看到自主 AG 外部的資料庫,但可以透過三個部分名稱或透過USEuse 命令來存取這些資料庫。 - 透過
sp_configure的伺服器設定可以從所包含的 AG 連線讀取,但只能從執行個體層級進行寫入。 - 透過受限制的 AG 連線,系統管理員可以執行如關閉 SQL Server 的執行個體層級作業。
- 大部分的資料庫層級、端點等級或 AG 層級操作只能從執行個體連線執行,而不是包含 AG 連線。
與其他功能的互動
在使用某些具有內含 AG 的功能時,請考慮其他因素。 部分功能目前尚未支援。
退後
在包含的 AG 中備份資料庫的程序與任何使用者資料庫備份程序相同。 此陳述對包含的 AG 使用者資料庫與包含的 AG 系統資料庫皆成立。
如果你使用本地備份地點,備份檔案會放在執行備份工作的伺服器上。 這表示你的備份檔案可能在不同位置。
如果你用網路資源作為備份位置,所有主機副本的伺服器都需要存取該資源。
在包含的可用性群組會話中啟用資料庫建立或還原
適用於:SQL Server 2025 (17.x) CU 1 及更新版本。
在 SQL Server 2025 (17.x) 累積更新(CU)1 中,您可以直接在包含的可用性群組會話中,透過包含的 AG 監聽器啟用資料庫建立與還原。 此強化簡化了分配適當角色的使用者工作流程,使得在封閉的 AG 環境中能無縫運作。
只有擁有 dbcreator 角色的使用者才能在包含的 AG 會話中建立資料庫。 只有具備 db_owner 或 系統管理員 角色的使用者才能還原資料庫。
以下範例可啟用您的會話功能,使用儲存程序中的allow_cag_create_db會話上下文鍵sp_set_session_contex。 要停用它,請設 @value 為 0。
EXECUTE sp_set_session_context
@key = N'allow_cag_create_db',
@value = 1;
分散式可用性群組
分散式可用性群組是跨越兩個基礎可用性群組的特殊可用性群組類型。 當您配置分散式可用性群組時,第一個可用性群組(AG)的全域主要複本所做的變更會被複寫到第二個 AG 的主要複本,該複本被稱為轉發器。
從 SQL Server 2025(17.x)開始,你可以在兩個包含的 AG 之間配置分散式可用性群組。 由於自主 AG 依賴自主 master 和 msdb 系統資料庫,若要建立分散式可用性群組,第二個 AG(轉寄站)必須擁有與全域主要資料庫相同的自主 AG 系統資料庫。
如果您打算在分散式可用性群組中使用封裝 AG 作為轉寄站,您必須使用 AUTOSEEDING_SYSTEM_DATABASES 語句的 WITH | CONTAINED 選項的 子句來建立封裝 AG。 條款 AUTOSEEDING_SYSTEM_DATABASES 會指示 SQL Server 主動略過建立自己的封裝 AG 系統資料庫,而是從全域主資料庫植入封裝 AG 系統資料庫。
資源管理員
適用於:SQL Server 2022(16.x)CU 18 及以上版本。
在 SQL Server 2022(16.x)累積更新(CU)18 之前,以及較舊版本的 SQL Server 中,不支援在包含的可用性群組連線上設定或使用資源治理器。
在 SQL Server 2022(16.x)CU 18 及更新版本中,若您在實例連線上設定資源治理器,實例連線或包含可用性群組連線的資源消耗會如預期般被管理。 如果您嘗試在包含的可用性群組連線上設定資源管理員,您會收到錯誤。
資源管理員可在Database Engine實例層級運作。 實例層級的資源管理員設定不會傳播至可用性複本。 您必須在裝載可用性復本的每個實例上設定資源管理員。
小提示
你應該對所有承載可用性副本的資料庫引擎實例使用相同的資源管理器設定,以確保在可用性群組故障轉移發生時行為一致。
欲了解更多資訊,請參閱 資源管理員 與 教學:資源管理員設定範例與最佳實務。
變更資料擷取
異動資料擷取 (CDC) 是以 SQL Agent 作業實作,因此 SQL Agent 必須在自主可用性群組中具有複本的所有執行個體上執行。
若要將異動資料擷取與封裝可用性群組搭配使用,請在設定 CDC 時連線到可用性群組接聽器,以便利用封裝系統資料庫來設定 CDC 中繼資料。
日誌傳送
如果來源資料庫在包含的 AG 裡,你可以設定日誌運送。 不過,封裝可用性群組中不支援記錄傳送目標。 此外,在設定 CDC 後,你需要修改日誌傳輸作業。
若要設定具備獨立功能的 AG 進行日誌傳送,請遵循下列步驟:
- 連線到包含的 AG 監聽程式。
- 就如同平常一樣設定日誌傳送。
- 設定日誌傳送作業後,修改作業以連接至所包含的 AG 監聽程式,然後再進行備份。
透明資料加密 (TDE)
若要搭配封裝的可用性群組中的資料庫使用透明資料加密 (TDE),請手動將資料庫主要金鑰 (DMK) 安裝至封裝的可用性群組中的 master 資料庫。
使用 TDE 的資料庫依賴 master 資料庫中的憑證來解密資料庫加密金鑰 (DEK)。 如果沒有該憑證,SQL Server 就無法解密使用 TDE 加密的資料庫或使其上線。 在一個自主可用性群組中,SQL Server 會檢查兩個 master 資料庫中的資料庫主要金鑰 (DMK),執行個體的 master 資料庫,以及該自主可用性群組中的自主 master 資料庫以解密該資料庫。 如果在任一地點都找不到憑證,SQL Server 就無法讓資料庫上線。
若要將 DMK 從 master 實例資料庫轉移到包含 master 的資料庫,請參見 「將受 TDE 保護的資料庫移至另一台 SQL Server」,主要聚焦於 DMK 從舊伺服器轉移到新伺服器的部分。
注意
加密 SQL Server 實例上的任何資料庫也會 加密 tempdb 系統資料庫。
SSIS 方案與維護計畫
受控可用性群組不支援使用 SSIS 套件,包括維護計畫。
不支援
目前,自主可用性群組不支援下列 SQL Server 功能:
- 任何類型的 SQL Server 複寫 (交易式、合併式、快照式等)。
- 目標資料庫位於包含式可用性群組中的日誌傳送 (Log Shipping)。 支援來源資料庫位於自主可用性群組中的日誌傳送。
DDL 支援
在 CREATE AVAILABILITY GROUP 工作流程中,有一個 WITH 包含多個選項的條款:
<with_option_spec> ::=
CONTAINED [REUSE_SYSTEM_DATABASES | AUTOSEEDING_SYSTEM_DATABASES ]
被包含
這個選項會指定你所建立的 AG 是一個封閉的 AG。
重新使用系統資料庫 (REUSE_SYSTEM_DATABASES)
這個 REUSE_SYSTEM_DATABASES 選項只適用於受限制的 AG。 它規定新的 AG 應重複使用與之前同名的包含 AG 中的現有系統資料庫。 例如,如果你有一個名為 MyContainedAG的包含 AG,想要丟棄並重建它,你可以用這個選項重用原本包含系統資料庫的內容。 使用這個選項時,不要指定系統資料庫名稱。 SQL Server 會自動偵測它們。
AUTOSEEDING_SYSTEM_DATABASES
適用於:SQL Server 2025(17.x)及更新版本。
如果你想在分散AUTOSEEDING_SYSTEM_DATABASES中使用包含的 AG 作為轉介,建立包含的 AG 時必須使用該選項。 此選項會指示 SQL Server 略過建立自己的自主 AG 系統資料庫,而是從全域主要資料庫植入自主 AG 系統資料庫。
系統物件對受控可用性群組的支援
兩個系統檢視包含與所含可用性群組相關的新增內容:
-
sys.dm_exec_sessions動態管理檢視包含一個
contained_availability_group_id欄位。 -
sys.availability_groups目錄檢視包含該
is_contained欄位。