본문 바로가기
공부/Ms-sql

MSSQL DB 오프라인 계속 안될 때

by 리빈아빠 2018. 12. 11.
반응형

서론

sql management studio 로 UI상에서 오프라인을 하게 되면 이상하게 잘 안될 때가 많다. 왜냐하면 트랙잭션을 안 죽이고 명령어를 때렸기 때문에 완료 될 때까지 진행이 되질 않는다. 데이터베이스 '***'이(가) 전환중입니다. 나중에 문을 실행하십시오 (오류: 952) 라는 식으로 오류도 발생하여 DB이용 자체가 불가능하다. 락이 걸려있기 때문에 온라인도 안될 것이다. 4일이 지나도 오프라인이 안 되길래 구글링을 해도 DB에 락이 걸려서 대부분의 명령어가 먹히질 않았다. 어쩌다 수상한게 보여서 그걸 찾아보니 문제가 보였는데 다른 분들도 도움 되시길

본론

sp_help

sp helpdb

데이터베이스 '***'이(가) 전환중입니다. 나중에 문을 실행하십시오 (오류: 952)


DB ID를 알고 있다면 좀 더 쉽게 찾을 수가 있는데 온라인도 오프라인도 아닌 맛탱이가 간 DBID는 어떻게 찾는지를 모르겠다. 댓글로 알려주시면 감사하겠다. 일단 sp helpdb 명령어를 치니 정상적인 DB리스트들이 보였었다. 해당 문제되는 DB가 언제쯤 만들어진지 감이 와서 대략 40번대 DB라고 감이 왔었다.

sp_lock

DBID만 알면 구글링해서 나온 쿼리들로 찾아보면 되는데 이상하게 그 쿼리들도 저 망할 DB 때문에 조회가 안된다. 그래서 sp_lock으로 모든 데이터에서 찾아야 되겠다 라고 생각을 했었다. 메모장으로 옮기고 찾다보니 수상한 한 줄이보였었다.


뭐지? 상태가 CNVT이다. 처음보는 상태값이었다. 40번대 일 것 같고 이게 문제가 되어보이고 모드도 X라서 해당 쿼리를 조회해보기로 했다.

dbcc inputbuffer(해당spid)

딱 봐도 데이터베이스를 오프라인 처리하는 명령어이다. 범인을 찾았다. 해당 spid로 kill을 해주면 된다.


이렇게 하고 또 오프라인을 UI에서 실행하지 말고 그냥 명령어로 세션 다 끊고 오프라인 내려가게끔 해주자.

ALTER DATABASE DB이름 SET OFFLINE WITH ROLLBACK IMMEDIATE

깔끔하게 오프라인 상태가 되니 기분이 좋아졌다.

결론

사실 DB 잘 다룰줄 아는 분들이면 바보 같이 이렇게 오프라인을 할 일이 없겠지만 나 같은 사람이면 편한 UI 덕에 아무 생각없이 오프라인으로 하는 경우가 많다. 원래는 트랙잭션 확인하고 세션 확인 후에 오프라인을 해야 하는데 그냥 하다보니 무한 행 걸리듯이 돼 조회는 안되니 냅두는 사람들도 왠지 있을 것 같다. 꼭 찾아서 정상적으로 오프라인해주자. 나중에 온라인 하려고 하면 어차피 이 글 검색해서 볼 것이다.