Sql-Server
當計劃的過程在離線 Oracle 數據庫上的 DBLink 中進行選擇時,SQL Server 代理崩潰
我有 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;