131 votes

ALTER DATABASE a échoué car un verrou n'a pas pu être placé sur la base de données.

Je dois redémarrer une base de données car certains processus ne fonctionnent pas. J'ai l'intention de la mettre hors ligne et de la remettre en ligne.

J'essaie de faire cela dans Sql Server Management Studio 2008 :

use master;
go
alter database qcvalues
set single_user
with rollback immediate;
alter database qcvalues
set multi_user;
go

J'obtiens ces erreurs :

Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
Msg 5061, Level 16, State 1, Line 4
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 4
ALTER DATABASE statement failed.

Qu'est-ce que je fais de mal ?

0 votes

Quel est le problème qui a provoqué ce besoin en premier lieu ? Avez-vous des transactions de retour en arrière en ce moment ? Avez-vous déjà exécuté cette commande dans une autre fenêtre SSMS qui pourrait être encore ouverte ? Je me demande (pure spéculation) si cela pourrait prendre un verrou qui bloque les autres tentatives, mais il est toujours en attente avant que la base de données puisse effectivement être mise en mode mono-utilisateur.

1 votes

Martin - c'est juste. Je dois penser à autre chose ou perdre la tête. L'un ou l'autre est tout à fait possible.

0 votes

Merci beaucoup à tous, j'ai redémarré SSMS et j'ai pu tuer tout le monde.

303voto

bobs Points 12893

Après avoir obtenu l'erreur, exécutez

EXEC sp_who2

Cherchez la base de données dans la liste. Il est possible qu'une connexion n'ait pas été interrompue. Si vous trouvez des connexions à la base de données, exécutez

KILL <SPID>

<SPID> est le SPID des sessions qui sont connectées à la base de données.

Essayez votre script après que toutes les connexions à la base de données aient été supprimées.

Malheureusement, je n'ai pas la raison pour laquelle vous rencontrez ce problème, mais voici un lien qui montre que le problème s'est produit ailleurs.

http://www.geakeit.co.uk/2010/12/11/sql-take-offline-fails-alter-database-failed-because-a-lock-could-not-error-5061/

0 votes

Pouvez-vous expliquer pourquoi une connexion ne serait pas interrompue par la commande ? La seule raison qui me vient à l'esprit est que le processus de retour en arrière est toujours en cours ou qu'il s'agit d'un problème de sécurité. set single_user qui est toujours en cours.

0 votes

Martin, j'ai peur de ne pas avoir de raison pour cela. Mais, je vais ajouter un lien qui indique que d'autres ont vu le problème. Je suis d'accord sur le fait qu'un retour en arrière de transaction pourrait être le problème, mais la KILL ne le résoudrait pas non plus.

0 votes

Ce serait bien de comprendre pourquoi cela se produit, mais les commentaires sur votre lien semblent indiquer que cela pourrait fonctionner ! (+1)

5voto

Martin Smith Points 174101

J'ai réussi à reproduire cette erreur en procédant comme suit.

Connexion 1 (laisser fonctionner pendant quelques minutes)

CREATE DATABASE TESTING123
GO

USE TESTING123;

SELECT NEWID() AS X INTO FOO
FROM sys.objects s1,sys.objects s2,sys.objects s3,sys.objects s4 ,sys.objects s5 ,sys.objects s6

Connexions 2 et 3

set lock_timeout 5;

ALTER DATABASE TESTING123 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

2voto

Watki02 Points 998

Essayez ceci si elle est "en transition" ...

http://learnmysql.blogspot.com/2012/05/database-is-in-transition-try-statement.html

USE master
GO

ALTER DATABASE <db_name>

SET OFFLINE WITH ROLLBACK IMMEDIATE
...
...
ALTER DATABASE <db_name> SET ONLINE

0 votes

Cela ne fonctionnera pas lorsque la base de données est en transition, vous obtiendrez la même erreur avec l'option SET OFFLINE déclaration telle que mentionnée par le PO (il y a peut-être des scénarios où cela fonctionne, mais ce n'était pas le cas pour moi)

0voto

Marty Points 221

Dans SQL Management Studio, allez dans Sécurité -> Logins et double-cliquez sur votre Login. Choisissez Server Roles dans la colonne de gauche, et vérifiez que sysadmin est coché.

Dans mon cas, j'étais connecté sur un compte sans ce privilège.

HTH !

1 votes

L'erreur dans la question originale se produit également lorsque vous êtes SA, cela n'a rien à voir avec vos droits. Si vous n'avez pas suffisamment de droits, vous ne pourrez pas exécuter la commande hors ligne.

0voto

user3749524 Points 1

Tuer l'ID du processus a bien fonctionné pour moi. En exécutant la commande "EXEC sp_who2" sur une nouvelle fenêtre de requête... et en filtrant les résultats pour la base de données "occupée", tuer les processus avec la commande "KILL" a réussi à faire l'affaire. Après cela, tout a fonctionné à nouveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X