輔助副本上的可用性組數據庫是否由 AG 自動設置為只讀?
我已經閱讀了有關只讀路由的 MS 文件,但我不是在談論這個。
目前,如果我
UPDATE
對位於輔助副本上且屬於可用性組的數據庫執行操作,我會收到一條消息:Msg 3906, Level 16, State 2, Line 6 Failed to update database "dbName" because the database is read-only.
我的問題是,由於數據庫是 AG 的一部分並且目前在輔助節點上,這種配置是否是預設建立的(並且是不可避免的)?
一些有趣的額外內容:
以下 SQL 在該輔助節點上執行,顯示 I have
UPDATE
以及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
,也不是它與文件組級別只讀選項的設置相同。