2017/08/31

MSSQL DB 분리시 연결 해제/차단

여러곳에서 연결을 해서 사용중인 DB 의 분리는, 계속해서 외부나 기타 App 에서 연결을 시도하기 때문에 단일 사용자 모드로 변경해도 오류가 발생하면서 진행되지 않을수 있음.

ALTER DATABASE 대상DB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
=> 다중 접속 서비스의 DB의 경우, 단일로 변경되어도 이미 그 단일 1개 연결이 즉시 되어 있어서 DB 분리 에러가 발생함

메시지 3703, 수준 16, 상태 2, 줄 1
데이터베이스 '대상DB'은(는) 현재 사용 중이므로 분리할 수 없습니다.

 

1. 방화벽을 통해서  SQL Port 를 차단하여 서버 외부 연결 방지
2. MSSQL 서비스외, SQLAgent 등 SQL 관련 다른 서비스를 모두 중지
3. 작업모니터 또는 프로세스 Kill 쿼리를 사용하여 대상 DB 연결 프로세스 모두 종료
4. DB 분리  EXEC sp_detach_db '대상DB', 'true';

 

* 주의 : Management Studio 와 같은 도구 이용시, DB목록을 열거 후  대상 DB를 선택하면 1개 연결이 되버리므로, DB 분리 쿼리문 연결 외  다른 연결이 되지 않도록 주의 필요

 


- 멀티 접속으로 변경시 ALTER DATABASE 대상DB SET MULTI_USER WITH ROLLBACK IMMEDIATE

- 아래와 같은 프로세스 kill 쿼리문과 함께 DB 분리 프로시져 쿼리문을 바로 붙여서 같이 실행

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'

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

 


가장 많이 본 글