如何連結可用性組中的使用者和登錄名?
我有一個可用性組,需要將一些登錄映射到活動輔助副本上的數據庫使用者。(Node2) 不幸的是,當我嘗試
exec sp_change_users_login
or時alter user with login
,我收到一條錯誤消息,告訴我數據庫是只讀的。這並不奇怪,但我不知道如何解決它。我昨晚嘗試故障轉移,修復 Node2 上的登錄,然後故障返回到 Node1,但是登錄/使用者映射最終在 Node1 上出錯。當我修復這些問題時,Node2 的登錄再次失控。這是一個生產系統,所以直到今晚晚些時候我才能做任何我想做的事情。我在我們的測試實驗室沒有遇到這個問題。不同之處可能是我之前在加入數據庫之前創建了登錄名,而這次我嘗試在之後創建它們,但未能正確記錄該過程。如果可以的話,我寧願避免拆掉 AG 並重建它。
這個問題對我來說很有意義,我只是不知道如何解決它。
您需要做的是連接到 SID 不匹配的實例,並且您必須重新創建登錄名並指定顯式 SID。例如,在您擁有孤立使用者的實例上,以下內容返回該使用者:
exec sp_change_users_login 'report'; go
從列中複製 SID
UserSID
。而且,如果您已經有一個現有的登錄名,並且想要保留該實例上的名稱,則不能。沒有辦法ALTER LOGIN
更改 SID。因此,您需要刪除登錄名並重新創建它:drop login YourLogin; go create login YourLogin with password = 'password', check_policy = off, -- simple password and no check policy for example only sid = 0xC26909...................; go
同樣,您需要將
sid
參數設置CREATE LOGIN
為UserSID
您從sp_change_users_login
使用report
.注意:您需要將此/這些副本上的密碼設置為相同,以免副本之間的密碼不匹配。
我假設您這裡有問題的登錄名是 SQL Server 登錄名,因為這對於 Windows Auth 域帳戶應該不是問題,因為每個實例上的 SID 應該是相同的。
您還可以在此處利用包含的數據庫,並讓數據庫主體在數據庫級別進行身份驗證。這樣您就不必擔心孤立的使用者。
以下是一些關於此的文件:
如何在 SQL Server 實例之間傳輸登錄名和密碼的知識庫文章
此外,這不言而喻,但在開發/QA 環境中進行測試,以在投入生產之前驗證並確保正確的功能。