まえがき
多くの場合、何らかのアプリケーションが何らかの理由でデータベースへの接続を長時間維持する場合があります。 それは些細なことのように思えますが、そのようなソフトウェアが複数の接続を作成するか、さらに悪いことに、そのようなアプリケーションがいくつかある場合は、何らかの方法でこれを処理する方が良いです。
この記事はガイドではありません。 その中で、私はこの問題の可能な解決策を示したかっただけです。 代替ソリューションが提供されれば嬉しいです。
解決策
1)指定したデータベースへの特定のユーザーのすべての接続またはすべての接続を閉じるストアドプロシージャを作成しましょう。
USE [__] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [srv].[KillConnect] @databasename nvarchar(255), -- @loginname nvarchar(255)=NULL -- AS BEGIN /* */ SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; if(@databasename is null) begin ;THROW 50000, ' !', 0; end else begin declare @dbid int=db_id(@databasename); if(@dbid is NULL) begin ;THROW 50000, ' !', 0; end else if @dbid <= 4 begin ;THROW 50000, ' !', 0; end else begin declare @query nvarchar(max); set @query = ''; select @query=coalesce(@query,',' ) +'kill ' +convert(varchar, spid) +'; ' from master..sysprocesses where dbid=db_id(@databasename) and spid<>@@SPID and (loginame=@loginname or @loginname is null); if len(@query) > 0 begin begin try exec(@query); end try begin catch end catch end end end END GO
彼女は決定に必要ありません。 このストアドプロシージャは、データベースまたは特定のユーザーへのすべての接続を手動で切断して、さらにデータベースを操作するのに役立ちます。
2)ストアドプロシージャを作成して、ハングしているプロセスをすべて削除します。
USE [__] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [srv].[KillFullOldConnect] AS BEGIN /* , . ! master, tempdb, model msdb . , distribution . */ SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; declare @query nvarchar(max); set @query = ''; select @query=coalesce(@query,',' ) +'kill ' +convert(varchar, spid) +'; ' from master..sysprocesses where dbid>4 and [last_batch]<dateadd(day,-1,getdate()) order by [last_batch] if len(@query) > 0 begin begin try exec(@query); end try begin catch end catch end END GO
このストアドプロシージャは、1日以上前に最後に行われたすべての接続を削除します。 また、このストアドプロシージャは、メインシステムデータベース(master、tempdb、model、msdb)には影響しません。 アクセスが要求され、接続が切断された場合、要求されたユーザーとのこのアプリケーション用の新しい接続が作成されるため、ひどいことは何も起こりません。
そして、アイテム2のストアドプロシージャは、エージェントのタスクで1日に1回実行するのに十分です。
exec [__].[srv].[KillFullOldConnect];
もちろん、特定の呼び出しをtry-catchブロックで囲み、考えられる例外呼び出しを処理することをお勧めします。
結果
この記事では、データベース(すべてまたは特定のユーザー)への接続を閉じ、ダングリングプロセスを終了するためのストアドプロシージャの実装例を検討しました。 ダングリングプロセスを完了するためのタスクの毎日の自動開始の例も検討されました。 これにより、サーバーへのデッド接続の数が減ります。 データベースへのすべての接続を削除すると、そのプロパティの一部を変更したり、問題を引き起こすプロセスを緊急に終了したりできます。
ソース:
» システムプロセス
» 殺す
» Db_id
» @@ SPID