MSSQLSERVER_35250
適用於:SQL Server
詳細資料
屬性 | 值 |
---|---|
產品名稱 | SQL Server |
事件識別碼 | 35250 |
事件來源 | MSSQLSERVER |
元件 | SQLEngine |
符號名稱 | HADR_PRIMARYNOTACTIVE |
訊息文字 | 對主要複本的連線並非作用中。 無法處理命令。 |
說明
嘗試將輔助資料庫加入 Always On 可用性群組時,就會發生此訊息。 無法連線到端點通常會導致此錯誤。
使用者動作
選項 1:透過 Azure Data Studio 直接在筆記本中執行步驟
選項 2:手動遵循步驟**
注意
所有下列步驟都必須在主要複本和有問題的次要複本上執行。
1.確定已建立並啟動端點。
執行下列查詢以探索端點
SELECT tep.name as EndPointName, sp.name As CreatedBy, tep.type_desc, tep.state_desc, tep.port FROM sys.tcp_endpoints tep INNER JOIN sys.server_principals sp ON tep.principal_id = sp.principal_id WHERE tep.type = 4
警告
執行下一個命令時請小心,因為它可能會導致複本暫時停機。
您可以使用這些命令來重新啟動您探索到的端點
ALTER ENDPOINT hadr_endpoint STATE = STOPPED ALTER ENDPOINT hadr_endpoint STATE = STARTED
2.檢查您是否可以連線到端點
使用 telnet 或 Test-NetConnection 來驗證連線能力。 如果端點正在接聽且連線成功, telnet 會以閃爍的數據指標顯示空白畫面。 如果沒有,您會收到來自 telnet 的連線錯誤。 若要結束成功的 telnet 連線,請按 CTRL+]。 如果您使用 Test-NetConnection 尋找
TcpTestSucceeded : True
或TcpTestSucceeded : False
。telnet ServerName <port_number> telnet IP_Address <port_number>
Test-NetConnection -ComputerName <ServerName> -Port <port_number> Test-NetConnection -ComputerName <IP_address> -Port <port_number>
DNS 問題:
- 如果 telnet/Test-NetConnection 成功至 IP 位址,但無法連線到 ServerName,則可能會發生 DNS 或名稱解析問題。 請參閱 檢查名稱解析問題
在相同埠上接聽多個進程
如果 telnet/Test-NetConnection 連線使用 ServerName 運作,但使用 IP 位址失敗,則該伺服器上可能會定義多個端點(另一個 SQL 實例可能)設定為接聽該埠。 雖然有問題的實例上的端點狀態顯示「STARTED」另一個實例實際上可能會有埠系結,並防止正確的實例接聽和建立 TCP 連線。 若要尋找埠 5022 的擁有程式,請執行下列命令:
$port = "5022" Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
封鎖的端點(防火牆、防病毒軟體)
如果 telnet 或 Test-NetConnection 無法連線,請尋找防火牆和/或防病毒軟體,可能封鎖有問題的端點埠。 檢查防火牆設定是否允許裝載主要複本和次要複本的伺服器執行個體之間的端點連接埠通訊 (預設為連接埠 5022)。 如果您在 Azure VM 上執行 SQL Server,您還需要 確保網路安全組 (NSG) 允許流量到端點埠。 檢查防火牆 (並針對 Azure VM 檢查 NSG) 設定是否允許裝載主要複本和次要複本的伺服器執行個體之間的端點連接埠通訊 (預設為連接埠 5022)
執行下列 PowerShell 腳本來檢查已停用的輸入流量規則
Get-NetFirewallRule -Action Block -Enabled True -Direction Inbound |Format-Table
擷取 netstat 或 Get-NetTCPConnection 輸出,並確認狀態為指定端點的 IP:Port 上的 LISTENING 或已建立
netstat -a
Get-NetTCPConnection -LocalPort <port_number>
您也可以找到連接埠擁有程式:執行如下的指令(例如使用埠 5022)
$port = "5022" Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
3.檢查系統中的錯誤
您可以針對 last_connect_error_number 查詢 sys.dm_hadr_availability_replica_states,可能可以協助您診斷聯結問題。 根據哪些復本通訊困難,您可以查詢主要和次要複本:
select r.replica_server_name, r.endpoint_url, rs.connected_state_desc, rs.last_connect_error_description, rs.last_connect_error_number, rs.last_connect_error_timestamp from sys.dm_hadr_availability_replica_states rs join sys.availability_replicas r on rs.replica_id = r.replica_id where rs.is_local = 1
例如,如果次要伺服器無法與 DNS 伺服器通訊,或建立可用性群組時複本的endpoint_url設定不正確,您可能會在last_connect_error_description中取得下列結果:
DNS Lookup failed with error '11001(No such host is known)'
4.確定端點已針對 AG 定義的正確 IP/埠進行設定
在主要複本上執行下列查詢,然後在無法連線的每個次要複本上執行。 這可協助您尋找端點 URL 和埠
select endpoint_url from sys.availability_replicas
執行下列查詢以尋找端點和埠
SELECT tep.name as EndPointName, sp.name As CreatedBy, tep.type_desc, tep.state_desc, tep.port FROM sys.tcp_endpoints tep INNER JOIN sys.server_principals sp ON tep.principal_id = sp.principal_id WHERE tep.type = 4
比較每個查詢的endpoint_url和埠,並確定來自endpoint_url的埠符合針對每個個別複本上端點定義的埠
注意
如果您使用特定IP位址讓端點接聽,而不是預設的「全部接聽」,則您可能必須定義使用特定IP位址而非 FQDN 的 URL。
5.檢查網路服務帳戶是否具有端點的 CONNECT 許可權
執行下列查詢,列出有問題之伺服器端點連線許可權的帳戶,並顯示指派給每個相關端點的許可權。
SELECT perm.class_desc, prin.name, perm.permission_name, perm.state_desc, prin.type_desc as PrincipalType, prin.is_disabled FROM sys.server_permissions perm LEFT JOIN sys.server_principals prin ON perm.grantee_principal_id = prin.principal_id LEFT JOIN sys.tcp_endpoints tep ON perm.major_id = tep.endpoint_id WHERE perm.class_desc = 'ENDPOINT' AND perm.permission_name = 'CONNECT' AND tep.type = 4; SELECT ep.name, sp.state, CONVERT(nvarchar(38), suser_name(sp.grantor_principal_id)) AS grantor, sp.TYPE AS permission, CONVERT(nvarchar(46),suser_name(sp.grantee_principal_id)) AS grantee FROM sys.server_permissions SP INNER JOIN sys.endpoints ep ON sp.major_id = ep.endpoint_id AND EP.type = 4 ORDER BY Permission,grantor, grantee;
6.檢查名稱解析問題
在IP位址和名稱上使用 nslookup 或 Resolve-DnsName 來驗證 DNS 解析:
nslookup <IP_Address> nslookup <ServerName>
Resolve-DnsName -Name <ServerName> Resolve-DnsName -Name <IP_address>
名稱是否解析為正確的IP位址? IP 位址是否解析為正確的名稱?
檢查每個可能指向不正確伺服器的本機 HOSTS 檔案專案。 從命令提示字元中,使用下列命令列印 HOSTS 檔案:
type C:\WINDOWS\system32\drivers\etc\hosts
Get-Content 'C:\WINDOWS\system32\drivers\etc\hosts'
檢查複本上定義的用戶端是否有伺服器別名可供使用
7.確定您的 SQL Server 正在執行最近的組建(最好是 最新的組建)
- 更新 SQL Server 版本,以防止發生KB3213703之類的問題。
如需詳細資訊,請參閱 建立可用性群組失敗,錯誤 35250「無法聯結資料庫」