Sql-Server

當計劃的過程在離線 Oracle 數據庫上的 DBLink 中進行選擇時,SQL Server 代理崩潰

  • March 5, 2021

我有 SQL Server 2014,我正在使用 SQL Server 代理在白天啟動一些計劃的程序。這些過程在由另一家公司處理的 Oracle 數據庫上進行一些選擇(在 DBlink 中)。有時 Oracle 數據庫處於離線狀態,我的程序似乎卡住了,我應該重新啟動整個伺服器以使 SQL Server 代理再次工作。

我究竟做錯了什麼?我想有一種超時來結束過程並釋放 SQL 代理。

選擇範例:

SELECT * from openquery(positions,
'SELECT * from oracleTableDbLink.POSITION'
) 

您可以為對遠端伺服器的查詢配置超時。文件在這裡(https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/configure-the-remote-query-timeout-server-configuration-option?view=sql-server -ver15 )

您可以使用此腳本在數據庫上更改此設置,該腳本設置 100 秒超時

USE AdventureWorks2012 ;  
GO  
EXEC sp_configure 'remote query timeout', 100 ;  
GO  
RECONFIGURE ;  
GO 

似乎沒有辦法在 T-SQL 中為一條語句設置查詢超時。此處將對此進行更詳細的討論。

我看到另一個使用者建議在 SQL Server 上的客戶端上配置 sqlnet.ora 文件,但是應該對此進行測試,因為我相信即使客戶端終止了連接,SQL Server 仍會等待來自客戶端的響應。

在您進行測試時,您不需要重新啟動伺服器。只需重新啟動代理服務,這將終止所有正在執行的作業。

在進行實際工作之前,您還可以考慮測試查詢。試試這個,如果它返回一個值,Oracle 數據庫就啟動了。

select 1 from dual;

由於連結伺服器查詢中可能出現問題的所有地方,漢娜弗農的這個答案可能會有所幫助。

她建議圍繞初始測試進行一些錯誤處理,以便在動態語句執行時在執行時發現任何問題

BEGIN TRY
   DECLARE @cmd nvarchar(max);
   SET @cmd = 'SELECT * FROM OPENQUERY([server1], ''SELECT 1 AS c;'');';
   EXEC sp_executesql @cmd;
END TRY
BEGIN CATCH
   SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;

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