Sql-Server

連結伺服器超時 - 未查詢

  • December 4, 2019

我有一份在全球多個地區執行的工作。根據正在執行的區域和所在的時區,作業可能不會執行。它用於GOTO到達結尾並報告它由於時間原因被跳過並完成。

這按預期執行,沒有問題。

問題:有時,proc 下方的連結伺服器負載非常重。我們知道並且無法避免 - 所以我們此時不查詢連結伺服器。

但是,我們仍然收到一個錯誤,就像它被查詢一樣:

無法為連結伺服器返回消息“未指定錯誤”的 OLE DB 提供程序“SQLNCLI11”獲取架構行集“DBSCHEMA_TABLES_INFO”。

$$ SQLSTATE 01000 $$(錯誤 7412)連結伺服器的 OLE DB 提供程序“SQLNCLI11”返回消息“查詢超時已過期”。$$ SQLSTATE 01000 $$(錯誤 7412)。步驟失敗。

當 proc 開始導致此架構檢查超時時,是否驗證了連結伺服器?

這是一個猜測,但我會嘗試在重負載下為連結伺服器啟用延遲模式驗證:

EXEC master.dbo.sp_serveroption @server=N'Linked_Server_name', @optname=N'lazy schema validation', @optvalue=N'true'

如果此選項設置為 false(預設值),SQL Server 會檢查遠端表中編譯後發生的架構更改。此檢查發生在查詢執行之前。如果架構發生更改,SQL Server 將使用新架構重新編譯查詢。

如果此選項設置為 true,則遠端表的模式檢查將延遲到執行。如果遠端表的架構在查詢編譯和執行之間發生了變化,這可能會導致分佈式查詢失敗並出現錯誤。

來源

至於僅在查詢連結伺服器本身時檢查連結伺服器元數據。

另一種解決方法可能是使用動態 sql 語句來查詢連結伺服器

DECLARE @SQL nvarchar(max)
IF (Linked Server not under heavy load = true)
BEGIN
SET @SQL = 
N'SELECT * FROM OPENQUERY(LinkedServer,''SELECT * FROM master.sys.databases'')'
EXEC SP_EXECUTESQL @SQL
END

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