반응형
DB의 특정 테이블에 블로킹이 발생할 때가 있다.
그냥 그러고서 끝나버리면 괜찮은데... 해당 TABLE이 LOCK이 걸려서 안풀리고 멍~ 되어있으면... 문제다.
마치 DB에 행이 걸린 것 처럼 꼼짝도 안하고 있기도 한다.
이것땜에 운영중인 실DB를 Restart하기도 모하고.. 장애상황이니 조치는 해야겠고...
원인도 확인을 해야겠고...
이럴 때는 일단 다음과 같이 조치한다.
Step 1. 블로킹을 발생시킨 세션의 SPID를 확인한다.
방법 : 엔터프라이즈매니저 -> 관리 -> 현재동작 -> 잠금/프로세스ID
잘 살펴보면 블로킹을 발생시켰거나, 걸려있는 프로세스가 빨간색으로 표시되어 있다.
블로킹을 유발시킨 세션은 "차단하는 중"이라고 표시되고,
블로킹을 당한 세션은 "차단주체 : (차단세션의 SPID)"와 같이 표시된다.
위의 그림에서는 SPID 54가 SPID 55를 차단하고 있고, SPID55가 다른 세션들을 차단하는 상황임을
알 수 있따. 따라서 차단주체는 "SPID 54"이다.
Step 2. "차단주체" 세션의 SPID에 우측클릭하여 "속성"을 클릭한다.
다음과 같이 블로킹을 유발시킨 SQL문을 확인할 수 있다.
이것은 쿼리분석기에서 다음의 SQL로도 가능하다.
DBCC INPUTBUFFER (122) -- SPID가 122인 경우
Step 3. "차단주체" 세션의 속성창에서 "프로세스 중지"를 클릭하여 해당 프로세스를 강제로 KILL한다.
이것은 쿼리분석기에서 다음의 SQL로도 가능하다.
KILL 122
Step 4. 엔터프라이즈 매니저 좌측 탭의 "현재동작" 을 우측클릭 후 새로고침해서 블로킹이 해소되었는지 확인한다. (자동으로 새로고침되지 않는다.)
대부분 한번에 해소되지 않는다. 새로운 "차단 주체" 세션의 SPID를 확인하여 다시 KILL해주고,
블로킹이 풀릴때까지 Step 1 ~ Step 3 을 반복해준다.
반응형
'연구개발 > SQL2005' 카테고리의 다른 글
"NOT IN" SUBQUERY 대체하기 (0) | 2009.06.27 |
---|---|
배치작업으로 TABLE을 동기화 할 때 주의사항 (0) | 2009.06.27 |
INSTEAD OF 트리거 (0) | 2009.06.27 |
SELECT에 LOCK을 거는 방법 (0) | 2009.06.27 |
MSSQL에서 Oracle에 직접 SQL 날려 Data 가져오기 (openrowset함수) (0) | 2009.06.27 |