自動 SP_WhoIsActive SQL 活動擷取問題
我在生產伺服器上有一個 SQL 代理作業,它不斷失敗並顯示以下消息。它應該
SP_WHOISACTIVE
定期使用儲存過程擷取 SQL Server 活動。以使用者身份執行:警告:空值被聚合或其他 SET 操作消除。
$$ SQLSTATE 01003 $$(消息 8153) 警告:空值被聚合或其他 SET 操作消除。
$$ SQLSTATE 01003 $$(消息 8153) 警告:空值被聚合或其他 SET 操作消除。
$$ SQLSTATE 01003 $$(消息 8153) 違反主鍵約束“PK_WhoIsActive”。無法在對象“monitoring.WhoIsActive”中插入重複鍵。重複鍵值為 (Jan 20 2017 8:25AM, 109)。
$$ SQLSTATE 23000 $$(錯誤 2627) 該語句已終止。
$$ SQLSTATE 01000 $$(錯誤 3621)。 步驟失敗。
知道可能是什麼原因造成的嗎?
我應該遵循哪些步驟來修復此錯誤?
SP_WHOISACTIVE
使用和SP_WHO2
通過 SQL 代理作業自動擷取 SQL Server 活動知道可能是什麼原因造成的嗎?
顯然,您目前的流程在嘗試在具有約束的表上插入重複數據時遇到問題,該約束不允許在值是
Jan 20 2017 8:25AM, 109
每個定義的PK_WhoIsActive
主鍵的情況下重複此類數據。我應該遵循哪些步驟來修復此錯誤?
我已經複製了我在下面的此類任務中成功使用的邏輯。我執行一次創建表邏輯(兩者都執行),但將其保存到註釋掉或跳過的 SQL 代理步驟,僅供將來參考。
我在下面分享
SP_WHOISACTIVE
了SP_WHO2
擷取方法和邏輯,但請確保您在數據庫上執行SP_WHO2
程序,因為它的邏輯是隱式的。請務必在SP_WHOISACTIVE
程序中指定表和數據庫名稱,因為其邏輯是明確的。SP_WhoIsActive 表擷取
創建表
DECLARE @destination_table VARCHAR(4000); SET @destination_table = 'WhoIsActive_Cap'; DECLARE @schema VARCHAR(4000); EXEC sp_WhoIsActive @get_transaction_info = 1 ,@get_plans = 1 ,@return_schema = 1 ,@schema = @schema OUTPUT; SET @schema = REPLACE(@schema, '<table_name>', @destination_table); PRINT @schema EXEC (@schema);
擷取到表
SET @destination_table = '[<DB_Name>].dbo.WhoIsActive_Cap' EXEC Master.dbo.sp_WhoIsActive @get_transaction_info = 1 ,@get_plans = 1 ,@destination_table = @destination_table; -- remove records older than 7 days but adjust accordingly for your needs DELETE FROM [<DB_Name>].dbo.WhoIsActive_Cap WHERE collection_time < dateadd(dd, -7, getdate())
SP_WHO2 表擷取
創建表
CREATE TABLE dbo.who2cap ( SPID INT ,[Status] VARCHAR(100) ,[Login] VARCHAR(100) ,HostName VARCHAR(50) ,BlkBy VARCHAR(10) ,DBName VARCHAR(255) ,Command VARCHAR(500) ,CPUTime INT ,DiskIO INT ,LastBatch VARCHAR(20) ,ProgramName VARCHAR(500) ,SPID2 INT ,REQUESTID INT )
擷取到表
CREATE TABLE #who2cap ( SPID INT ,[Status] VARCHAR(100) ,[Login] VARCHAR(100) ,HostName VARCHAR(50) ,BlkBy VARCHAR(10) ,DBName VARCHAR(255) ,Command VARCHAR(500) ,CPUTime INT ,DiskIO INT ,LastBatch VARCHAR(20) ,ProgramName VARCHAR(500) ,SPID2 INT ,REQUESTID INT ) INSERT #who2cap EXEC sp_who2 -- remove old entries (currently set to 3 weeks) DELETE FROM dbo.who2cap WHERE logdt < dateadd(dd, - 21, getdate()) INSERT INTO dbo.who2cap SELECT getdate() ,* FROM #who2cap DROP TABLE #who2cap