共用方式為


什麼是受控可用性群組?

適用於:SQL Server 2022 (16.x)

包含式可用性群組是支援下列項目的 Always On 可用性群組:

  • 除了在執行個體層級之外,還在可用性群組層級管理中繼資料物件(例如使用者、登入、權限、SQL Agent 作業等)。

  • 可用性群組 (AG) 中專門的封閉系統資料庫。

本文詳細說明封裝 AG 的相似性、差異和功能。

概觀

AG 通常由一個或多個使用者資料庫組成,這些資料庫旨在作為協調的群組運作,並會複寫到叢集中的若干節點。 當某個節點發生故障,或裝載主要副本的 SQL Server 健康狀況不良時,將整個資料庫群組作為一個單位移動到可用性群組中的另一個複本節點。 所有使用者資料庫會在可用性群組的所有複本之間保持同步,不管是以同步模式還是非同步模式運作。

這適用於只與該組使用者資料庫互動的應用程式,但當應用程式也依賴使用者、登入、權限、代理程式作業等物件時,由於這些物件會儲存在其中一個系統資料庫(mastermsdb),因此會帶來挑戰。 若要讓應用程式以可預測的方式順暢運作,系統管理員必須「手動」確保將這些物件的任何變更複製到可用性群組中的所有複本執行個體。 如果將新執行個體加入可用性群組(AG),可以透過簡單的程序,將資料庫自動或手動創建副本,但隨後必須在新執行個體上重新配置所有系統資料庫的自訂設定,以確保其與其他複本一致。

自主可用性群組擴充了所複寫的資料庫群組概念,加入 mastermsdb 資料庫的相關部分。 您可以將其想成是使用自主可用性群組之應用程式的執行內容。 這個想法是,封閉的 AG 環境包含會影響依賴這些設定的應用程式的設定。 因此,自主 AG 環境會影響與應用程式互動的所有資料庫、所使用的驗證 (登入、使用者、權限)、預期執行的任何排程工作,以及影響應用程式的其他組態設定。

這與自主資料庫不同,自主資料庫會針對使用者帳戶使用不同的機制,並將使用者資訊儲存在資料庫本身。 自主資料庫只會複寫登入和使用者,而複寫登入或使用者的範圍僅限於該單一資料庫 (及其複本)。

相反地,在自主可用性群組中,您可以在可用性群組層級建立使用者、登入和權限,而這些項目會自動在可用性群組中的複本之間保持一致,並在自主可用性群組中的資料庫之間保持一致。 這可讓系統管理員不必自行手動進行這些變更。

差異

當使用封裝可用性群組時,需要考慮一些實際差異,例如封裝系統資料庫的建立,以及在封裝可用性群組層級強制連接,而不是在執行個體層級連接。

封閉系統資料庫

每個包含的可用性群組都有自己的 mastermsdb 系統資料庫,這些資料庫是以該可用性群組的名稱命名的。 例如,在受限自動可用性群組 MyContainedAG 中,您會擁有名為 MyContainedAG_masterMyContainedAG_msdb 的資料庫。 這些系統資料庫會自動植入至新複本,而更新會複寫至這些資料庫,就像可用性群組中的任何其他資料庫一樣。 這表示如果您在連線到自主可用性群組時新增登入或代理程式作業等物件,當自主可用性群組容錯移轉至另一個連線到自主可用性群組的執行個體時,您仍會看到代理程式作業,並能夠使用在自主可用性群組中建立的登入進行驗證。

重要

封裝可用性群組是一種機制,用於在可用性群組的複本之間保持執行環境配置的一致性。 它們「不」代表安全性界限。 沒有任何界限能阻止受限制的可用性群組連接並存取可用性群組以外的資料庫。

新建立的封裝可用性群組中的系統資料庫不會從執行 CREATE AVAILABILITY GROUP 命令的執行個體複製。 這些初始為空白範本,沒有任何資料。 建立之後,執行個體上建立包含 AG 的系統管理員帳戶會立即複製到受包含的 AG master 中。 如此一來,系統管理員就能登入受控 AG,並完成其餘設定。

如果您在執行個體中建立本機使用者或設定,當您建立內嵌系統資料庫時,這些項目不會自動出現,而當您連線到內嵌可用性群組時,這些項目也無法看到。 一旦使用者資料庫加入封裝的可用性群組,用戶將無法存取該資料庫。 您需要在受控可用性群組環境中的系統資料庫內,手動重新建立這些項目,可以直接連接到資料庫,或使用聆聽器端點進行操作。 例外是指父執行個體中具有系統管理員角色的所有登入將被複製到新的 AG 特定資料庫中。

