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 을 반복해준다.

사용자 삽입 이미지






Posted by kuaaan
,


사랑합니다. 편안히 잠드소서