Sql-Server
連結伺服器超時 - 未查詢
我有一份在全球多個地區執行的工作。根據正在執行的區域和所在的時區,作業可能不會執行。它用於
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