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

Я хочу переименовать базу данных, но продолжаю получать ошибку 'could't get exclusive lock' on the database, что подразумевает, что какое-то соединение(я) все еще активно.

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

Решение

См. раздел Kill All Active Connections To A Database.

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

-- 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
Комментарии (6)

Чтобы выполнить этот сценарий, замените '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
Комментарии (4)

Убить его, и убить его с огня:

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
Комментарии (1)

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

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

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

Комментарии (3)

Я'ве всегда используется:

в <предварительно&ГТ;&ЛТ;код&ГТ; ИЗМЕНИТЬ ПАРАМЕТРЫ DB_NAME БАЗЫ ДАННЫХ SET SINGLE_USER УКАЗАН С ОТКАТА НЕПОСРЕДСТВЕННОЙ Перейти SP_RENAMEDB 'ИМЯ_БАЗЫ_ДАННЫХ','DB_NAME_NEW' Перейти Изменить DB_NAME_NEW базы данных set MULTI_USER-установить обратно в многопользовательский Перейти &ЛТ;/код&ГТ;&ЛТ;/пре&ГТ;

Комментарии (1)
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE
Комментарии (0)

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

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

Открепить Щелкните ДБ -&ГТ; задачи -&ГТ; отсоединить... проверьте и quot;удалить соединения и quot; ОК

Подсоедините Щелкните баз данных -и GT; прикрепить.. Добавить... - и GT; выберите вашу базу данных и изменить присоединить колонки на желаемое название базы данных. ОК

Комментарии (2)
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

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

Комментарии (1)

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

Комментарии (1)

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

Комментарии (1)

Здесь's, как надежную такого рода вещи в MS SQL сервер менеджмент Студио 2008 (может работать и для других версий):

  1. В дереве обозревателя объектов, щелкните правой кнопкой мыши на корневой сервер базы данных (с зеленой стрелкой), затем выберите пункт мониторинг активности.
  2. Откройте вкладку процессов в мониторе активности, выберите 'базы данных' выпадающее меню, и фильтр по базе данных, которую вы хотите.
  3. Щелкните правой кнопкой мыши на БД в Обозревателе объектов и начать 'задачи -&ГТ; отключить' задач. Оставьте это работает в фоновом режиме, пока вы...
  4. Благополучно закрыли все, что можно.
  5. Убить всех оставшихся процессов во вкладке Процессы.
  6. Привести БД к сети.
  7. Переименовать БД.
  8. Принесите вашим услугам он-лайн и укажите в нем новую БД.
Комментарии (0)

Еще один "убить его с огня и quot; подход-просто перезапустите службу mssqlserver. Мне нравится делать вещи из командной строки. Наклеивать именно в ЦМД будет делать это: Чистая остановка &амп служба mssqlserver, чистая запустится mssqlserver

Или открыть "и услуг.МСЦ" и обнаружить "SQL-сервер&я (имя mssqlserver), и правой кнопкой, выберите и quot;перезагрузить" по.

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

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

Комментарии (3)

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

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

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

Комментарии (0)

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

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
Комментарии (0)

Это не't работа для меня (SQL2008 предприятия), я не мог'т вижу никаких запущенных процессов или пользователей, подключенных к БД. Перезапуск сервера (Правой Кнопкой Мыши на SQL сервер менеджмент студию и выбрать перезагрузка) позволило мне восстановить БД.

Комментарии (0)

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

Комментарии (0)

Я использовать 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;
Комментарии (0)

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

Комментарии (0)