web-dev-qa-db-ja.com

自動化されたSP_WhoIsActive SQLアクティビティキャプチャの問題

以下のメッセージで失敗し続ける運用サーバーにSQLエージェントジョブがあります。 SP_WHOISACTIVE 定期的にスケジュールされた間隔でストアドプロシージャ。

ユーザーとして実行:警告:Null値は、集計または他のSET操作によって削除されます。 [SQLSTATE 01003](メッセージ8153)

警告:Null値は、集計またはその他のSET操作によって削除されます。 [SQLSTATE 01003](メッセージ8153)

警告:Null値は、集計またはその他のSET操作によって削除されます。 [SQLSTATE 01003](メッセージ8153)

PRIMARY KEY制約「PK_WhoIsActive」の違反。オブジェクト 'monitoring.WhoIsActive'に重複キーを挿入できません。重複するキーの値は(Jan 20 2017 8:25 AM、109)です。 [SQLSTATE 23000](エラー2627)

ステートメントは終了されました。 [SQLSTATE 01000](エラー3621)。

ステップは失敗しました。

これを引き起こしている可能性のあるアイデアは何ですか?

このエラーを修正するには、どの手順に従う必要がありますか?

3
shamim

SQLエージェントジョブを介したSP_WHOISACTIVEおよびSP_WHO2によるSQL Serverアクティビティのキャプチャの自動化

これを引き起こしている可能性のあるアイデアは何ですか?

明らかに、現在のプロセスでは、定義されたJan 20 2017 8:25AM, 109主キーごとに値がPK_WhoIsActiveであるようなデータの複製を許可しない制約のあるテーブルに重複データを挿入しようとすると問題が発生します。

このエラーを修正するには、どの手順に従う必要がありますか?

以下のこの種のタスクで成功して使用したロジックをコピーしました。 (両方に対して)テーブル作成ロジックを1回実行しますが、後で参照するために、コメントアウトまたはスキップしたSQLエージェントステップに保存します。

以下でSP_WHOISACTIVESP_WHO2の両方のキャプチャメソッドとロジックを共有しましたが、SP_WHO2プロセスを実行するためにDBにいることを確認してください。これは、ロジックが暗黙的であるためです。 SP_WHOISACTIVEプロセスのロジックは明示的であるため、テーブルとDB名を必ず指定してください。

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
4
Pimp Juice IT

主キー名から、Adam Machanicのsp_WhoIsActiveを実行しており、結果をテーブルに格納しているように見えます。

その場合、警告は正常であり、sp_WhoIsActiveを呼び出すときに設定したオプションによって発生します。主キー違反は、ジョブの失敗の原因です。

主キーの定義を見てください。

一意性を保証するために、Primay Keyを変更する必要があると思います。

この実装では、テーブルをヒープとして残し、このテーブルに主キーを定義しません。数日分のデータをテーブルに保持するだけで、レプリケーションには使用しません。

これを実装する方法についての記事を次に示します。 sp_WhoIsActiveのブレントオザー実装

4
MillhouseD