Как убить все текущие соединения с базой данных SQL Server 2005? - PullRequest
281 голосов
/ 14 августа 2008

Я хочу переименовать базу данных, но продолжаю получать сообщение об ошибке «Не удалось установить эксклюзивную блокировку» для базы данных, что означает, что некоторые соединения все еще активны.

Как я могу уничтожить все соединения с базой данных, чтобы переименовать ее?

Ответы [ 19 ]

374 голосов
/ 14 августа 2008

См. Убить все активные подключения к базе данных .

Причина, по которой подход, предложенный Адамом , не сработает, состоит в том, что в течение цикла, когда вы зацикливаетесь на активных соединениях, может быть установлено новое соединение, и вы его пропустите. В статье, на которую я ссылался, используется следующий подход, который не имеет этого недостатка:

-- set your current connection to use master otherwise you might get an error

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER
110 голосов
/ 14 августа 2008

Сценарий для этого, замените 'DB_NAME' на базу данных, чтобы уничтожить все соединения с:

USE master
GO

SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''

Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)

IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END
53 голосов
/ 12 мая 2010

Убейте его и убейте огнем:

USE master
go

DECLARE @dbname sysname
SET @dbname = 'yourdbname'

DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END
27 голосов
/ 14 августа 2008

Использование SQL Management Studio Express:

В дереве обозревателя объектов перейдите в раздел «Управление» к «Монитор активности» (если его там нет, щелкните правой кнопкой мыши сервер базы данных и выберите «Монитор активности»). Открыв Activity Monitor, вы можете просмотреть всю информацию о процессе. Вы должны быть в состоянии найти блокировки для интересующей вас базы данных и убить эти блокировки, что также приведет к разрыву соединения.

После этого вы сможете переименовать.

24 голосов
/ 15 августа 2008

Я всегда использовал:


ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
SP_RENAMEDB 'DB_NAME','DB_NAME_NEW'
Go 
ALTER DATABASE DB_NAME_NEW  SET MULTI_USER -- set back to multi user 
GO 
21 голосов
/ 18 июля 2012
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE
14 голосов
/ 05 января 2011

Отключение от сети занимает некоторое время, и иногда возникают некоторые проблемы с этим ..

Самый солидный на мой взгляд способ:

Отделить Щелкните правой кнопкой мыши БД -> Задачи -> Отделить ... отметьте «Отключить соединения» Ok

Заново Щелкните правой кнопкой мыши Базы данных -> Прикрепить .. Добавить ... -> выберите базу данных и измените столбец «Присоединить как» на нужное имя базы данных. Хорошо

6 голосов
/ 01 февраля 2012
Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'

Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((                              
            select '  ' + KillCommand from #temp
            FOR XML PATH('')),1,1,'') 
Execute sp_executesql @query 
Drop table #temp

используйте базу данных 'master' и выполните этот запрос, он уничтожит все активные соединения из вашей базы данных.

5 голосов
/ 15 августа 2008

Обычно я сталкиваюсь с этой ошибкой, когда пытаюсь восстановить базу данных. Обычно я просто захожу в верхнюю часть дерева в Management Studio и щелкаю правой кнопкой мыши и перезагружаю сервер базы данных (поскольку он находится на компьютере разработчика, это может быть идеален в производстве). Это закроет все соединения с базой данных.

4 голосов
/ 19 августа 2011

Другой подход "убей его огнем" - просто перезапустить службу MSSQLSERVER. Мне нравится делать вещи из командной строки. Вставка именно в CMD сделает это: NET STOP MSSQLSERVER и NET START MSSQLSERVER

Или откройте файл «services.msc», найдите «SQL Server (MSSQLSERVER)» и щелкните правой кнопкой мыши, выберите «restart».

Это «наверняка, наверняка» уничтожит ВСЕ соединения со ВСЕМИ базами данных, работающими в этом экземпляре.

(мне нравится это лучше, чем многие подходы, которые изменяют и возвращают конфигурацию на сервере / базе данных)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...