← 학습 카테고리

Learn

ClickHouse

47개 모듈 · 현재 44번째

ClickHouse 모듈 44/47 clickhouse-learn-44

system.mutations — 백그라운드 mutation이 지금 어디까지 왔는지 본다

ClickHouse system.mutations 및 Dictionary Source 종류 공식 문서 종합 (웹 리서치, 2026) — ClickHouse 공식 문서(operations/system-tables/mutations, sql-reference/statements/create/dictionary/sources) ClickHouse 공식문서 system.mutations

이 모듈을 다 읽으면

  • is_done과 is_killed가 각각 무엇을 나타내는지, 그리고 이 둘이 동시에 '아직 안 끝남' 상태로 오래 남을 수 있는 이유를 설명할 수 있다
  • KILL MUTATION이 이미 적용된 변경사항을 되돌리지 않는다는 것을 설명할 수 있다

clickhouse-learn-32에서 다룬 Lightweight DELETE와 clickhouse-learn-07의 'Too Many Parts'가 전제하는 '비동기 mutation'이 실제로 지금 어디까지 진행됐는지를 조회하는 system.mutations 시스템 테이블을 정리한다.

is_done — 이 mutation이 끝났는가

system.mutations의 is_done 필드는 그 mutation이 완료됐는지를 나타낸다 — 1이면 완료, 0이면 아직 처리 중이다. 대기 중인 mutation 개수는 SELECT count() FROM system.mutations WHERE is_done = 0 같은 쿼리로 바로 확인할 수 있다. clickhouse-learn-32에서 다룬 Lightweight DELETE(내부적으로는 _row_exists 컬럼만 갱신하는 경량 mutation)도, 일반 mutation도 전부 이 테이블에서 진행 상황을 추적할 수 있다.

핵심 포인트

  • is_done=1(완료)/0(진행 중) — 대기 중인 mutation 개수는 WHERE is_done=0으로 바로 집계 가능
  • clickhouse-learn-32의 Lightweight DELETE(경량 mutation)와 일반 mutation 모두 이 테이블에서 진행 상황 추적 가능

KILL MUTATION의 함정 — 취소해도 이미 적용된 건 안 되돌아간다

멈춰있는 mutation을 강제로 취소하려면 KILL MUTATION WHERE database='...' AND table='...' AND mutation_id='...'을 쓴다. 다만 중요한 함정이 있다 — 이 취소는 그 mutation을 대기열에서 제거할 뿐, 이미 완료된 일부 Part들에 적용된 변경사항은 되돌리지 않는다. 그래서 큰 mutation을 취소하면 '어떤 Part는 이미 변경됐고, 어떤 Part는 안 됐다'는 어중간한 상태로 테이블이 남을 수 있다. 또한 is_killed 플래그가 1이라고 해서 그 mutation이 완전히 마무리됐다는 뜻은 아니다 — 다른 오래 걸리는 mutation이 그 앞을 막고 있으면, is_killed=1이면서 is_done=0인 상태가 오래 지속될 수 있다.

핵심 포인트

  • KILL MUTATION은 대기열에서만 제거 — 이미 완료된 Part들의 변경사항은 되돌리지 않음(일부만 변경된 어중간한 상태로 남을 수 있음)
  • is_killed=1이 곧 완전히 끝났다는 뜻은 아님 — 앞선 다른 mutation이 막고 있으면 is_killed=1+is_done=0이 오래 지속될 수 있음