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

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

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

19 ответов


посмотреть Убить Все Активные Подключения К Базе Данных.

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

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

скрипт для этого замените "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

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

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

с помощью среды SQL студии экспресс:

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

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


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


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 

ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE

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

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

отключить Щелкните правой кнопкой мыши DB - > задачи - > отсоединить... проверить " Drop Connections" Ok

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


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


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


в MS SQL Server Management Studio в обозревателе объектов щелкните правой кнопкой мыши базу данных. В контекстном меню, которое следует выберите "задачи - > Take Offline"


другой подход "убить его огнем" - просто перезапустить службу MSSQLSERVER. Мне нравится делать что-то из командной строки. Вставка этого точно в CMD сделает это: ЧИСТАЯ ОСТАНОВИТЕ MSSQLSERVER & ЧИСТЫЙ ЗАПУСТИТСЯ MSSQLSERVER

или открыть "сервис.msc "и найдите" SQL Server (MSSQLSERVER)" и щелкните правой кнопкой мыши, выберите "перезапустить".

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

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


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

  1. в дереве обозревателя объектов щелкните правой кнопкой мыши корневой сервер базы данных (зеленой стрелкой) и выберите монитор активности.
  2. откройте вкладку процессы в мониторе активности, выберите раскрывающееся меню "базы данных" и отфильтруйте нужную базу данных.
  3. щелкните правой кнопкой мыши БД в Обозревателе объектов и запустите " задачи - > взять Offline " задача. Оставьте это в фоновом режиме, пока вы...
  4. безопасно выключите все, что сможете.
  5. убить все оставшиеся процессы на вкладке процесс.
  6. включите БД.
  7. переименовать БД.
  8. верните свой сервис в онлайн и укажите его на новую БД.

параметр работает для меня в этом случае выглядит следующим образом:

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

попробуйте это:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

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


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


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


Я использую 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

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

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

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