유대선

공장을 멈춘 SELECT 한 줄

검증하지 않은 SELECT를 운영에 돌렸다. 라이브러리 캐시 락을 잡았고 해외 공장의 설비가 멈췄다. 그 락을 잡고 있는 게 내 세션이라는 걸 알아차리는 데 15~20분이 걸렸다.

·1 분 소요·English version →

검증하지 않은 SELECT 하나를 운영에 돌렸고, 해외 공장 현장의 설비가 멈췄다.

약 2만 행을 스캔하는 단일 쿼리였다. 실행 계획도 안 봤고, 읽는 행 수에 상한도 안 걸었고, 어디서 락을 잡는지도 생각하지 않았다. 그 쿼리가 라이브러리 캐시 락을 잡았다. 현장 뒤의 파이프라인은 엄격한 트랜잭션 일관성에 기대고 있어서, 락이 거기 걸린 순간 그 아래 설비가 멈췄다.

15분에서 20분 동안 나는 나 자신만 빼고 다 들여다봤다. 연동 서버를 봤고, 위쪽에서 들어오는 데이터를 봤고, 늘 의심하던 곳들을 봤다. 그러다 그 락을 잡고 있는 세션이 내 것이라는 걸 찾았고, 보고했다.

고칠 점은 단순하다.

큰 SELECT는 운영에 올리기 전에 확인한다 — 실행 계획, 건드리는 행 수의 상한, 어디서 락을 잡는지.

그땐 그 단계가 없었다.