백업을 복원 할 때 모든 활성 연결을 해제하려면 어떻게합니까?


166

활성 연결로 인해 SQL Server 2005가 백업을 복원하지 않습니다. 어떻게 강제 할 수 있습니까?


당신이 할 항상 당신이 "이상 복원"을 원하는 데이터베이스에 대한 모든 연결을 죽이고 싶어? 아니면 기존 연결을 끊고 싶지 않을 때가 있습니까? 또한 연결 풀링에 대해 걱정해야합니까?
Philip Kelley

답변:


177

SQL Server Management Studio 2005

당신이 바로 데이터베이스를 클릭 클릭하면 Tasks다음을 클릭 Detach Database, 그것은 활성 연결이있는 대화 상자가 나타납니다.

분리 화면

"메시지"아래의 하이퍼 링크를 클릭하면 활성 연결을 종료 할 수 있습니다.

그런 다음 데이터베이스를 분리하지 않고 해당 연결을 종료 할 수 있습니다.

자세한 내용은 여기를 참조 하십시오 .

SQL Server Management Studio 2008

SQL Server Management Studio 2008의 인터페이스가 변경되었습니다. 단계는 다음과 같습니다 ( Tim Leung 사용 ).

  1. 개체 탐색기에서 서버를 마우스 오른쪽 단추로 클릭하고 '활동 모니터'를 선택하십시오.
  2. 이것이 열리면 프로세스 그룹을 펼치십시오.
  3. 이제 드롭 다운을 사용하여 데이터베이스 이름별로 결과를 필터링하십시오.
  4. 마우스 오른쪽 단추로 'Kill Process'옵션을 선택하여 서버 연결을 종료하십시오.

21
@Ryan과 동일한 문제가있는 경우 Management Studio 2005가 아닌 Management Studio 2008 이상을 사용하고 있기 때문일 수 있습니다. Management Studio 2008에서 동일한 작업을 수행하려면 개체에서 서버를 마우스 오른쪽 단추로 클릭하십시오. 탐색기에서 '활동 모니터'를 선택하십시오. 이것이 열리면 프로세스 그룹을 펼치십시오. 이제 드롭 다운을 사용하여 데이터베이스 이름별로 결과를 필터링하십시오. 마우스 오른쪽 단추로 'Kill Process'옵션을 선택하여 연결을 끊을 수 있습니다.
Tim Leung

195

db를 단일 사용자 모드로 설정하고 복원 한 다음 다시 다중 사용자로 설정하려고합니다.

ALTER DATABASE YourDB
SET SINGLE_USER WITH
ROLLBACK AFTER 60 --this will give your current connections 60 seconds to complete

--Do Actual Restore
RESTORE DATABASE YourDB
FROM DISK = 'D:\BackUp\YourBaackUpFile.bak'
WITH MOVE 'YourMDFLogicalName' TO 'D:\Data\YourMDFFile.mdf',
MOVE 'YourLDFLogicalName' TO 'D:\Data\YourLDFFile.ldf'

/*If there is no error in statement before database will be in multiuser
mode.  If error occurs please execute following command it will convert
database in multi user.*/
ALTER DATABASE YourDB SET MULTI_USER
GO

