web-dev-qa-db-fra.com

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. Mon plan est de le déconnecter et de le 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

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.

Qu'est-ce que je fais mal?

120
JOE SKEET

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é terminée. Si vous trouvez des connexions à la base de données, exécutez

KILL <SPID>

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

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

Malheureusement, je ne vois pas pourquoi vous voyez le 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-error5061/

279
bobs

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;
5
Martin Smith

Essayez ceci si c'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
Watki02

Je sais que ceci est un ancien 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 réussi à 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 la forcer dans un état de restauration plutôt que dans une récupération. 

0
Geoff Dawdy

Juste pour ajouter mes deux cents. Je me suis mis dans la même situation, tout en recherchant les privilèges minimum requis d'un nom d'utilisateur pour exécuter correctement 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 un login sysadmin, mais elle nécessite la partie nettoyage des connexions, lorsqu’elle est exécutée sous un login disposant «seulement» d’autorisations limitées telles que:

ALTER ANY DATABASE

P.S. J'ai passé des heures à essayer de comprendre pourquoi "ALTER DATABASE .." ne fonctionne pas lorsqu'il est exécuté sous un identifiant disposant des privilèges dbcreator + ALTER ANY DATABASE. Voici mon thread MSDN !

0
Veselin Z.

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

0
mitix

Dans mon scénario, aucun processus ne bloquait la base de données sous sp_who2. Cependant, nous avons découvert que les processus en attente étaient toujours en cours d'exécution, ce qui explique pourquoi la base de données du groupe de disponibilité était toujours affichée en rouge/hors connexion après que nous ayons essayé de "reprendre les données" en cliquant avec le bouton droit de la souris sur la base de données en pause.

Pour vérifier si des processus sont toujours en cours d’exécution, exécutez cette commande: sélectionnez% complete from sys.dm_exec_requests où percent_complete> 0

0
user123456789

Dans SQL Management Studio, accédez à Sécurité -> Connexions et double-cliquez sur votre connexion. Choisissez Rôles du serveur dans la colonne de gauche et vérifiez que sysadmin est coché.

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

HTH!

0
Marty

J'ajouterai ceci au cas où quelqu'un aurait la même chance que moi.

Lors de l'examen de la liste de processus sp_who2 , notez les processus qui s'exécutent non seulement pour la base de données concernée, mais également 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 KILL/RollBack state pour master database

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

Si vous rencontrez le même problème, seule la commande KILL ne vous aidera probablement pas . Vous pouvez redémarrer le serveur SQL ou, mieux, trouver le cmd.exe sous les processus Windows sur le système d'exploitation du serveur SQL et le tuer.

0
Alina

La suppression de l'ID de processus a bien fonctionné pour moi . Lors de l'exécution de la commande "EXEC sp_who2" par-dessus une nouvelle fenêtre de requête ... tour. Après cela, tout fonctionna à nouveau.

0
user3749524