sql >> Databáze >  >> RDS >> Sqlserver

Automatické mazání zaseknutých procesů v MS SQL Server

Úvod

Existují situace, kdy aplikace udržují připojení k databázi po dlouhou dobu. Zdá se, že to není důležité. Pokud však tato aplikace vytváří mnoho spojení nebo existuje několik aplikací s takovým chováním – věci se zhoršují.

Tento článek není návod. Popisuje možná řešení tohoto problému. Jako obvykle rád uslyším jakékoli alternativní řešení.

Řešení

1. Vytvořte uloženou proceduru, která uzavře všechna připojení nebo připojení určitého uživatele k zadané databázi:

USE [DATABASE_NAME]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [srv].[KillConnect]
    @databasename nvarchar(255), -- database
    @loginname    nvarchar(255)=NULL  -- login details
AS
BEGIN
    /*
     deletes connections for the specified database and login details access
    */
    SET NOCOUNT ON;
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

    if(@databasename is null)
    begin
        ;THROW 50000, 'A database is not specified!', 0;
    end
    else
    begin
        declare @dbid int=db_id(@databasename);

        if(@dbid is NULL)
        begin
            ;THROW 50000, 'The database does not exist!', 0;
        end
        else if @dbid <= 4
        begin
            ;THROW 50000, 'To delete connections to a system database is forbidden!', 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 ([email protected] or @loginname is null);

            if len(@query) > 0
            begin
                begin try
                    exec(@query);
                end try
                begin catch
                end catch
            end
        end
    end
END

GO

Tato uložená procedura pomáhá ručně zakázat všechna připojení k databázi nebo určitému uživateli pro další akce s databází.

2. Vytvořte uloženou proceduru k odstranění všech zaseknutých procesů.

USE [DATABASE_NAME]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [srv].[KillFullOldConnect]
AS
BEGIN
    /*
       It deletes the connections which were executed a day ago. 
       Attention! System databases such as master, tempdb, model and msdb 
       do not take part in this process. 
       However, it does not affect database distribution for replication.
    */
    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

Tato uložená procedura odebere připojení, která byla dokončena před více než 24 hodinami. Tento postup navíc neovlivní hlavní systémové databáze (master, tempdb, model a msdb). Pokud se pokusíte o přístup k databázi, když je připojení zakázáno, vytvoří se pro tuto aplikaci nové připojení.

Nyní je nutné jednou denně spustit uloženou proceduru v úloze Agent:

exec [DATABASE_NAME].[srv].[KillFullOldConnect];

Bylo by lepší zabalit tento dotaz do bloku try-catch, aby bylo možné zpracovat možné volání výjimek.

Výsledek

V tomto článku jsem analyzoval, jak implementovat uložené procedury při uzavření připojení k databázi (všem nebo určitému uživateli) a jak odstranit zaseknuté procesy na konkrétním příkladu. Kromě toho jsem na konkrétním příkladu prozkoumal, jak denně automaticky spouštět úlohu při mazání zaseknutých procesů. Umožňuje snížit množství „mrtvých“ připojení k serveru. Odstranění všech připojení k databázi vám umožní upravit některé vlastnosti a také ukončit proces, který způsobuje jakýkoli problém.

Odkazy:

» sysprocesses
» kill
» db_id
» @@SPID


  1. Nodejs vyjadřuje a slibuje, že neudělá to, co očekávám

  2. Převod data v MySQL z pole řetězce

  3. Jak vytvořit index na poli JSON v Postgresu?

  4. Vložit text s jednoduchými uvozovkami v PostgreSQL