programing

SQL Server 2005 데이터베이스에 대한 현재 연결을 모두 끊으려면 어떻게 해야 합니까?

bestprogram 2023. 4. 7. 22:02

SQL Server 2005 데이터베이스에 대한 현재 연결을 모두 끊으려면 어떻게 해야 합니까?

데이터베이스 이름을 바꾸고 싶은데 데이터베이스에서 '배타적 잠금을 가져올 수 없습니다'라는 오류가 계속 표시되므로 일부 연결이 여전히 활성 상태입니다.

이름을 바꾸려면 데이터베이스에 대한 연결을 모두 끊으려면 어떻게 해야 합니까?

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

이를 실현하기 위한 스크립트는 '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 사용:

오브젝트 탐색기 트리의 [Management](관리)에서 [Activity Monitor](액티비티 모니터)로 드릴다운합니다(Activity Monitor를 찾을 수 없는 경우 데이터베이스 서버를 오른쪽 클릭하여 [Activity Monitor](액티비티 모니터)를 선택합니다).Activity Monitor를 열면 모든 프로세스 정보를 볼 수 있습니다.관심 있는 데이터베이스의 잠금을 찾아 잠금을 해제할 수 있습니다. 그러면 연결도 끊어집니다.

그 후에 이름을 변경할 수 있습니다.

항상 사용해 왔습니다.


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 우클릭 -> 태스크 -> 분리...[접속 드롭]체크박스를 켜겠습니다

[ Databases ](데이터베이스) -> [Attach](접속)을 오른쪽 클릭합니다.추가... -> 데이터베이스를 선택하고 [Attach As]컬럼을 원하는 데이터베이스명으로 변경합니다.네 알겠습니다

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)"를 찾은 후 마우스 오른쪽 버튼을 클릭하여 "restart"를 선택합니다.

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

(서버/데이터베이스의 설정을 변경 및 되돌리는 많은 접근법보다 이 방법이 더 마음에 듭니다.)

MS SQL Server Management Studio 2008에서 이러한 기능을 안정적으로 수행하는 방법은 다음과 같습니다(다른 버전에서도 사용할 수 있습니다).

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

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

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

이것을 시험해 보세요.

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

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

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

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

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

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

SP_Who 명령을 사용하여 데이터베이스를 사용하는 모든 프로세스를 중지한 다음 데이터베이스 이름을 변경할 수 있습니다.

언급URL : https://stackoverflow.com/questions/11620/how-do-you-kill-all-current-connections-to-a-sql-server-2005-database