許多SQL管理員都曾遇到這樣的困惑:由於各種原因導致SQL實例管理員密碼忘記,甚至登錄名也忘記,如何在不重裝SQL實例的情況下以管理員身份登錄?本文圍繞這個問題來給大家介紹一種在不知道SQL管理員密碼的情況下成功登錄到SQL實例的方法。
一、 Windows身份驗證模式下管理員登錄失敗
使用Windows身份驗證,意味著只有Windows登錄名能夠登錄到SQL實例;
在SQL 2008及以後版本中,你可能會遇到這樣的情況:使用本地管理員組成員或域管理員登錄到安裝了SQL Server的Windows服務器上,使用SQL Server Management Studio嘗試連接到本地實例時如果使用Windows身份驗證,可能會收到用戶登錄失敗的提示;
導致這個問題的原因跟密碼沒有關系,因為使用Windows身份驗證這個過程SQL Server並不會驗證當前登錄者的密碼,而是自動使用已經由Windows
操作系統驗證通過後的憑據來登錄;驗證密碼的過程是由
操作系統來完成後,既然已經成功登錄到
操作系統,說明密碼是正確的。那為何會無法登錄到SQL實例呢?
因為在登錄到SQL實例這個過程,SQL Server會驗證在SQL 登錄名中是否存在與當前登錄用戶或組對應的登錄名,如果不存在則登錄失敗。在SQL 2008以前的版本中,SQLServer在安裝好之後默認就存在一個名為“BUILTIN\Administrators”的登錄名並且屬於sysadmin角色,對應著本地管理員組,意味著默認情況下本地管理員組成員和域管理員都能夠以SQL管理員的身份登錄到SQL實例;
然而,在SQL 2008及以後版本中,不再默認添加“BUILTIN\Administrators”作為SQL登錄名了,而是在SQL實例安裝過程中會詢問將哪個Windows用戶作為SQL實例的初始管理員;此時很多管理員都會選擇“添加當前用戶”,也就是說在安裝好之後將只有安裝時使用的Windows用戶才能夠登錄到SQL實例,其它Windows用戶(即使是本地管理員組成員或域管理員)都無法登錄到SQL實例。如果此時連安裝SQL實例時使用的Windows用戶都找不到了,那麼將沒有任何人能夠管理SQL實例。
二、 混合身份驗證模式下管理員登錄失敗
如果SQL實例使用的是混合身份驗證模式,意味著Windows登錄名和SQL登錄名都能夠成功登錄,前提是存在對應的登錄名並且密碼正確。如果此時遇到了第一部分的問題,使用任何Windows用戶都無法登錄到SQL實例,還可以嘗試使用SQL登錄名進行登錄。
在SQL實例中自帶了一個名為sa的SQL登錄名,屬於sysadmin角色;此外sysadmin角色中也可能包含其它的SQL登錄名成員,這些成員都是SQL實例的管理員。然而,有一些極端的場景下sysadmin角色成員中的SQL登錄名也都無法登錄,例如不知道有哪些SQL登錄名、登錄名(包括sa)被禁用了、登錄名(包括sa)密碼忘記了、登錄名被刪除了等等。
此時,所有SQL管理員都無法登錄到SQL實例了。
三、 解決辦法
無論是上述哪一種情況,當所有Windows用戶和SQL登錄名都無法以管理員身份登錄到SQL實例時,通常很多管理員都束手無策了,最後只能重裝SQL實例、重新附加數據庫、重建登錄名、重新映射數據庫訪問並授權;不但費時費力,而且在沒有配置文檔的情況下還有可能導致某些登錄名丟失。下面我們用一種方法來破解這個問題:
1. 停止所有SQL相關服務
首先需要以本地管理員組成員身份登錄到安裝了SQL實例的Windows服務器,打開SQL配置管理器,手動停止與出現問題的SQL實例相關的所有SQL服務,包括分析服務、報表服務、整合服務、數據庫引擎服務、代理服務、全文搜索服務等等,其中全文搜索服務和代理服務可能會隨著SQL數據庫引擎服務的啟動而自動啟動,建議將啟動模式暫時設置為“已禁用”。
2. 以單用戶模式啟動SQL數據庫引擎服務
同樣在SQL配置管理器中,找到上一步停止的SQL數據庫引擎服務,雙擊查看其屬性。如果SQL Server版本是2005或2008,則在服務屬性窗口中能看到”高級”選項卡,在啟動參數中手動添加“-m;”後點擊”應用”,如下圖所示:
如果SQL Server版本是2012,則在服務屬性窗口中能看到”啟動參數”選項卡,手動添加一個啟動參數“-m”後點擊”應用”,如下圖:
回到SQL配置管理器的主頁面,手動啟動SQL數據庫引擎服務。
3. 創建登錄名並加入到sysadmin角色
在SQL實例啟動後,立即使用本地管理員通過sqlcmd連接到SQL實例,由於當前實例處於單用戶模式,故在連接時不會驗證當前管理員在SQL中是否存在對應的登錄名;如果在連接時收到如下提示,則說明已經有其它會話連接到了SQL實例,需要手動重啟SQL服務後再次連接。
當使用sqlcmd成功連接到SQL實例後,執行下面的SQL語句手動創建登錄名,並加入到sysadmin角色中。如果當前SQL實例使用的是Windows身份驗證模式,則只能創建Windows登錄名:(其中”SQL12NC”表示計算機名)
CREATE LOGIN [SQL12NC\Administrator] From Windows
GO
ALTER SERVER ROLE sysadmin ADD MEMBER [SQL12NC\Administrator]
GO
如果當前SQL實例使用的是混合身份驗證模式,則既可以創建Windows登錄名,也可以創建SQL登錄名:
CREATE LOGIN TestLogin WITH PASSWORD='111'
GO
ALTER SERVER ROLE sysadmin ADD MEMBER TestLogin
GO
4. 正常啟動SQL相關服務
在啟動SQL相關服務之前,回滾第1步和第2步的操作,將SQL服務啟動模式和啟動參數恢復到正常配置;在SQL配置管理器中,手動啟動所有SQL相關服務。
5. 使用新的SQL管理員登錄到實例
在所有SQL服務成功啟動以後,使用新創建的SQL管理員通過SQL Server Management Studio連接到SQL實例;
登錄成功後,可以繼續添加其它的登錄名並授權、重置之前的SQL管理員密碼等等。
至此,我們實現了在不知道SQL管理員的情況下登錄到了SQL實例,但前提是我們必須要有Windows服務器的本地管理員密碼。