SqlServer遇到SPN_Service Principal name問題的處理方法

lusklusklusk發表於2021-04-02

SPN(Service Principal name)伺服器主體名稱。
SPN 是服務在使用 Kerberos 身份驗證的網路上的唯一識別符號,它由服務類、主機名和埠組成。在使用 Kerberos 身份驗證的網路中,必須在內建計算機帳戶(如 NetworkService 或 LocalSystem)或使用者帳戶下為伺服器註冊 SPN。對於內建帳戶,SPN 將自動進行註冊。但是,如果在域使用者帳戶下執行服務,則必須為要使用的帳戶手動註冊SPN。


客戶端連線Sqlserver例項報SPN錯誤的處理方法
1、先登入Sqlserver例項伺服器執行setspn -L dai\sqlprocess |find "machine name"檢視相關Sqlserver例項對應的伺服器資訊,看是否有無效資訊,有無效資訊或重複資訊則使用setspn -D刪除它
2、再透過Microsoft Kerberos Configuration Manager for SQL Server客戶端工具,連線相關Sqlserver例項的伺服器,只輸入伺服器名即可,檢查相關伺服器是否正常
3、最後使用setspn -D、setspn -A重建該Sqlserver例項對應伺服器的所有SPN資訊,使用setspn時需要administrator模式執行cmd
4、換一個客戶端機器試試,有時是某個客戶端機器自身無法獲得域、dns、dhcp伺服器上的資訊,或該機器還沒及時同步到域、dns、dhcp伺服器上的資訊,連線Sqlserver也會報SPN錯誤
5、如果伺服器有別名,然後AG的監聽使用了別名,則必須使用伺服器別名alias註冊到spn中,即setspn -A aliasname:1433 dai\sqlprocess
6、郵件報警Server Name對應DBPROD2表示DBPROD2的spn出了問題,對應DBPROD2\BI1表示DBPROD2\BI1的spn出了問題,DBPROD2可能是別名也可能是伺服器名
7、重建SPN後,如果沒有及時生效,可能需要等等過一會才會生效。
8、最好的驗證方法就是,直接點選某個linked server,看能否連線測試成功,如下表示DBDEV1訪問不了12.2.37.123對應的linked server。
DBDEV1    Logon    Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'. Reason: Could not find a login matching the name provided. [CLIENT:12.2.37.123]
9、linked server報錯,Cannot generate SSPI context,是因為netlogon服務起不來導致,computer management--local user and groups--groups--adminstrator組下面的使用者都是一些阿拉伯數字,看不到域使用者。netlogon起不來是因為workstation起不來,而workstation起不來,是因為使用了local system account,使用network service使用者並保留密碼框為空即可,這種情況下,kerberos裡面輸入這臺伺服器都無法登入,會報錯:The was an issue with accessing UserAccount information from the system
10、linux伺服器訪問sqlserver例項報錯SSPI Provider: Server not found in Kerberos database (851968) (SQLDriverConnect)
解決方法1:
一般windows伺服器訪問sqlserver例項,在SPN裡面寫的是sqlserver例項對應的伺服器名稱,linux的話,看linux配置的字串,如果字串裡面是例項名稱,則需要把例項名稱寫入SPN,比如開發的配置檔案寫的是sqlserver例項名稱ibdwonstagedbalias,該伺服器名稱stagingdbaws1,SPN裡面的資訊只有伺服器stagingdbaws1名稱,新增例項名稱到SPN即可
setspn -A MSSQLSvc/ibdwonstagedbalias.d.com:1433 dai\sqlprocess
setspn -A MSSQLSvc/ibdwonstagedbalias.d.com dai\sqlprocess
解決方法2:
如果不是以上1的情形,那麼原因可能是linux伺服器上crontab服務出現問題導致crontab的裡面的credential-renew.sh沒有執行,可以透過less  /var/log/cron |grep "credential-renew.sh"檢視這個crontab的執行記錄,credential-renew.sh可執行檔案裡面命令是kinit

可以透過su - username,進入這個在linux伺服器需要訪問sqlserver的域使用者,然後執行klist檢視是否對該域使用者配置了kinit資訊

解決方法3:
如果不是以上1、2的情形,透過date檢視linux伺服器時間,如果是linux伺服器的時間和域控時間不一樣,這個時候在linux伺服器上依次執行systemctl status ntpd、systemctl stop ntpd、ntpdate 12.2.10.66(域控伺服器ip)、systemctl start ntpd
備註:我們也可以在linux上執行類似sqlcmd -S servername -Q "select name from sys.databases"的語句,換不同的servername來判斷具體問題




1、In SSMS, connect to the SQL instance that you are going to recreate the SPN records for
2、Open the SQL Server logs
3、Filter results based on "spn" in the message text
   Don't forget to click the "Apply filter" checkbox
4、You may have to filter through older logs and not just the "Current" log to find the records that start with the message:
   "The SQL Server Network Interface library succesfully registered the Service Principal Name..."
5、Copy the SPN portion of both messages and paste them into a Notepad
   One record has the port number at the end and the other has the instance name
   If it is the default instance then the port number will be 1433 and the instance name will be absent
6、With the two SPN records in Notepad, replace the machine name of the server with the alias
   The alias is either a C-NAME DNS record or an Availability Group listener such as: PROD2, PDBALIAS, etc
7、Remote into the server as your domain-admin account
8、In your RDP session to the server, run CMD as administrator
9、Use the following syntax to delete the existing SPN record (if it exists) then recreate it
setspn -D MSSQLSvc/PROD2.d.com:52219 dai\sqlprocess
setspn -A MSSQLSvc/PROD2.d.com:52219 dai\sqlprocess
10、Do the same for both records (port and instance name)
setspn -D MSSQLSvc/PROD2.d.com:BI1 dai\sqlprocess
setspn -A MSSQLSvc/PROD2.d.com:BI1 dai\sqlprocess


個人域賬號登入伺服器,執行cmd以administrator許可權模式,執行如下
setspn -L dai\sqlprocess | find "伺服器名稱PROD2" > C:\spn.txt

setspn -D MSSQLSvc/PROD2.d.com:52219 dai\sqlprocess
setspn -A MSSQLSvc/PROD2.d.com:52219 dai\sqlprocess

setspn -D MSSQLSvc/PROD2.d.com:BI1 dai\sqlprocess
setspn -A MSSQLSvc/PROD2.d.com:BI1 dai\sqlprocess




驗證Sqlserver SPN的圖形介面的客戶端工具Microsoft Kerberos Configuration Manager for SQL Server,下載安裝包後安裝到某臺域伺服器中,直接登入該域伺服器,開啟這個工具,輸入要連線的伺服器A,就可以看到這個伺服器A裡面的所有的Sqlserver例項的SPN資訊是否OK,這個工具的下載地址

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2766315/,如需轉載,請註明出處,否則將追究法律責任。

相關文章