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

J'ai besoin de redémarrer une base de données car certains processus ne fonctionnent pas. Mon plan est de le mettre hors ligne et de le remettre en ligne.

J'essaie de le faire 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

Je reçois 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.

Ce que je fais mal?

120
demandé sur nalply 2011-01-12 22:23:24

9 réponses

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

EXEC sp_who2

Recherchez 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>

Où {[2] } est le SPID des sessions connectées à la base de données.

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

Malheureusement, je n'ai pas de raison pourquoi vous voyez le problème, mais voici un lien qui montre que le problème a eu lieu ailleurs.

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

276
répondu bobs 2013-06-26 16:18:19

J'ai réussi à reproduire cette erreur en faisant ce qui suit.

Connexion 1 (laisser courir 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;
5
répondu Martin Smith 2011-01-12 20:11:28

Essayez ceci s'il 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
2
répondu Watki02 2012-09-29 00:17:08

Dans SQL Management Studio, accédez à Security - > Logins et double-cliquez sur votre Login. Choisissez rôles de serveur dans la colonne de gauche et vérifiez que sysadmin est cochée.

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

HTH!

0
répondu Marty 2012-12-28 15:25:32

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

0
répondu user3749524 2014-06-28 00:04:03

Juste pour ajouter mes deux cents. Je me suis mis dans la même situation, tout en recherchant les privilèges minimum requis d'une connexion db pour exécuter avec succès l'instruction:

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

Il semble que l'instruction ALTER termine avec succès , lorsqu'elle est exécutée avec une connexionsysadmin , mais elle nécessite la partie nettoyage des connexions, lorsqu'elle est exécutée sous une connexion qui a "seulement" des autorisations limitées comme:

ALTER ANY DATABASE

P.S. j'ai passé des heures à essayer de comprendre pourquoi le " ALTER La BASE de données.."ne fonctionne pas lorsqu'il est exécuté sous une connexion qui a dbcreator rôle + modifier toute base de données privilèges. Voici mon thread MSDN !

0
répondu Veselin Z. 2015-07-21 06:42:27

Je sais que c'est un vieux post, mais j'ai récemment rencontré un problème très similaire. Malheureusement, je n'ai pu utiliser aucune des commandes alter database car un verrou exclusif n'a pas pu être placé. Mais je n'ai jamais pu trouver une connexion ouverte à la base de données. J'ai finalement dû supprimer de force l'état de santé de la base de données pour le forcer à un État de restauration au lieu de dans la récupération.

0
répondu Geoff Dawdy 2017-02-09 19:04:58

Je vais ajouter ceci ici au cas où quelqu'un serait aussi chanceux que moi.

Lors de l'examen de la liste des processus sp_who2 Notez les processus qui s'exécutent non seulement pour la base de données effectuée mais aussi pour master. Dans mon cas, le problème qui bloquait la base de données était lié à une procédure stockée qui a démarré un xp_cmdshell.

Vérifiez si vous avez des processus dans l'étatKILL/RollBack pour Master database

SELECT *
FROM sys.sysprocesses
WHERE cmd = 'KILLED/ROLLBACK'

Si vous avez le même problème, juste la commande KILL n'aidera probablement pas. Vous pouvez redémarrer le serveur SQL, ou mieux est de trouver le cmd.exe sous les processus windows sur SQL server OS et le tuer.

0
répondu Alina 2018-01-08 14:10:00

Dans de rares cas (par exemple, après une transaction lourde), un processus système de point de contrôle en cours d'exécution contenant un verrou de fichier sur le fichier de base de données empêche la transition vers le mode MULTI_USER.

0
répondu mitix 2018-08-14 12:52:12