전체 글

모니터링을 보다 보면 세션 하나가 status = suspended 상태로 몇 시간째 멈춰 있는 경우가 있다. suspended를 CPU 부족으로 오해하기 쉽지만, 실제로는 대부분 락을 기다리는 블로킹(blocking) 상황이다.이 글은 suspended 세션에서 시작해 blocking_session_id를 따라 head blocker까지 거슬러 올라가고, KILL 여부를 판단하는 순서를 정리한다.실제 증상status = suspended · wait_type = LCK_M_IXwait_time ≈ 15,369,167 ms (약 4.27시간) · percent_complete = 0→ INSERT가 시작 시점부터 지금까지 락만 기다리는 중1. suspended는 무슨 상태인가SQL Server 스..
출력물 생성 프로시저 안에서 키만 바꿔가며 같은 조회를 수백 번 반복하는 패턴(N+1)이 있다. 게다가 그 조회 하나가 전체 테이블에 ROW_NUMBER()를 매긴 뒤 바깥에서 거르는 구조라면 "반복 × 전체스캔"이 겹쳐 느려진다. predicate pushdown으로 고칠 수 있지만, 그 전에 "결과가 같은지"부터 확인해야 한다. 이 검증을 건너뛰면 튜닝이 곧 버그가 된다. 안티패턴 전체 테이블에 ROW_NUMBER() → 정렬 → 윈도우를 돌린 뒤 바깥 WHERE로 걸러냄. 필터 키가 PARTITION BY에 없어 pushdown이 안 되고, 여기에 N+1 반복 호출까지 곱해짐. 1. AS-IS 구조와 왜 느린가 원쿼리는 테이블 전체에 순번..
실행계획을 열었더니 정작 테이블 읽기는 멀쩡한데 Worktable 논리읽기만 6,400만이 찍히는 경우가 있다. 대개 "이 조건에 맞는 행이 존재하는가"를 확인하려고 걸어둔 INNER JOIN이 다대다(many-to-many)로 풀리면서 생기는 증상이다. 이 글은 실제 검증배치 쿼리에서 겪은 사례로, 원인 진단과 EXISTS 세미조인 재작성까지 정리한다. 증상 (STATISTICS IO / TIME) Worktable — 검색 수 19,207, 논리적 읽기 64,006,432 CPU 약 2,503,000ms(≈41.7분) ≈ 경과시간 → I/O 대기가 아니라 순수 CPU 소모형 1. 어디서 터지는가 — 테이블이 아니라 Worktable 먼저 실제..
인증서를 갱신하거나 재발급한 뒤, SQL Server 인스턴스가 엔진은 정상 기동했는데 연결을 받지 못하는 상태가 되는 경우가 있다. ERRORLOG를 열면 에러가 줄줄이 찍혀 있어 당황스럽지만, 근본 원인은 하나다 — 서비스 계정이 인증서 개인 키(private key)의 읽기 권한을 잃은 것. 나머지 에러는 전부 여기서 파생된 연쇄다. Error 33565 — 인증서는 저장소에 있으나 서비스 계정이 개인 키에 접근할 수 없음 0x8009030d (SEC_E_UNKNOWN_CREDENTIALS) → 26014 → 17182 (SSL 초기화 실패) → 17826 / 17120 (네트워크 라이브러리 기동 실패) 1. 증상: 엔진은 떴는데 연결을 못 받는다..
Always On 가용성 그룹에 새 복제본(노드)을 추가하려고 ALTER AVAILABILITY GROUP … ADD REPLICA 를 실행하면 Msg 35221로 막히는 경우가 있다. 메시지는 "복제본 관리자가 해제되었다"고 안내하지만, 실제 원인은 그 문을 실행한 인스턴스에 있다. 이 글에서는 원인을 두 갈래로 진단하고, AG에 복제본을 추가하는 올바른 순서까지 정리한다.Msg 35221, Level 16, State 1작업을 처리할 수 없습니다. Always On 가용성 그룹 복제본 관리자가 이 SQL Server 인스턴스에서 해제되었습니다. SQL Server 구성 관리자를 사용하여 Always On 가용성 그룹을 설정하십시오. 그런 다음 SQL Server 서비스를 다시 시작하고 현재 작업을 다..
운영 중 가장 자주 마주치는 로그 관련 장애가 Error 9002 (트랜잭션 로그 가득 참)이다. 디스크가 부족해서 나는 경우도 있지만, 실제로는 로그가 잘리지(truncate) 못하고 계속 쌓이는 상황이 훨씬 많다. 원인을 정확히 가르는 열쇠는 log_reuse_wait_desc 한 컬럼이다. 이 값만 보면 백업을 해야 할지, 긴 트랜잭션을 잡아야 할지, AG 복제본을 봐야 할지가 바로 갈린다.Msg 9002, Level 17, State 2The transaction log for database 'DBName' is full due to ''.1. 에러의 의미부터Error 9002는 "로그 파일에 더 쓸 공간이 없다"는 뜻이다. 그런데 공간이 없는 이유는 두 가지로 나뉜다. 하나는 물리 파일이 더 ..
mewoni
Mewoni's DB World