SQL Server comment gérer l'erreur : Error 1807 Could not obtain exclusive lock on database ‘model’.

Toutefois, je tiens à rappeler que ce scénario est probablement lié à un traitement de création de base de données et de sa transformation. Dans ces circonstances, il est probable que des connexions ouvertes trainent quelque part via l'éxecution de processus CI / CD, ligne de commande ou une application dont vous n'avez même pas connaissance effectue ce genre d'opérations. Si cela vient à se reproduire, je vous invite à faire un peu d'audit sur les opérations qui s'effectuent afin de trouver le coupable à la source.

Quoi qu'il en soit, vous vous retrouvez avec cette erreur et vous êtes incapable de créer de nouvelles base de données. C'est facheux :D, le billet permet de voir les étapes à suivre pour résoudre votre probléme.

Afin de résoudre votre probléme il faudra procéder en deux étapes. La première consiste à trouver les connexions coupable. Puis à tuer les coupables. Et oui, en informatique on ne fait pas dans "la dentelle de saint galle" ce qui est en total opposition de ce que mon chef se retrouve à faire avec les équipes métiers en fait :P. A chacun ces pratiques, la tronçonneuse ou le scapel... Personnellement, je suis assez joueur du coup, je varie les plaisir :) c'est aussi ce qui permet d'être en adéquation à toutes les circonstances...

Bref, pour revenir à nous moutons. Ci dessous vous trouverez une portion de code permettant de chercher les connexions qui vous pose probléme :

La démarche va consister à chercher les connexions qui sont ouverte :

IF EXISTS (

        SELECT request_session_id

        FROM sys.dm_tran_locks

        WHERE resource_database_id = DB_ID('model')

        )

BEGIN

    PRINT 'Model Database in use!!'

 

    SELECT *

    FROM sys.dm_exec_sessions

    WHERE session_id IN (

            SELECT request_session_id

            FROM sys.dm_tran_locks

            WHERE resource_database_id = DB_ID('model')

            )

END

ELSE

    PRINT 'Model Database not in used.'

 

Puis pour finir le travail en assassinant les coupables sans jugement :

SELECT 'KILL ' + CONVERT(varchar(10), l.request_session_id)

 FROM sys.databases d, sys.dm_tran_locks l

 WHERE d.database_id = l.resource_database_id

 AND d.name = 'model'

 

Affaire à suivre.


Rejoindre la conversation