Sql-Server-2016

輔助副本上的可用性組數據庫是否由 AG 自動設置為只讀?

  • September 19, 2019

我已經閱讀了有關只讀路由的 MS 文件,但我不是在談論這個。

目前,如果我UPDATE對位於輔助副本上且屬於可用性組的數據庫執行操作,我會收到一條消息:

Msg 3906, Level 16, State 2, Line 6
Failed to update database "dbName" because the database is read-only.

我的問題是,由於數據庫是 AG 的一部分並且目前在輔助節點上,這種配置是否是預設建立的(並且是不可避免的)?

一些有趣的額外內容:

以下 SQL 在該輔助節點上執行,顯示 I haveUPDATE以及ALTER對該數據庫的更多權限:

SELECT * 
FROM fn_my_permissions(null, 'DATABASE')   
ORDER BY subentity_name, permission_name;

以下 SQL 明確顯示我有權訪問UPDATE該數據庫中的表:

SELECT * 
FROM fn_my_permissions('dbName.dbo.tblName', 'OBJECT')   
ORDER BY subentity_name, permission_name ;

儘管如此,我實際上被阻止更新該表。這意味著:

  • 的輸出fn_my_permissions不嚴格正確
  • 數據庫“只讀”設置覆蓋單個權限

我了解遊戲中的設置是通過以下方式配置的:

ALTER DATABASE dbName SET READ_ONLY

ALTER DATABASE dbName SET READ_WRITE WITH NO_WAIT

該問題的主要原因是要了解“只讀”配置是 DBA/設計人員在 AG 的設計和部署期間的責任,還是使用 AG 的預期(和保證?)功能。

我會給文件一個很好的閱讀。特別是關於可用性副本的部分。

每個可用性副本都分配有一個初始角色 - 主要角色或輔助角色,該角色由該副本的可用性數據庫繼承。給定副本的角色決定了它是託管讀寫數據庫還是只讀數據庫。一個副本(稱為主副本)被分配為主角色並託管讀寫數據庫,這些數據庫稱為主數據庫。至少一個其他副本(稱為次要副本)被分配次要角色。輔助副本託管只讀數據庫,稱為輔助數據庫。

如上所示,每個副本可以是只讀的或讀寫的(分別是輔助或主)。此外,只能有一個主(讀寫)副本。當我們在這方面提到副本時,我們指的是數據庫級別。每個伺服器可以託管多個可用性組,可能具有混合的主從配置。

AlwaysOn 可用性組不支持您提到的具有多個讀寫副本的情況,AlwaysOn 可用性組旨在滿足高可用性和讀取擴展需求,而不是多主設置。您應該考慮支持這種需求的雙向複製技術。

is_read_only至於只讀設置本身,這是由可用性組自動設置的,儘管值得一提的是,這與數據庫屬性(或 )中的“數據庫只讀”設置不同sys.databases,也不是它與文件組級別只讀選項的設置相同。

引用自:https://dba.stackexchange.com/questions/249123