Sql-Server

恢復數據庫時防止登錄失去

  • May 13, 2020

我正在跨兩個 sql server (v12.0.2000) 備份和恢復數據庫。但看起來每當我恢復一個 .bak 文件時,我在備份的數據庫上創建的登錄名在恢復的那個數據庫中不再存在。我希望它被備份到 bak 文件中!

是否有任何特殊操作可以備份登錄以便在另一台伺服器上輕鬆恢復?

我無法繼續維護各種腳本來一方面恢復數據庫,另一方面重新創建登錄。

如何創建可以輕鬆恢復的一致備份文件?

您面臨的上述問題通常稱為孤兒使用者的情況:

SQL 身份驗證登錄和數據庫使用者在還原時通常發生的情況是 SIDS 將不同步,從而破壞關係。必須先修復這種關係,然後才能使用該登錄名連接到數據庫,因為在 SQL Server 眼中,這些主體不再連接。

關於如何解決這個問題,您可以參考Fixing Orphaned Users

或者作為替代方案,您也可以使用SP_help_revlogin

  1. 對 SOURCE SERVER 上的 MASTER 執行 sp_help_revlogins,得到“創建登錄”的腳本。

  2. 在將備份恢復到 DESTINATION SERVER 期間,您可以針對 DESTINATION SERVER 上的 MASTER 數據庫執行“創建登錄”腳本。

3)還原DONE後,請EXEC sp_change_users_login 'REPORT'針對RESTORED數據庫。

伺服器登錄允許您連接到 SQL Server。登錄資訊儲存在

$$ master $$數據庫。每個登錄名都分配有一個十六進制 SID。Windows 身份驗證登錄從 Active Directory 獲取其 SID,因此登錄的 SID 在網路中的伺服器之間是相同的。SQL 身份驗證登錄獲得由 SQL Server 生成的 SID,因此每個伺服器上的 SID 都不同。 數據庫使用者允許登錄使用者使用數據庫。使用者儲存在數據庫本身中。當為登錄創建數據庫使用者時,SID 被傳遞給使用者。這個公共 SID 充當它們之間的映射。

當您將數據庫備份和恢復到不同的伺服器時,使用者會使用數據庫,但登錄不會因為他們在

$$ master $$. 由於 Windows 身份驗證登錄在網路中的所有 SQL Server 上具有相同的 SID,因此恢復的數據庫中的數據庫使用者將找到與登錄相同的 SID,從而正確映射。SQL 身份驗證登錄在伺服器上具有不同的 SID,因此數據庫使用者將無法正確映射。沒有相應登錄名的此類使用者稱為孤兒使用者。 要正確移動登錄名/數據庫,必須編寫腳本。

你可以閱讀這篇關於 AlwaysOn 的部落格,但也適用於正常伺服器。 https://aalamrangi.wordpress.com/2015/02/09/avoid-orphan-users-in-alwayson/

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