Я хочу переименовать базу данных, но продолжаю получать ошибку '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
Чтобы выполнить этот сценарий, замените '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 студии экспресс:
В дереве обозревателя объектов детализацию при управления, чтобы "Монитор активности и quot; (Если вы не можете найти его там, затем правый клик на сервере базы данных и выберите "и монитор активности с"). Открыть Монитор активности, вы можете посмотреть весь процесс информация. Вы должны быть в состоянии найти замки для базы данных, которую вы'повторно заинтересованы в и убивать тех замков, которые тоже убивают соединения.
Вы должны быть в состоянии переименовать после этого.
Я'ве всегда используется:
в <предварительно&ГТ;&ЛТ;код&ГТ; ИЗМЕНИТЬ ПАРАМЕТРЫ DB_NAME БАЗЫ ДАННЫХ SET SINGLE_USER УКАЗАН С ОТКАТА НЕПОСРЕДСТВЕННОЙ Перейти SP_RENAMEDB 'ИМЯ_БАЗЫ_ДАННЫХ','DB_NAME_NEW' Перейти Изменить DB_NAME_NEW базы данных set MULTI_USER-установить обратно в многопользовательский Перейти &ЛТ;/код&ГТ;&ЛТ;/пре&ГТ;
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE [Test]
SET ONLINE
Автономный режим занимает некоторое время, и иногда я испытываю некоторые проблемы с этим..
Самый надежный способ на мой взгляд:
Открепить Щелкните ДБ -&ГТ; задачи -&ГТ; отсоединить... проверьте и quot;удалить соединения и quot; ОК
Подсоедините Щелкните баз данных -и GT; прикрепить.. Добавить... - и GT; выберите вашу базу данных и изменить присоединить колонки на желаемое название базы данных. ОК
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
используйте 'мастер' базы данных и запустить этот запрос, он будет убивать все активные соединения с базой данных.
Обычно я бегу в эту ошибку, когда я пытаюсь восстановить базу данных я обычно просто пойти в верхней части дерева в Управления Studio и щелкните правой кнопкой мыши и перезапустите сервер баз данных (потому что это's на развитие машины, это не может быть идеальным в производстве). Это закрыть все подключения к базе данных.
В MS SQL Server Management Studio в проводнике объектов щелкните правой кнопкой мыши на базе данных. В следующем контекстном меню выберите 'Tasks -> Take Offline'
Здесь's, как надежную такого рода вещи в MS SQL сервер менеджмент Студио 2008 (может работать и для других версий):
Еще один "убить его с огня и quot; подход-просто перезапустите службу mssqlserver. Мне нравится делать вещи из командной строки. Наклеивать именно в ЦМД будет делать это: Чистая остановка &амп служба mssqlserver, чистая запустится mssqlserver
Или открыть "и услуг.МСЦ" и обнаружить "SQL-сервер&я (имя mssqlserver), и правой кнопкой, выберите и quot;перезагрузить" по.
Это и quot;Конечно, конечно, что" убить все подключения ко всем базам данных в экземпляре.
(Мне нравится этот лучше, чем многие подходы, изменить и изменить конфигурацию сервера/базы данных)
Вариант работы для меня в этом случае выглядит следующим образом:
Щелкните правой кнопкой мыши на имени базы данных, нажмите на собственность, чтобы получить окно свойств, перейдите на вкладку Параметры и измените на "ограничить доступ" в собственность от нескольких пользователей для одного пользователя. Когда вы нажмете на кнопку OK, вам будет предложено закрыть все открытые подключения, выберите "Да" и вы намерены переименовать базу данных....
Попробуйте это:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
Это не't работа для меня (SQL2008 предприятия), я не мог'т вижу никаких запущенных процессов или пользователей, подключенных к БД. Перезапуск сервера (Правой Кнопкой Мыши на SQL сервер менеджмент студию и выбрать перезагрузка) позволило мне восстановить БД.
Я'м с помощью SQL сервер 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 и "убить" все процессы, которые используют базы данных, а затем переименовать свой базе.