참조 : Pinal Dave ( http://blog.SQLAuthority.com )

공식 참조 : https://msdn.microsoft.com/en-us/library/ms345598.aspx


11
IMMEDIATE ROLLBACK을 발행하는 대신, 특정 DELAY 후에 만 ​​ROLLBACK에만 관련 될 수 있으므로 사용자에게 자연스럽게 완료 할 수있는 기회를 제공합니다.
John Sansom

2
좋은 점, 현재 쿼리를 완료 할 수 있도록 AFTER 60 명령을 포함하도록 롤백하도록 업데이트
brendan

안녕하세요 @ brendan, 롤백이 60 초 이상 걸리면 어떻게해야합니까? 감사합니다
user3583912

11
데이터베이스를 복원하는 경우 귀하 ROLLBACK IMMEDIATE또는에 관계없이 미결 거래가 유실됩니다 ROLLBACK AFTER 60. 해당 데이터를 저장하는 유일한 방법은 롤백 후 다른 백업을 수행하는 것입니다. 그러나 다른 백업에서 복원하고 있습니다. 그래서 대기의 요점은 무엇입니까? 뭔가 빠졌습니까?
Dave Mason

@DMason, 나는이 질문에 대해서도 궁금합니다. 롤백 모드에서 single_user를 사용하면 대기 시간 동안 새 연결이 방지됩니까? 그렇다면 적어도 읽기 전용 작업을 완료 한 다음 갑자기 끝내는 것이 더 깨끗하고 깔끔한 방법인지 궁금합니다.
Jason

43

이 코드는 저에게 효과적이며 데이터베이스의 기존 연결을 모두 종료합니다. 데이터베이스 이름을 갖도록 Set @dbname = 'databaseName'줄을 변경하기 만하면됩니다.

Use Master
Go

Declare @dbname sysname

Set @dbname = 'databaseName'

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
이것이 가장 빠른 방법이었습니다 (SingleUserMode * 20 = 60 초, Kill * 20 = 5 초).
Karson

그것은 나를 위해 작동하지 않았다. 데이터베이스가 여전히 사용 중입니다. SQL Server 2008을 사용합니다.
Marek Bar

나는 그 코드를 여러 번 실행하는 것을 발견했습니다. 매번 차례로 트릭을 수행합니다. 때로는 킬과 복원 사이에 무언가가 몰래 들어옵니다. 때로는 킬을 실행 한 다음 복원을 실행해야합니다.
John Waclawski

다시 연결하려는 응용 프로그램의 공격성에 전적으로 의존합니다. 게으른 사용자 몇? 잘 작동합니다. 1 초 안에 다시 연결되는 대용량 앱 서버? 별로.
BradC

5

이 시도:

DECLARE UserCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT
    spid
FROM
    master.dbo.sysprocesses
WHERE DB_NAME(dbid) = 'dbname'--replace the dbname with your database
DECLARE @spid SMALLINT
DECLARE @SQLCommand VARCHAR(300)
OPEN UserCursor
FETCH NEXT FROM UserCursor INTO
    @spid
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQLCommand = 'KILL ' + CAST(@spid AS VARCHAR)
    EXECUTE(@SQLCommand)
    FETCH NEXT FROM UserCursor INTO
        @spid
END
CLOSE UserCursor
DEALLOCATE UserCursor
GO

4

SQL Server를 다시 시작하면 사용자 연결이 끊어집니다. 내가 찾은 가장 쉬운 방법-서버를 오프라인으로 전환하려는 경우에도 좋습니다.

그러나 매우 까다로운 이유로 'Take Offline (오프라인으로 가져 오기)'옵션을 사용하면이 작업을 안정적으로 수행 할 수 없으며 관리 콘솔이 중단되거나 혼동 될 수 있습니다. 다시 시작한 후 오프라인 작업 수행

예를 들어 연결의 소스 인 웹 서버를 중지 한 경우 옵션입니다.


+1. SQL Express에는 활동 모니터가 없으므로 허용 된 답변은 SQL Express (예 : 개발 환경)에서 작동하지 않습니다
Matt Frear

1
@MattFrear : 이것은 사실이 아닙니다! 적어도 2008 R2 Express에서는 서버 노드에 도구 모음 버튼과 상황에 맞는 메뉴 항목이 표시됩니다.
Stephan

4
전체 SQL Server를 다시 시작하면 모든 데이터베이스에 대한 연결이 끊어집니다. 서버는 많은 데이터베이스를 지원할 수 있지만 지금 하나만 복원하면됩니다.
Ross Presser

3
이것은 1 개의 데이터베이스에 대한 연결을 끊는 최악의 방법입니다. 특히 다른 사용자가 여전히 사용중인 다른 데이터베이스가 많은 경우. 이 방법을 사용하여 AGAINST를 강력히 권장합니다. 총 오버 킬 100 %입니다 !!
John Waclawski

@JohnWaclawski 나는 최악의 상황에 대해 잘 모릅니다. 정말 어쨌든 다른 방법을 통해 모든 시간을 저장하지 않습니다
Simon_Weaver

3

SQL Server 2008에서 복원 프로세스를 자동화하는 동안이 문제를 겪었습니다. 내 (성공적인) 접근 방식은 두 가지 답변이 혼합되어있었습니다.

먼저, 나는 상기 데이터베이스의 모든 연결을 가로 질러서 죽인다.

DECLARE @SPID int = (SELECT TOP 1 SPID FROM sys.sysprocess WHERE dbid = db_id('dbName'))
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = top 1 spid from master.dbo.sysprocesses
        where dbid = db_id('dbName')
End

그런 다음 데이터베이스를 single_user 모드로 설정했습니다.

ALTER DATABASE dbName SET SINGLE_USER

그런 다음 복원을 실행합니다 ...

RESTORE DATABASE and whatnot

연결을 다시 종료하십시오

(same query as above)

그리고 데이터베이스를 다시 multi_user로 설정하십시오.

ALTER DATABASE dbName SET MULTI_USER

이렇게하면 단일 모드로 설정하기 전에 데이터베이스를 유지하는 연결이 없는지 확인합니다.


2

이 중 어느 것도 나를 위해 일하지 않았으며 현재 사용자를 삭제하거나 연결을 끊을 수 없습니다. 또한 DB에 대한 활성 연결을 볼 수 없습니다. SQL Server를 다시 시작하면 (마우스 오른쪽 버튼을 클릭하고 다시 시작을 선택하면) 가능합니다.


2

이미 제공된 조언에 추가하기 위해 DB를 사용하는 IIS를 통해 실행되는 웹 앱이있는 경우 복원하는 동안 앱의 앱 풀 을 중지 (재활용하지 않음) 한 다음 다시 시작 해야 할 수도 있습니다 . 앱 풀을 중지하면 활성 http 연결이 끊어지고 더 이상 허용되지 않습니다. 그렇지 않으면 연결되어 데이터베이스를 잠그는 프로세스가 트리거 될 수 있습니다. 데이터베이스를 복원 할 때 Umbraco Content Management System과 같은 알려진 문제입니다.


1

위의 어느 것도 나를 위해 일하지 않았습니다. 내 데이터베이스에 Activity Monitor 또는 sp_who를 사용한 활성 연결이 표시되지 않았습니다. 나는 궁극적으로 :

  • 데이터베이스 노드를 마우스 오른쪽 단추로 클릭하십시오
  • "분리 ..."를 선택하십시오.
  • "연결 끊기"상자를 확인하십시오.
  • 다시 부착

가장 우아한 솔루션은 아니지만 작동하며 SQL Server를 다시 시작할 필요가 없습니다 (DB 서버가 많은 다른 데이터베이스를 호스팅했기 때문에 옵션이 아닙니다)


이것은 과잉입니다. 위의 KILL 코드를 사용하십시오. 나를 위해 수백 개의 복원 작업을 수행합니다.
John Waclawski

내가 작업했던 데이터베이스는 모든 것을 다 죽일 수는 없지만 설정에 문제가 있었을 수 있습니다. 나는 그것이 훨씬 쉽다는 데 동의합니다.
Brent Wagoner

0

나는 이것을 좋아한다.

롤백 즉시 데이터베이스 세트를 오프라인으로 변경

데이터베이스를 복원하십시오. 그 후

롤백 즉시 데이터베이스 세트를 온라인으로 변경

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.