Sql-Server

自動 SP_WhoIsActive SQL 活動擷取問題

  • May 17, 2017

我在生產伺服器上有一個 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_WHOISACTIVESP_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

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