SQL Server 2005 데이터베이스에 대한 현재 연결을 모두 어떻게 종료합니까?

StackOverflow https://stackoverflow.com/questions/11620

  •  08-06-2019
  •  | 
  •  

문제

데이터베이스 이름을 바꾸고 싶지만 데이터베이스에서 '배타적 잠금을 얻을 수 없습니다'라는 오류가 계속 발생합니다. 이는 일부 연결이 아직 활성 상태임을 의미합니다.

이름을 바꿀 수 있도록 데이터베이스에 대한 모든 연결을 어떻게 끊을 수 있습니까?

도움이 되었습니까?

해결책

보다 데이터베이스에 대한 모든 활성 연결 종료.

그 접근 방식이 아담이 제안한 작동하지 않는 이유는 활성 연결을 반복하는 동안 새로운 연결이 설정될 수 있고 이를 놓칠 수 있다는 것입니다.내가 링크한 기사에서는 이러한 단점이 없는 다음 접근 방식을 사용합니다.

-- 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 Management Studio Express 사용:

개체 탐색기 트리의 관리에서 "활동 모니터"로 드릴다운합니다. 찾을 수 없는 경우 데이터베이스 서버를 마우스 오른쪽 버튼으로 클릭하고 "활동 모니터"를 선택합니다.활동 모니터를 열면 모든 프로세스 정보를 볼 수 있습니다.관심 있는 데이터베이스에 대한 잠금을 찾아 해당 잠금을 해제할 수 있어야 하며, 이로 인해 연결도 해제됩니다.

그 후에는 이름을 바꿀 수 있어야 합니다.

나는 항상 다음을 사용했습니다.


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"를 확인하십시오

다시 부착데이터베이스 -> 연결을 마우스 오른쪽 버튼으로 클릭합니다.추가하다...-> 데이터베이스를 선택하고 다른 이름으로 연결 열을 원하는 데이터베이스 이름으로 변경합니다.좋아요

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

'마스터' 데이터베이스를 사용하고 이 쿼리를 실행하면 데이터베이스의 모든 활성 연결이 종료됩니다.

저는 일반적으로 데이터베이스를 복원하려고 할 때 해당 오류가 발생합니다. 저는 대개 Management Studio의 트리 상단으로 이동하여 마우스 오른쪽 버튼을 클릭하고 데이터베이스 서버를 다시 시작합니다. (개발 컴퓨터에 있기 때문에 프로덕션 환경에서는 이상적이지 않을 수 있습니다.) ).이는 모든 데이터베이스 연결을 닫는 것입니다.

MS SQL Server Management Studio의 개체 탐색기에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭합니다.다음 컨텍스트 메뉴에서 '작업 -> 오프라인으로 전환'을 선택합니다.

또 다른 "불로 죽이는" 접근 방식은 MSSQLSERVER 서비스를 다시 시작하는 것입니다.저는 명령줄에서 작업하는 것을 좋아합니다.이것을 정확히 CMD에 붙여 넣으면 다음과 같이 됩니다.NET STOP MSSQLSERVER 및 NET START MSSQLSERVER

또는 "services.msc"를 열고 "SQL Server(MSSQLSERVER)"를 찾아 마우스 오른쪽 버튼을 클릭하고 "다시 시작"을 선택합니다.

이렇게 하면 해당 인스턴스에서 실행 중인 모든 데이터베이스에 대한 모든 연결이 "확실히" 끊어집니다.

(저는 서버/데이터베이스의 구성을 변경하고 다시 변경하는 많은 접근 방식보다 이것이 더 좋습니다)

MS SQL Server Management Studio 2008에서 이러한 종류의 작업을 안정적으로 수행하는 방법은 다음과 같습니다(다른 버전에서도 작동할 수 있음).

  1. 개체 탐색기 트리에서 루트 데이터베이스 서버(녹색 화살표 포함)를 마우스 오른쪽 버튼으로 클릭한 다음 활동 모니터를 클릭합니다.
  2. 활동 모니터에서 프로세스 탭을 열고 '데이터베이스' 드롭다운 메뉴를 선택한 다음 원하는 데이터베이스별로 필터링하세요.
  3. 개체 탐색기에서 DB를 마우스 오른쪽 버튼으로 클릭하고 '작업 -> 오프라인으로 전환' 작업을 시작합니다.이 작업을 백그라운드에서 계속 실행하는 동안...
  4. 가능한 모든 것을 안전하게 종료하십시오.
  5. 프로세스 탭에서 나머지 프로세스를 모두 종료합니다.
  6. DB를 다시 온라인으로 전환하십시오.
  7. DB의 이름을 바꿉니다.
  8. 서비스를 다시 온라인으로 전환하고 새 DB를 가리키도록 하세요.

이 시나리오에서 나에게 적합한 옵션은 다음과 같습니다.

  1. 해당 데이터베이스에서 "분리" 작업을 시작합니다.그러면 DB에 대한 작업을 방지하는 활성 연결을 표시하는 창이(SQL 2005에서) 열립니다.
  2. 활성 연결을 종료하고 분리 작업을 취소합니다.
  3. 이제 데이터베이스를 복원할 수 있습니다.

이 시도:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

데이터베이스 이름을 마우스 오른쪽 버튼으로 클릭하고 속성을 클릭하여 속성 창을 가져온 다음 옵션 탭을 열고 "액세스 제한" 속성을 다중 사용자에서 단일 사용자로 변경합니다.확인 버튼을 누르면 열려 있는 모든 연결을 닫으라는 메시지가 표시됩니다. "예"를 선택하면 데이터베이스 이름을 바꾸도록 설정됩니다....

이것은 나에게 작동하지 않았고(SQL2008 Enterprise), 실행 중인 프로세스나 DB에 연결된 사용자도 볼 수 없었습니다.서버를 다시 시작하면(Management Studio에서 SQL Server를 마우스 오른쪽 버튼으로 클릭하고 다시 시작 선택) DB를 복원할 수 있었습니다.

저는 SQL Server 2008 R2를 사용하고 있습니다. 제 DB는 이미 단일 사용자용으로 설정되어 있고 데이터베이스에 대한 모든 작업을 제한하는 연결이 있었습니다.따라서 권장되는 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

결과
KillCommand 열의 명령을 사용하여 원하는 프로세스를 종료할 수 있습니다.

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

SP_Who 명령을 사용하여 데이터베이스를 사용하는 모든 프로세스를 종료한 다음 데이터베이스 이름을 바꿀 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top