在AlwaysOn可用性群組中啟用自主資料庫的注意事項

在AlwaysOn可用性群組中啟用自主資料庫的注意事項

問題描述

當您使用SQL Server AlwaysOn可用性群組來做為資料庫層級的高可用性解決方案時,可能會遇到在您將主要複本不論是自動容錯移轉還是手動容錯移轉到次要複本時,新的主要複本無法登入的問題。

實作步驟

要解決上述問題,您可以在每個可用性複本上建立相同SID及密碼的登入(Login),詳細步驟可以參考James Fu的[SQL]AlwaysON 帳號設定的這篇文章,或是您也可以考慮使用自主資料庫(Contained Database)來解決登入問題,讓原本須透過執行個體驗證登入身份的程序,改由自主資料庫來做。換言之,連接到自主資料庫時,使用的是資料庫使用者而非登入,就可以順利繞過必須在每台可用性複本建立使用相同SID和密碼的登入,但SQL Server的自主資料庫屬於部份自主資料庫,在移轉資料庫成自主資料庫前,可以透過sys.dm_db_uncontained_entities 評估是否有使用到未自主的資料庫庫物件,以避免容錯移轉到另外一台可用性複本時無法正常運作。

若您計畫在可用性群組中使用自主資料庫,可以依照下列步驟進行:

一、請在每一個可用性複本中執行下列T-SQL,以啟用執行個體層級的自主資料庫驗證功能。


EXEC sp_configure 'show advanced options', 1
GO

-- 啟用執行個體自主資料庫驗證功能
EXEC sp_configure 'contained database authentication', 1;
GO
RECONFIGURE;
GO

二、設定資料庫為部份自主,您可以使用下列T-SQL或是在Database Properties視窗中變更Containment type為Partial。


GO
ALTER DATABASE [MyDB] SET CONTAINMENT = PARTIAL WITH NO_WAIT
GO

image

三、在主要複本建立資料庫使用者並且將使用者加入特定的資料庫角色,您可以是用下列T-SQL或是GUI來進行。


GO

CREATE USER [MyDBUser] WITH PASSWORD=N'P@ssw0rd', DEFAULT_SCHEMA=[dbo]
GO

ALTER ROLE [db_owner] ADD MEMBER [MyDBUser]
GO

image

image

四、連接自主資料庫

完成上述步驟之後,您可以在SSMS中使用資料庫使用者來連接自主資料庫。

image

特別提醒的是,在Connect to database欄位中必須明確輸入您所要連接的自主資料庫名稱。

image

若嘗試使用資料庫使用者連接預設資料庫則會發生無法登入的錯誤。

image

另外,由於自主資料庫和SQL Server執行個體中的其他資料庫隔離,所以除了master和tempdb系統資料庫以外,預設情況下您沒辦法在自主資料庫中去切換到其他資料庫。

image

若您有跨自主資料庫存取資料的需求,可以參考Enabling Cross DB Access to Contained SQL Server Users in Partial Contained Databases這篇文章。

致謝

感謝好友James Fu的提醒和建議,讓筆者得以順利解決本文所遇到的問題。

參考資料

自主資料庫

自主資料庫驗證伺服器組態選項

自主資料庫的安全性最佳做法

自主資料庫與 AlwaysOn 可用性群組 (SQL Server)

Enabling Cross DB Access to Contained SQL Server Users in Partial Contained Databases