以下のメッセージで失敗し続ける運用サーバーに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)。
ステップは失敗しました。
これを引き起こしている可能性のあるアイデアは何ですか?
このエラーを修正するには、どの手順に従う必要がありますか?
SP_WHOISACTIVE
およびSP_WHO2
によるSQL Serverアクティビティのキャプチャの自動化これを引き起こしている可能性のあるアイデアは何ですか?
明らかに、現在のプロセスでは、定義されたJan 20 2017 8:25AM, 109
主キーごとに値がPK_WhoIsActive
であるようなデータの複製を許可しない制約のあるテーブルに重複データを挿入しようとすると問題が発生します。
このエラーを修正するには、どの手順に従う必要がありますか?
以下のこの種のタスクで成功して使用したロジックをコピーしました。 (両方に対して)テーブル作成ロジックを1回実行しますが、後で参照するために、コメントアウトまたはスキップしたSQLエージェントステップに保存します。
以下でSP_WHOISACTIVE
とSP_WHO2
の両方のキャプチャメソッドとロジックを共有しましたが、SP_WHO2
プロセスを実行するためにDBにいることを確認してください。これは、ロジックが暗黙的であるためです。 SP_WHOISACTIVE
プロセスのロジックは明示的であるため、テーブルとDB名を必ず指定してください。
テーブルの作成
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())
テーブルの作成
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
主キー名から、Adam Machanicのsp_WhoIsActiveを実行しており、結果をテーブルに格納しているように見えます。
その場合、警告は正常であり、sp_WhoIsActiveを呼び出すときに設定したオプションによって発生します。主キー違反は、ジョブの失敗の原因です。
主キーの定義を見てください。
一意性を保証するために、Primay Keyを変更する必要があると思います。
この実装では、テーブルをヒープとして残し、このテーブルに主キーを定義しません。数日分のデータをテーブルに保持するだけで、レプリケーションには使用しません。
これを実装する方法についての記事を次に示します。 sp_WhoIsActiveのブレントオザー実装