Как вы убиваете все текущие подключения к базе данных 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 и убить весь процесс, который использует вашу базу данных, а затем переименовать вашу базу данных.