Post

[Snowflake 101] Day 3: 실수를 되돌리는 힘, Time Travel & Fail-safe

[Snowflake 101] Day 3: 실수를 되돌리는 힘, Time Travel & Fail-safe

UPDATE 문에 WHERE 절을 빠뜨렸다. 혹은 프로덕션 테이블을 실수로 DROP 했다. 데이터 엔지니어라면 식은땀이 흐르는 순간이다.

전통적인 RDBMS나 온프레미스 DW 환경에서는 백업(Backup)본을 찾아 복원(Restore)하는 긴급 작업을 수행해야 한다. 복원하는 데 수 시간이 걸리고, 백업 시점 이후의 데이터는 잃게 된다.

Snowflake에서는 이 과정이 쿼리 한 줄로 해결된다. 데이터를 별도로 백업하지 않아도 과거 시점의 데이터를 조회하거나 되돌릴 수 있는 기능, Time Travel(시간 여행) 덕분이다.

오늘은 Snowflake의 강력한 데이터 보호 메커니즘인 Time Travel과 Fail-safe에 대해 알아본다.

1. Time Travel: 쿼리로 과거 조회하기

Time Travel은 특정 시점(Point-in-Time)의 데이터를 SQL로 즉시 조회하는 기능이다. 별도의 스냅샷을 찍을 필요가 없다. Snowflake의 아키텍처인 불변(Immutable) 마이크로 파티션 덕분에, 데이터가 수정되어도 기존 데이터 블록은 지워지지 않고 유지되기 때문이다.

1.1. AT / BEFORE 구문

테이블 뒤에 ATBEFORE 키워드를 붙이면 된다.

1
2
3
4
5
6
7
8
9
10
-- 1. 특정 시간(Timestamp) 기준 조회
SELECT * FROM orders AT(TIMESTAMP => '2026-01-21 14:00:00'::timestamp);

-- 2. 특정 시간 간격(Offset) 기준 조회 (10분 전 데이터)
SELECT * FROM orders AT(OFFSET => -60 * 10);

-- 3. 특정 쿼리 ID(Statement) 기준 조회
-- (실수로 쿼리를 잘못 날리기 직전 상태를 조회할 때 유용하다)
SELECT * FROM orders BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');

1.2. 데이터 복구 패턴

잘못 변경된 테이블을 복구할 때는 CREATE OR REPLACE TABLE ... AS SELECT (CTAS) 구문을 조합하여 사용한다.

1
2
3
4
-- 5분 전 상태로 테이블 원상 복구
CREATE OR REPLACE TABLE orders AS
SELECT * FROM orders AT(OFFSET => -60 * 5);

2. UNDROP: 삭제된 테이블 살리기

테이블을 아예 삭제(DROP)해버린 경우에도 당황할 필요 없다. 휴지통에서 파일을 꺼내듯 UNDROP 명령어로 즉시 복구 가능하다.

1
2
3
4
5
6
DROP TABLE important_users;
-- (아차!)

UNDROP TABLE important_users;
-- (테이블 구조와 데이터, 권한까지 즉시 복구됨)

이 기능은 Database나 Schema 단위에도 적용된다. 실수로 스키마 전체를 날려도 UNDROP SCHEMA로 살릴 수 있다.

3. 보존 기간 (Retention Period)과 비용

Time Travel은 공짜가 아니다. 과거 데이터를 유지하는 만큼 스토리지 비용(Storage Cost)이 발생한다.

  • Standard Edition: 기본 1일(24시간)만 보존된다.
  • Enterprise Edition: 최대 90일까지 설정 가능하다.
1
2
3
4
-- 테이블 생성 시 보존 기간 설정 (최대 90일)
CREATE TABLE logs (id int, msg string)
DATA_RETENTION_TIME_IN_DAYS = 90;

변경이 잦은(High Churn) 테이블을 90일 동안 보존하면 스토리지 비용이 급증할 수 있다. 따라서 중요하지 않은 임시 데이터나 ETL 중간 단계 테이블은 TRANSIENT 테이블로 생성하여 보존 기간을 제한하는 것이 경제적이다.

4. 최후의 보루, Fail-safe

Time Travel 기간이 지나면 데이터는 삭제될까? 즉시 삭제되지 않고 Fail-safe 영역으로 이동한다.

  • 기간: Time Travel 종료 후 7일간 보관.
  • 특징: 사용자가 SQL로 조회하거나 복구할 수 없다. 오직 Snowflake 고객 지원팀(Support)에 요청해야만 복구가 가능하다.
  • 목적: 시스템 장애나 극단적인 데이터 손실 상황을 대비한 재해 복구(DR)용이다.

데이터의 수명 주기는 다음과 같다. Active Data -> Time Travel (1~90일) -> Fail-safe (7일) -> 영구 삭제

Summary

Snowflake의 Time Travel은 데이터 운영의 안정성을 획기적으로 높여준다. 개발자는 더 이상 백업 테이프를 찾을 필요 없이 AT 구문 하나로 실수를 만회할 수 있다.

하지만 Time Travel 데이터도 스토리지 용량을 차지한다는 점을 명심해야 한다. 모든 테이블을 90일 보존하는 것은 낭비다. 데이터의 중요도에 따라 보존 정책을 다르게 가져가야 한다.

This post is licensed under CC BY 4.0 by the author.