Сведения о вопросе

LARVION

08:28, 11th August, 2020

Теги

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

Просмотров: 1859   Ответов: 19

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

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



  Сведения об ответе

qwerty101

22:52, 29th August, 2020

См. Раздел Уничтожение Всех Активных Подключений К Базе Данных .

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

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


  Сведения об ответе

darknet

06:24, 18th August, 2020

Скрипт для достижения этой цели заменит '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


  Сведения об ответе

padenie

11:59, 17th August, 2020

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

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


  Сведения об ответе

screen

20:43, 22nd August, 2020

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

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

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


  Сведения об ответе

Chhiki

09:12, 1st August, 2020

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


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 


  Сведения об ответе

LIZA

00:37, 4th August, 2020

ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE


  Сведения об ответе

ЯЯ__4

20:44, 27th August, 2020

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

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

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

Повторное подключение щелкните правой кнопкой мыши базы данных -> прикрепить.. Добавь... -> выберите свою базу данных и измените столбец "прикрепить как" на нужное имя базы данных. Хорошо


  Сведения об ответе

ASSembler

00:08, 13th August, 2020

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


  Сведения об ответе

PHPH

01:01, 12th August, 2020

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


  Сведения об ответе

VERSUION

23:09, 14th August, 2020

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

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


  Сведения об ответе

FAriza

14:25, 22nd August, 2020

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


  Сведения об ответе

ASER

19:00, 18th August, 2020

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

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

Это приведет к "for sure, for sure" уничтожению ALL подключений к ALL базам данных, запущенным на этом экземпляре.

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


  Сведения об ответе

qwerty101

22:26, 13th August, 2020

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

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


  Сведения об ответе

LIZA

06:34, 14th August, 2020

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


  Сведения об ответе

PHPH

05:28, 26th August, 2020

Попробовать это:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE


  Сведения об ответе

FAriza

05:38, 20th August, 2020

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


  Сведения об ответе

SSESION

21:06, 1st October, 2020

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


  Сведения об ответе

LAST

22:27, 7th August, 2020

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


  Сведения об ответе

ЯЯ__4

00:10, 3rd August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться