오늘은 운영 DB에 ALTER 한 줄 날렸다가 CPU 100%를 구경하고, 식은땀 흘리며 수습한 이야기를 공유하려고 합니다.
컬럼 길이 하나 늘리는 아주 간단한 작업이었고, 테스트 서버에서는 1초도 안 걸려서 끝났습니다. 그래서 운영 서버에서도 당연히 1초면 끝날 줄 알았죠. 네, 그게 절망의 시작이었습니다.
결론만 궁금하신 분들은 제일 밑 "결론 & 다음부터는 이렇게"만 보셔도 무관합니다만, 제 뻘짓도 구경해 주시면 감사하겠습니다.

※ 회사 정보 보호를 위해 테이블·계정·서버 이름은 가상의 이름으로 바꿨고, 캡처도 실제 화면 대신 똑같이 재현한 화면입니다. 흐름과 명령어는 실제로 겪은 그대로예요.
사이즈 코드를 담는 컬럼이 5자리였는데, 신규 코드 체계가 들어오면서 10자리로 늘려야 했습니다. 데이터를 지우는 것도 아니고 길이만 늘리는 거라 부담 없는 작업이라고 생각했어요.
테스트 서버에서 실행했을 때는 엔터 치자마자 Table altered.가 떨어졌습니다. 자신감이 하늘을 찔렀죠.
운영 서버에서 같은 문장을 실행했는데, 1초, 5초, 30초... 커서만 깜빡거립니다. 그 사이 모니터링 화면에서는 세션 수가 쭉쭉 올라가기 시작했어요. 주문 화면을 쓰는 세션들이 하나둘 대기 상태로 쌓이는 게 보이는데, 등에서 식은땀이 났습니다.
"이러다 서비스 멈추겠다" 싶어서 급하게 실행을 중지했습니다. 그리고 서버에 접속해 top을 쳐 봤더니...

▲ CPU 99.7%, load average 48. 오라클 프로세스들이 줄줄이 CPU를 먹고 있었습니다 (재현 화면)
CPU가 꽉 차 있었습니다. 이미 실행은 멈췄는데 CPU는 내려올 생각을 안 하더군요. 여기서부터 걱정이 두 갈래로 갈라졌습니다.
제일 무서웠던 건 이거였습니다. 구글링을 하면 "DDL은 원자적이라 괜찮다"는 말이 많은데, 솔직히 남의 말만 믿고 넘어가기엔 운영 DB라 근거가 필요했어요. 그래서 오라클 공식 문서를 찾아봤습니다.
정리하면 ALTER는 끝까지 반영되거나, 아예 반영되지 않거나 둘 중 하나입니다. 다만 저처럼 "끝났는지 안 끝났는지" 모르는 상황에서는 직접 확인하는 게 제일 확실하죠. 아래 쿼리로 컬럼 길이를 봤더니 5 그대로였습니다. ALTER는 반영되지 않았고, 테이블도 멀쩡했습니다. 첫 번째 고비 통과.
테이블은 무사한데 CPU는 여전히 100%입니다. 누가 무엇을 기다리고 있는지부터 봐야 했어요. v$session에서 대기 이벤트와 누가 누구를 막고 있는지(blocking_session)를 같이 뽑아 봤습니다.

▲ 맨 위 빨간 줄 보이시나요? LAST_CALL_ET 6,048,211초 = 약 70일 (재현 화면)
결과를 보고 눈을 의심했습니다. 맨 위에 약 70일째 돌고 있는 SELECT가 하나 있었어요. 그 밑으로 제 ALTER가 그 SELECT를 기다리고 있었고, 다시 그 ALTER 뒤에 일반 조회·수정 세션들이 library cache lock을 기다리며 줄줄이 서 있었습니다.
오래 도는 세션은 이 쿼리로도 바로 찾을 수 있습니다. 운영 DB 작업 전에 미리 한 번 돌려 보는 걸 추천드려요.

나중에 찾아보니 이건 꽤 유명한 패턴이었습니다. 제가 이해한 대로 쉽게 풀어 보면 이렇습니다.
테스트 서버에서 1초 만에 끝난 이유도 이제 이해가 됐습니다. 테스트 서버에는 그 테이블을 쓰는 세션이 아무도 없었으니까요. 같은 SQL이라도 운영 서버는 전혀 다른 세상이었습니다.
70일째 도는 SELECT는 누군가 예전에 돌려 놓고 잊어버린 통계성 조회로 보였습니다. 관련 담당자에게 확인한 뒤 정리하기로 했어요.
먼저 top에서 CPU를 많이 먹는 프로세스 번호(PID)가 어느 세션인지 확인했습니다.
그리고 문제의 세션을 정리했습니다. IMMEDIATE를 붙이면 진행 중인 트랜잭션을 롤백하고 잠금을 풀면서 바로 제어권을 돌려줍니다.
⚠️ 세션을 죽이기 전에 그게 무슨 작업인지 꼭 확인하세요. 큰 데이터를 수정하던 세션이면 롤백에 오래 걸리고, 배치 작업이면 처음부터 다시 돌려야 할 수도 있습니다. 저도 담당자에게 확인받고 나서 정리했습니다.
세션을 정리하고 나니 줄 서 있던 세션들이 순식간에 풀렸고, CPU도 서서히 내려왔습니다.

▲ 정리 후. CPU 4%, load average도 내려가는 중 (재현 화면)
이후 사용자가 거의 없는 시간에 같은 ALTER를 다시 실행했고, 이번에는 정말로 1초 만에 Table altered.가 떨어졌습니다. 허무할 정도로요.
ALTER를 중간에 끊어도 테이블이 반쯤 바뀌는 일은 없습니다. DDL은 끝까지 반영되거나 아예 반영되지 않아요. 진짜 문제는 그 테이블을 오래 붙잡고 있던 세션이었습니다. 다음부터는 이 순서를 꼭 지키려고 합니다.
ORA-00054 오류를 내고 깔끔하게 포기합니다.별것 아닌 ALTER 한 줄로 길게도 써 놨는데, 운영 DB 앞에서 엔터 누르기 직전인 누군가에게 도움이 되었으면 좋겠습니다. 읽어 주셔서 감사합니다.
함께 보면 좋은 글: 윈도우 11에서 oracle vbox 설치하기 절망편
| 제미나이 유료 2년 쓰고 클로드 프로로 갈아탄 후기 | 클로드 제미나이 비교 (요금제·사용량·클로드 코드) (0) | 2026.10.13 |
|---|---|
| 티스토리 네이버 서치어드바이저 등록 방법 | 소유확인 안 될 때 해결 (메타태그·호스트 단위 오류) (0) | 2026.10.13 |
| Cloudflare, Deno 팀 인수 합류 총정리 | Deno Deploy 종료 일정과 개발자 대응법 (0) | 2026.10.12 |
| 클로드 코드(Claude Code) 플러그인 추천 10가지 | 설치 명령어 복사해서 바로 따라 하기 (0) | 2026.10.12 |
| 클로드 코드(Claude Code) 스킬과 플러그인 차이 총정리 | 개념부터 설치·사용법까지 (0) | 2026.10.12 |