SqlServer遇到SPN_Service Principal name問題的處理方法
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 處理SQLServer errorlog滿問題SQLServerError
- 工作中遇到的一些問題和處理
- JavaScript 中遇到的錯誤問題,該怎麼處理?JavaScript
- SQLServer 2008中事務日誌已滿問題處理SQLServer
- windows10更新服務遇到問題如何處理_win10更新服務遇到問題需要重啟解決方法WindowsWin10
- 如何處理六西格瑪過程中遇到的問題?
- 遇到問題的解決方法
- React TSLint中常見的問題及處理方法React
- 關於時間 PHP 處理包遇到的問題時間序列化差值問題PHP
- Yii2.012 版本與 PHP7.2 不相容 (報錯 Cannot use 'Object' as class name as...) 問題的處理方法PHPObject
- 使用air實現熱過載時遇到的問題處理方式記錄AI
- 記錄django-rest-framework處理微信支付notify_url遇到的問題DjangoRESTFramework
- Speed框架許可權管理開發當中遇到的問題和處理方式框架
- Java工作中的併發問題處理方法總結Java
- 老被跨域問題煩?看看都有哪些處理方法跨域
- golang json處理問題GolangJSON
- [git] git問題處理Git
- 5種常見的 DNS 故障診斷及問題處理方法DNS
- .net異常處理的效能問題
- SpringBoot 2.6.7 處理跨域的問題Spring Boot跨域
- SpringBoot 2.7.0 處理跨域的問題Spring Boot跨域
- GO Modules的理解和遇到的問題解決方法Go
- linux遇到的問題Linux
- Vagrant 遇到的問題
- Homestead 遇到的問題
- sudo 遇到的問題
- JackJson遇到的問題JSON
- mysql 遇到的問題MySql
- WangEditor遇到的問題
- 【問題處理】MySQL忘記root密碼的處理辦法MySql密碼
- 併發問題處理方式
- Linux 問題處理集錦Linux
- 資料處理--pandas問題
- Ubuntu處理依賴問題Ubuntu
- 最近遇到的問題總結(陣列去重、扁平化處理、sort 以及Promise等等)陣列Promise
- 部署專案遇到的mysql問題以及解決方法MySql
- 使用nodeAPI時遇到非同步問題的解決方法API非同步
- Linux 和 Windows 下編碼問題處理 codestyle 解決方法LinuxWindows