'ALTER DATABASE failed because a lock could not be placed on database '<db_name>'. Try again later
I really don't care what I do with this test database...it's for sandbox testing (attached to a production server instance)! All I'm trying to do is KILL all connections, drop and create test_db, if not asking for to much....and restore with some test data.
I've tried USE [MASTER] RESTORE DATABASE test_DB WITH RECOVERY GO , but got this error:
Msg 3101, Level 16, State 1, Line 1 Exclusive access could not be obtained because the database is in use. Msg 3013, Level 16, State 1, Line 1 RESTORE DATABASE is terminating abnormally.
Also, triedUSE [master] ALTER DATABASE test_DB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;, and got error:
Msg 5061, Level 16, State 1, Line 1 ALTER DATABASE failed because a lock could not be placed on database 'test_DB'. Try again later.
Msg 5069, Level 16, State 1, Line 1 ALTER DATABASE statement failed.
Also didselect min(spid) from master..sysprocesses where dbid = db_id('test_DB'), but my result set returned NULL
Below is my code:
--- Kill Connections
USE [master]
DECLARE @cmdKill VARCHAR(50)
DECLARE killCursor CURSOR FOR
SELECT 'KILL ' + Convert(VARCHAR(5), p.spid)
FROM master.dbo.sysprocesses AS p
WHERE p.dbid = db_id('test_DB')
OPEN killCursor
FETCH killCursor INTO @cmdKill
WHILE 0 = @@fetch_status
BEGIN
EXECUTE (@cmdKill)
FETCH killCursor INTO @cmdKill
END
CLOSE killCursor
DEALLOCATE killCursor
--Drop and Create
USE [master]
GO
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'test_DB')
DROP DATABASE [test_DB]
GO
USE [master]
GO
CREATE DATABASE [test_DB] ON PRIMARY
( NAME = N'test_db_Data', FILENAME = N'\\some_place\d$\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test_DB.mdf' , SIZE = 125635136KB , MAXSIZE = UNLIMITED, FILEGROWTH = 20%)
LOG ON
( NAME = N'test_db_Log', FILENAME = N'E:\SQLLogs\test_DB.ldf' , SIZE = 1064320KB , MAXSIZE = UNLIMITED, FILEGROWTH = 20%)
GO
ALTER DATABASE [test_db] SET ....
Solution 1:[1]
A database cannot be taken offline if there are still open connections to it.
Also, make sure your connection is not using that DB (USE master) then use the WITH ROLLBACK IMMEDIATE option of the ALTER DATABASE to take it offline.
Solution 2:[2]
Do you know who is connected?
SELECT
DB_NAME(dbid) as 'DBName'
, loginame as 'Login'
, COUNT(dbid) as 'Connections'
FROM
sys.sysprocesses
WHERE
dbid > 0
GROUP BY
dbid
, loginame
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | TT. |
| Solution 2 | SQLburn |