注意

由於每個內含可用性群組的 master 資料庫是獨立的,因此在內含 AG 內容中執行的伺服器範圍活動只會持久化在內含系統資料庫中。 這包括稽核。 如果您使用 SQL Server 稽核來稽核伺服器層級活動,則必須在每個自主 AG 內建立相同的伺服器稽核。

還原受限系統資料庫

您可以使用兩種不同方式之一來還原封裝系統資料庫。

  • 使用次要副本還原自治資料庫

    1. 使用RESTORE WITH NORECOVERY,將mastermsdb資料庫還原到裝載次要複本的伺服器實例,並在每次還原作業中進行此操作。 如需詳細資訊,請參閱準備 Always On 可用性群組的次要資料庫

    2. 將每一個次要資料庫加入可用性群組。 如需詳細資訊,請參閱將次要資料庫加入 Always On 可用性群組

  • 透過卸除包含的 AG 還原包含的資料庫

    1. 移除所含的 AG。

    2. 在每個參與包含型可用性群組的實例中,還原包含的 mastermsdb 資料庫。

    3. 使用原始節點和名稱,使用 WITH (CONTAINED, REUSE_SYSTEM_DATABASES) 語法重新建立包含的 AG。

自主可用性群組作業

屬於封裝可用性群組的工作只在主要複本上執行。 它們不會在次要副本上執行。

連線 (封閉環境)

請務必區分連線到執行個體與連線到自主可用性群組有何不同。 存取自主可用性群組環境的唯一方式是連線到自主可用性群組接聽程式,或連線到位於自主可用性群組中的資料庫。

"Persist Security Info=False;
User ID=MyUser;Password=*****;
Initial Catalog=MyContainedDatabase;
Server=MyServer;"

其中 MyContainedDatabase 是包含於自主 AG 中的資料庫,您希望與它互動。

這表示您必須建立自主可用性群組的接聽程式,才能有效地使用自主可用性群組。 如果您連線到承載可用性群組的其中一個「執行個體」,而不是「透過接聽程式直接連線到可用性群組」,您將會在該執行個體的環境中,而不是在可用性群組的環境中。

例如,如果您的可用性群組 MyContainedAG 裝載於伺服器 SERVER\MSSQLSERVER,而且您使用 MyContainedAG_Listener 連線到執行個體,而不是連線到接聽程式 SERVER\MSSQLSERVER,您將會在執行個體的環境中,而不是在 MyContainedAG 的環境中。 這表示您會受制於執行個體系統資料庫中所包含的內容 (如使用者、權限、作業等)。 若要存取封閉可用性群組的系統資料庫中找到的內容,請改為連線至封閉可用性群組的監聽程式 (例如 MyContainedAG_Listener)。 當您透過包含型可用性群組接聽程式連線到執行個體並與 master 互動時,實際上會被重新導向至包含型 master 資料庫(例如 MyContainedAG_master)。

唯讀路由和封閉式可用性群組

如果您已將唯讀路由設定為將具有讀取意圖的連線重新導向至次要複本 (請參閱設定 Always On 可用性群組的唯讀路由),而且您只想要使用在自包含可用性群組中建立的登入進行連線,則還有一些其他考量:

  • 您必須在連接字串中指定屬於自主可用性群組一部分的資料庫
  • 連接字串中指定的使用者必須具有存取自主可用性群組中資料庫的權限。

例如,在下列連接字串中,其中 AdventureWorks 是具有 MyContainedListener 的自主可用性群組中的一個資料庫,而 MyUser 是在自主可用性群組中定義的使用者,且不存在於任何參與的執行個體中:

"Persist Security Info=False;
User ID=MyUser;Password=*****;
Initial Catalog=AdventureWorks;
Server=MyContainedListener;
ApplicationIntent=ReadOnly"

此連接字串可讓您連線到屬於唯讀路由設定的可讀次要副本,而且您將位於其包含的可用性群組的上下文中。

