# ClickHouse의 물리화 뷰: 데이터 손실 시나리오
ClickHouse의 물리화 뷰(MV)는 추가 전용 환경에서 INSERT 작업에 대한 트리거처럼 작동합니다. UPDATE나 DELETE는 지원하지 않고 데이터 변경 사항만 포착합니다. 규칙을 따르면 MV는 신뢰할 수 있지만, 테이블 스키마 변경은 데이터 손실을 초래할 수 있습니다.
주요 위험: ClickHouse는 활성 MV와 독립적으로 소스 테이블과 타겟 테이블을 수정할 수 있게 합니다. 이는 전통적인 DBMS와 차별화되는 점입니다.
전형적인 워크플로우
테스트 테이블과 MV를 생성하여 시연합니다:
-- Source table
DROP TABLE IF EXISTS test_orders;
CREATE TABLE test_orders (
order_id String,
order_dt Datetime
)
ENGINE = MergeTree
ORDER BY order_id;
-- Target table
DROP TABLE IF EXISTS final_test_orders;
CREATE TABLE final_test_orders (
order_id String,
order_dt Datetime
)
ENGINE = MergeTree
ORDER BY order_id;
-- MV to redirect data
DROP VIEW IF EXISTS mv_final_test_orders;
CREATE MATERIALIZED VIEW mv_final_test_orders
TO default.final_test_orders (
order_id String,
order_dt Datetime
)
AS SELECT order_id, order_dt FROM test_orders;
데이터 삽입:
INSERT INTO test_orders VALUES
('QWE123', '2025-03-01 12:00:00'),
('RTY456', '2025-03-01 13:00:00'),
('XYZ789', '2025-03-01 14:00:00');
SELECT * FROM final_test_orders 쿼리는 모든 레코드를 올바르게 반환합니다.
타겟 테이블 스키마 변경으로 인한 문제
final_test_orders의 컬럼 타입을 변경합니다:
DROP TABLE IF EXISTS final_test_orders;
CREATE TABLE final_test_orders (
order_id UInt64,
order_dt Datetime
)
ENGINE = MergeTree
ORDER BY order_id;
test_orders에 다시 삽입을 반복합니다. MV는 String에서 UInt64로의 변환 오류를 발생시킵니다. 데이터는 소스 테이블에 기록되지만 타겟에는 기록되지 않습니다. 블록 원자성 때문에 INSERT가 실패합니다.
ClickHouse는 블록 단위로 데이터를 삽입합니다. MV의 오류는 전체 INSERT를 중단시키지만, 부분 블록은 지속될 수 있습니다.
MV 오류 무시
materialized_views_ignore_errors=true 설정은 MV 오류를 억제합니다:
INSERT INTO test_orders SETTINGS materialized_views_ignore_errors = true VALUES
('QWE123', '2025-03-01 12:00:00'),
('RTY456', '2025-03-01 13:00:00'),
('XYZ789', '2025-03-01 14:00:00');
데이터는 test_orders에 커밋되지만 final_test_orders에는 아무것도 나타나지 않습니다. 이는 타겟 테이블에서 제어된 손실입니다.
시스템 로그를 통한 오류 모니터링
system.query_views_log를 사용하여 MV 실패를 추적합니다:
SELECT event_time, view_name, exception
FROM system.query_views_log
WHERE event_date = today() AND exception_code != 0
ORDER BY event_time DESC
LIMIT 1000;
이 쿼리는 오류 발생 시간, MV 이름, 예외 텍스트를 반환합니다. 프로덕션 환경에서는 이러한 이벤트에 대한 알림을 설정하세요.
materialized_views_ignore_errors=true와 모니터링을 결합하면 위험을 최소화할 수 있습니다.
컬럼 불일치로 인한 비제어 손실
MV는 컬럼 위치가 아닌 컬럼 이름을 사용합니다. 누락된 컬럼은 오류 없이 기본값으로 채워집니다.
컬럼 이름을 변경합니다:
DROP TABLE IF EXISTS final_test_orders;
CREATE TABLE final_test_orders (
orders String,
order_dt Datetime
)
ENGINE = MergeTree
ORDER BY orders;
test_orders로의 삽입은 성공합니다. final_test_orders에서 orders 컬럼은 빈 문자열로 채워집니다 — 데이터가 조용히 손실됩니다.
MV 운영 권장 사항
- MV 생성 시 타겟 테이블의 컬럼을 확인하세요.
- 배포 후 MV를 테스트하세요.
- 활성 MV가 있는 테이블의 스키마 변경을 피하세요.
system.query_views_log에 대한 알림을 구현하세요.
핵심 사항:
- MV는 트랜잭션 보장이 없는 제어되지 않은 ETL입니다.
- 블록 삽입은 오류 시 부분 손실 위험을 만듭니다.
materialized_views_ignore_errors=true는 소스 데이터를 보존하지만 모니터링이 필요합니다.- 컬럼 이름 불일치는 조용한 실패를 초래합니다.
- ClickHouse 문서에서 MV 위험에 대해 경고합니다.
— Editorial Team
아직 댓글이 없습니다.