Как вы убиваете все текущие подключения к базе данных SQL Server 2005?

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

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

Ответ 1

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

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

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

Ответ 2

Script, чтобы выполнить это, замените "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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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


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 

Ответ 6

ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE

Ответ 7

В автономном режиме требуется время, а иногда я испытываю некоторые проблемы с этим.

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

Detach Щелкните правой кнопкой мыши DB → Tasks → Detach... установите флажок "Отключить соединения" Ok

Присоедините Щелкните правой кнопкой мыши Базы данных → Прикрепить. Добавить... → выберите вашу базу данных и измените столбец Attach As на нужное имя базы данных. Ok

Ответ 8

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" и запустите этот запрос, он убьет все активные соединения из вашей базы данных.

Ответ 9

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

Ответ 10

В MS SQL Server Management Studio в проводнике объектов щелкните правой кнопкой мыши по базе данных. В следующем контекстном меню выберите "Задачи → Снять автономное"

Ответ 11

Здесь, как надежно подобная вещь в MS SQL Server Management Studio 2008 (может работать и для других версий):

  • В Дереве проводника объектов щелкните правой кнопкой мыши корневой сервер базы данных (с зеленой стрелкой), затем выберите монитор активности.
  • Откройте вкладку процессов на мониторе активности, выберите раскрывающееся меню "базы данных" и отфильтруйте нужную базу данных.
  • Щелкните правой кнопкой мыши базу данных в Проводнике объектов и запустите задачу "Задачи → Возьмите автономную". Оставьте это в фоновом режиме, пока вы...
  • Безопасное закрытие, что вы можете.
  • Убейте все оставшиеся процессы на вкладке процесса.
  • Принесите БД обратно в сеть.
  • Переименуйте DB.
  • Принесите свою услугу обратно в сеть и укажите ее на новую БД.

Ответ 12

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

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

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

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

Ответ 13

Вариант, который работает для меня в этом сценарии, выглядит следующим образом:

  • Запустите операцию "Отсоединить" в соответствующей базе данных. Это откроет окно (в SQL 2005), отображающее активные соединения, которые предотвращают действия в БД.
  • Убейте активные соединения, отмените операцию отсоединения.
  • Теперь база данных должна быть доступна для восстановления.

Ответ 14

Попробуйте следующее:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

Ответ 15

Щелкните правой кнопкой мыши имя базы данных, выберите свойство, чтобы получить окно свойств, откройте вкладку "Параметры" и измените свойство "Ограничить доступ" от многопользовательского пользователя до одиночного пользователя. Когда вы нажмете на кнопку OK, она предложит вам закрыть все открытое соединение, выбрать "Да", и вы настроили переименование базы данных....

Ответ 16

Это не сработало для меня (SQL2008 Enterprise), я также не видел никаких запущенных процессов или пользователей, подключенных к БД. Перезапуск сервера (щелкните правой кнопкой мыши на Sql Server в Management Studio и выберите "Перезагрузка" ), чтобы восстановить базу данных.

Ответ 17

Я использую SQL Server 2008 R2, моя БД уже настроена для одного пользователя, и было соединение, которое ограничивало любые действия в базе данных. Таким образом, рекомендованное решение SQLMenace ответило на ошибку. Вот тот, который работал в моем случае.

Ответ 18

Я использую sp_who для получения списка всего процесса в базе данных. Это лучше, потому что вы можете просмотреть, какой процесс нужно убить.

declare @proc table(
    SPID bigint,
    Status nvarchar(255),
    Login nvarchar(255),
    HostName nvarchar(255),
    BlkBy nvarchar(255),
    DBName nvarchar(255),
    Command nvarchar(MAX),
    CPUTime bigint,
    DiskIO bigint,
    LastBatch nvarchar(255),
    ProgramName nvarchar(255),
    SPID2 bigint,
    REQUESTID bigint
)

insert into @proc
exec sp_who2

select  *, KillCommand = concat('kill ', SPID, ';')
from    @proc

Результат
Вы можете использовать команду в столбце KillCommand, чтобы убить процесс, который вы хотите.

SPID    KillCommand
26      kill 26;
27      kill 27;
28      kill 28;

Ответ 19

Вы можете использовать команду SP_Who и убить весь процесс, который использует вашу базу данных, а затем переименовать вашу базу данных.