안녕하세요
질문으로 올렸지만 답변을 기다리기 보단 기록 차원으로 남겨봅니다
검색을 해봤지만 오늘 겪었던 문제와 같은 경우를 찾을 수 없어서요
이틀 전 프로파일러에서 타임아웃이 잡혀서 확인해 봤더니
쿼리 작업이 아니라 AUTO SHRINK 작업이더군요
(SELECT * FROM SYS.sysprocesses WHERE blocked > 0)
타임아웃 문제가 발생한 테이블은 row가 2개 뿐인 테이블인데 SELECT 가 안되고 있었습니다
하지만 다른 테이블 및 기능들은 문제가 없어서 정기 점검 때 자동 축소 옵션을 끄기로 하고 넘겼습니다
그런데 정기 점검 때 DB백업 및 서버 리부팅 후 보니
그 테이블과 연관되어 있던 다른 테이블에 데이터가 남아 있지 않았습니다
분명 서비스 중 SELECT UPDATE INSERT가 잘 되는 걸 확인했는데요
단 다른 테이블도 SELECT 시에 문제가 있었는데 WITH(NO LOCK)옵션으로 많이 사용하고 있어서
그 옵션을 붙였을 때는 리턴 되더라구요
복구 작업은 DB가 아닌 프로그램단에서 남은 로그를 토대로 진행하고 있는데요
증상이 너무 특이해서 여기에 올려봅니다
혹시 비슷한 경험을 하신 분이 계신가요?
[자동 축소]는 지금 와서 찾아보니 끄고 쓰라는 경고(?)가 있네요
Comment 4
-
catchv
2014.07.23 15:37
-
헌이
2014.07.23 20:18
답변 정말 감사합니다 ~
테스트를 해보니 유일하게 트랜잭션이 있는 sp 에서 WAITFOR 를 걸어서 대기 상태를 만들어도
INSERT UPDATE는 모두 잘 되네요
말씀하신 부분이 의심스럽지만
프로그램에서는 트랜잭션이 있는 그 sp 에서 모두 리턴을 받았습니다
(COMMIT이든 ROLLBACK이든 완료가 된 상태겠죠)
만역 리턴이 없었다면 프로그램은 프리징 상태였어야 하는데 (싱글 쓰레드) 그렇지 않았습니다
그리고 프로그램 세션에서 그 테이블에 대한 INSERT UPDATE가 모두 정상적으로 완료되었습니다
문제가 생겼을 때 차라리 멈춰버렸다면 그때 문제를 수정하고 올렸을텐데 하는 아쉬움이 크네요
-
minsouk
2014.07.24 12:10
.
-
헌이
2014.07.24 22:59
고맙습니다~ 다음엔 꼭 사용해 봐야겠네요
WITH (NOLOCK)으로 조회를 하지 않으면 조회가 안된다는 것으로 봐서는
서비스하는 프로그램 세션에서 트랜잭션이 시작되고 Commit이나 Rollback이 안되고 있는 것으로 보입니다.
그래서 서버를 재부팅하니깐 트랜잭션이 모두 Rollback되어서 데이터가 아무것도 없는 것으로 보입니다.
Shrink를 한다고 해서 데이터가 날라가지는 않습니다.