...

주니어 개발자를 위한 DB운영

실무 환경에서 자주 만나는 장애와 대처법을 배웁니다. 실제 서비스 현장에서 가장 많이 맞닥뜨리는 문제들과 사건들을 상황별로 정리하고 “왜 이런 문제가 발생했는지” 그리고 “실제로 어떻게 대처해야 하는지”를 알려줍니다.

교육일정 확인하기

개발자가 DB운영을 하면서 겪게 되는 다양한 문제와 장애들...

쿼리가 갑자기 느려졌다

어제까지 1초도 안 걸리던 조회 쿼리가 오늘은 10초가 넘도록 돌아가고 있습니다. 코드는 아무것도 바뀐 게 없는데 왜 이런 일이 생기는 걸까요. 가장 먼저 의심해야 할 것은 데이터 양의 급격한 증가입니다. 쌓이는 데이터가 일정 임계점을 넘는 순간, 인덱스를 제대로 타지 못하거나 풀스캔이 발생하면서 응답 시간이 급격히 치솟습니다...

DELETE가 끝나지 않는다

수천 건의 데이터를 지우는 DELETE 쿼리를 실행했는데, 몇 분이 지나도 커서가 돌고만 있습니다. 이 상황의 핵심 원인은 대부분 락(Lock) 충돌입니다. 다른 트랜잭션이 해당 테이블이나 행을 점유하고 있으면 DELETE는 그 트랜잭션이 끝날 때까지 무한정 대기하게 됩니다. 또한 대량 DELETE는 트랜잭션 로그를...

쿼리는 도는 것 같은데 결과가 없다

분명히 데이터를 넣었는데 SELECT를 해도 아무것도 나오지 않습니다. 처음엔 쿼리 문법 문제를 의심하지만, 대부분은 트랜잭션 커밋 누락이 원인입니다. INSERT나 UPDATE 후 COMMIT을 하지 않으면 해당 세션 밖에서는 데이터가 보이지 않습니다. 또한 WHERE 조건에 들어간 값의...

트랜잭션을 오해하고 있다

"BEGIN만 쓰면 자동으로 안전하게 처리되겠지"라고 생각하는 경우가 많습니다. 하지만 트랜잭션은 시작했다고 끝나는 게 아니라, 반드시 COMMIT 또는 ROLLBACK으로 명시적으로 마무리해야 합니다. 오랫동안 열려 있는 트랜잭션은 다른 쿼리의 락을 막고 DB 전체 성능에 영향을 미칩니다. 특히 예외 처리 없이...

배포 전 데이터 상태 점검을 안 한다

새 기능을 배포하기 전, 코드만 확인하고 DB 상태는 확인하지 않는 경우가 생각보다 많습니다. 배포 시점에 이미 비정상적인 데이터가 존재하거나, 마이그레이션 스크립트가 예상과 다른 데이터를 만나면 배포 직후 바로 장애로 이어집니다. 특히 NOT NULL 컬럼 추가...

NULL을 무조건 허용한다

테이블을 설계할 때 "일단 NULL 허용하고 나중에 고치지 뭐"라는 판단은 나중에 큰 비용이 됩니다. NULL이 허용된 컬럼은 집계 함수, 조인, 비교 연산에서 예상치 못한 결과를 만들어냅니다. COUNT(*) 와 COUNT(컬럼)의 결과가 달라지거나, NULL과의 비교가...