連線到實例與連線到專屬可用性群組之間的差異

  • 連線到自主 AG 時,使用者只會看到自主 AG 中的資料庫,加上tempdb
  • 在實體層級,包含的 AG mastermsdb 名稱為 [contained AG]_master、 與 [contained AG]_msdb。 在受控 AG 內,其名稱為 mastermsdb
  • 包含 AG master 的資料庫識別碼在包含的 AG 內是 1,但連接到執行個體時則會有所不同。
  • 雖然使用者在sys.databases自主 AG 連線中連線時,無法看到自主 AG 外部的資料庫,但可以透過三個部分名稱或透過 USEuse 命令來存取這些資料庫。
  • 透過 sp_configure 的伺服器設定可以從所包含的 AG 連線讀取,但只能從執行個體層級進行寫入。
  • 透過受限制的 AG 連線,系統管理員可以執行如關閉 SQL Server 的執行個體層級作業。
  • 大部分的資料庫層級、端點等級或 AG 層級操作只能從執行個體連線執行,而不是包含 AG 連線。

與其他功能的互動

使用具封裝的 AGs 搭配特定功能時,還有其他考量,而且有些功能目前不支援。

退後

在受限可用性群組中的資料庫備份程序與任何使用者資料庫的備份程序相同。 這適用於包含的 AG 用戶資料庫和包含的 AG 系統資料庫。

如果備份位置是本機的,備份檔會放在執行備份作業的伺服器上。 這表示您的備份檔可能位於不同的位置。

如果備份位置位於網路資源上,則裝載複本的所有伺服器都需要存取該資源。

資源管理員

在 SQL Server 2022(16.x)累積更新 18 之前的版本,以及更舊的 SQL Server 版本中,不支援在內容可用性群組連線上配置或使用資源管理器。

從 SQL Server 2022 (16.x) 累積更新 18 開始,如果您在實例連線上設定資源管理員,則實例連線或內含的可用性群組連線上的資源消耗將如預期受到管理。 如果您嘗試在包含的可用性群組連線上設定資源管理員,您會收到錯誤。

資源管理員可在Database Engine實例層級運作。 實例層級的資源管理員設定不會傳播至可用性複本。 您必須在裝載可用性復本的每個實例上設定資源管理員。

小提示

建議您針對裝載可用性復本的所有 Database Engine 實例使用相同的資源管理員設定,以確保可用性群組故障轉移發生時的行為一致。

如需詳細資訊,請參閱 資源管理員 和資源 管理員組態範例和最佳做法

變更資料擷取

異動資料擷取 (CDC) 是以 SQL Agent 作業實作,因此 SQL Agent 必須在自主可用性群組中具有複本的所有執行個體上執行。

若要將異動資料擷取與封裝可用性群組搭配使用,請在設定 CDC 時連線到可用性群組接聽器,以便利用封裝系統資料庫來設定 CDC 中繼資料。

日誌傳送

如果來源資料庫位於獨立式可用性群組 (Contained AG) 中,則可以設定記錄傳送。 不過,自主可用性群組不支援記錄傳送目標。 此外,設定 CDC 之後,需要一個額外的步驟來修改記錄傳送作業。

若要使用自主 AG 設定記錄傳送,請遵循下列步驟:

  1. 連線 包含的 AG 接聽程式。
  2. 就如同平常一樣設定日誌傳送
  3. 設定記錄傳送作業之後,請先變更作業以連線到自主可用性群組接聽程式,再進行備份。

透明資料加密 (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 從舊伺服器傳輸至新伺服器的部分)。

SSIS 套件與維護計劃

自主可用性群組不支援使用 SSIS 套件,包括維護計劃。

不支援

目前,自主可用性群組不支援下列 SQL Server 功能:

  • 任何類型的 SQL Server 複寫 (交易式、合併式、快照式等)。
  • 分散式可用性群組。
  • 目標資料庫位於自主可用性群組中的記錄傳送。 支援來源資料庫位於自主可用性群組中的日誌傳送。

資料定義語言 (DDL) 變更

CREATE AVAILABILITY GROUP 工作流程中僅有 DDL 變更。 有兩個新的 WITH 子句:

<with_option_spec> ::=
CONTAINED |
REUSE_SYSTEM_DATABASES

被包含

這會指定所建立的 AG 應該是受限制的 AG。

REUSE_SYSTEM_DATABASES

此選項僅適用於封裝可用性群組,並指定新建立的可用性群組應重複使用同名先前封裝可用性群組的現有封裝系統資料庫。 例如,如果您有一個名稱為 MyContainedAG 的封裝可用性群組,並想要將其卸除並重新建立,您可以使用此選項來重複利用原始封裝系統資料庫的內容。

DMV 變更

與受控可用性群組相關的動態管理檢視有兩個新增項目:

  • DMV sys.dm_exec_sessions 增加了一個數據列:contained_availability_group_id
  • sys.availability_groups目錄檢視新增了資料行:is_contained IS_CONTAINED