Snowflake

Snowflake Time Travel

2026-03-21
更新: 2026-03-27
NicheeLab編集部

Time Travelは、Snowflakeのデータ保護の中核機能で、テーブル・スキーマ・データベースの過去の状態にアクセスし、誤操作からの復旧や履歴データの参照を可能にします。AT/BEFORE句による過去時点クエリ、UNDROPによるオブジェクト復元、DATA_RETENTION_TIME_IN_DAYSによる保持期間制御が試験で頻出の3大ポイントです。

保持期間とエディション差分

Time Travelの保持期間はDATA_RETENTION_TIME_IN_DAYSパラメータで制御します。この値はアカウント・データベース・スキーマ・テーブルの各レベルで設定でき、下位レベルの設定が上位を上書きします。

エディションPermanent TableTransient TableTemporary Table
Standard0〜1日0〜1日0〜1日
Enterprise以上0〜90日0〜1日0〜1日
-- テーブルレベルで保持期間を90日に設定
ALTER TABLE analytics.orders
  SET DATA_RETENTION_TIME_IN_DAYS = 90;

-- スキーマレベルで保持期間を設定(配下テーブルのデフォルト値になる)
ALTER SCHEMA analytics
  SET DATA_RETENTION_TIME_IN_DAYS = 30;

-- 現在の設定を確認
SHOW PARAMETERS LIKE 'DATA_RETENTION_TIME_IN_DAYS'
  IN TABLE analytics.orders;

AT/BEFORE句による過去時点クエリ

AT句は指定した時点の状態を返し、BEFORE句は指定した時点の直前の状態を返します。タイムスタンプ指定・オフセット指定・Statement ID指定の3パターンがあります。

タイムスタンプ指定

-- AT: 指定時刻の状態を取得
SELECT *
FROM analytics.orders
  AT (TIMESTAMP => '2026-03-27 09:00:00'::TIMESTAMP_NTZ);

-- BEFORE: 指定時刻の直前の状態を取得
SELECT *
FROM analytics.orders
  BEFORE (TIMESTAMP => '2026-03-27 09:00:00'::TIMESTAMP_NTZ);

オフセット指定

-- 30分前の状態を取得
SELECT *
FROM analytics.orders
  AT (OFFSET => -60 * 30);

-- 2時間前の状態を取得
SELECT COUNT(*) AS row_count_2h_ago
FROM analytics.orders
  AT (OFFSET => -60 * 60 * 2);

Statement ID指定

-- 特定のDML実行直前の状態を取得(誤操作復旧に最適)
SELECT *
FROM analytics.orders
  BEFORE (STATEMENT => '01b12345-0600-1234-0000-abcdef012345');

Statement IDはQUERY_HISTORYビューから取得できます。誤ったUPDATE/DELETEを実行してしまった場合、そのStatement IDをBEFORE句に指定することで、まさにその操作の直前の状態に戻せます。

Time Travelを使ったデータ復旧パターン

-- パターン1: 誤UPDATEの復旧(CLONE + SWAP)
CREATE TABLE analytics.orders_restored
  CLONE analytics.orders
  BEFORE (STATEMENT => '01b12345-0600-1234-0000-abcdef012345');

-- 復元テーブルの内容を確認後、テーブルを入れ替え
ALTER TABLE analytics.orders RENAME TO analytics.orders_backup;
ALTER TABLE analytics.orders_restored RENAME TO analytics.orders;

-- パターン2: 特定行だけ復旧(部分復旧)
INSERT INTO analytics.orders
SELECT * FROM analytics.orders
  BEFORE (STATEMENT => '01b12345-0600-1234-0000-abcdef012345')
WHERE order_id IN (1001, 1002, 1003);

UNDROP TABLE / SCHEMA / DATABASE

DROPされたオブジェクトを保持期間内であればUNDROPで復元できます。テーブル・スキーマ・データベースの3レベルで利用可能です。

-- テーブルの復元
DROP TABLE analytics.orders;
UNDROP TABLE analytics.orders;

-- スキーマの復元(配下の全テーブルも復元)
DROP SCHEMA analytics;
UNDROP SCHEMA analytics;

-- データベースの復元(配下の全スキーマ・テーブルも復元)
DROP DATABASE sales_db;
UNDROP DATABASE sales_db;

同名のオブジェクトが既に再作成されている場合、UNDROPは失敗します。この場合は先に既存オブジェクトをリネームしてからUNDROPを実行します。

-- 同名テーブルが既に存在する場合の復元手順
ALTER TABLE analytics.orders RENAME TO analytics.orders_new;
UNDROP TABLE analytics.orders;

Fail-safeとの関係

Fail-safeはTime Travel期間終了後の追加7日間にわたるデータ保護レイヤーです。Time Travelとは根本的に異なり、ユーザーが直接操作することはできません。

比較項目Time TravelFail-safe
操作主体ユーザー(SQL操作)Snowflakeサポートのみ
期間0〜90日(設定可能)固定7日間(Time Travel後)
対象テーブルPermanent / Transient / TemporaryPermanentのみ
ストレージコスト変更履歴分変更履歴分(Permanentのみ)
復旧方法AT/BEFORE句、UNDROP、CLONESnowflakeサポートへの問い合わせ

データ保護タイムライン

|<── Time Travel (0〜90日) ──>|<── Fail-safe (7日) ──>|
|  ユーザーが自由に参照・復元  | Snowflakeサポートのみ |

例: Enterprise Edition / DATA_RETENTION = 90日 / Permanent Table
  → 最大97日間のデータ保護(90日 + 7日)

例: Standard Edition / DATA_RETENTION = 1日 / Permanent Table
  → 最大8日間のデータ保護(1日 + 7日)

例: Transient Table(全エディション共通)
  → 最大1日のTime Travel、Fail-safeなし

テーブル種類別のデータ保護まとめ

テーブル種類Time TravelFail-safe主な用途
Permanent(デフォルト)0〜90日7日本番データ・保護が必要なテーブル
Transient0〜1日なし中間テーブル・再生成可能なデータ
Temporary0〜1日なしセッション内限定の一時作業

ストレージコスト管理

  • TABLE_STORAGE_METRICS:ACCOUNT_USAGE.TABLE_STORAGE_METRICSビューでテーブルごとのACTIVE_BYTES / TIME_TRAVEL_BYTES / FAILSAFE_BYTESを確認
  • 保持期間の最適化:重要度の低いテーブルはDATA_RETENTION_TIME_IN_DAYSを短く設定し、ストレージコストを削減
  • Transient Tableの活用:ETLの中間テーブルなど再生成可能なデータにはTransient Tableを使い、Fail-safeコストを回避

問題で確認

Data Protection

問題 1

Enterprise Editionを使用中に、誤ったDELETE文でテーブルの一部のデータを削除してしまった。QUERY_HISTORYから該当のStatement IDを特定済みである。データを復旧する最も適切な方法はどれか。

  1. Fail-safeにアクセスして削除前のデータを取得する
  2. BEFORE (STATEMENT => '<statement_id>') を使ってCLONEし、復元テーブルから必要な行を挿入する
  3. DATA_RETENTION_TIME_IN_DAYSを0に設定してからUNDROP TABLEを実行する
  4. INFORMATION_SCHEMA.COPY_HISTORYから削除されたデータを復元する

正解: B

BEFORE (STATEMENT => ...) を使うと、該当のDELETE文実行直前のテーブル状態にアクセスできます。CLONEで復元テーブルを作成し、削除された行だけを元テーブルにINSERTする方法が最も適切です。Fail-safeはユーザーが直接操作できません。COPY_HISTORYはファイルロード履歴であり、DML操作の復旧には使えません。

よくある質問

Time Travelの保持期間を長くするとストレージコストはどの程度増えますか?

Time Travelの保持期間を延長すると、その期間分のマイクロパーティション変更履歴がSnowflake内部に保持されるため、追加のストレージコストが発生します。具体的なコスト増はDML操作の頻度とデータ変更量に依存します。頻繁にUPDATE/DELETEが行われるテーブルでは、各操作で変更前のマイクロパーティションが保持されるため、保持期間90日設定の場合は1日設定に比べて数倍のストレージ消費になることもあります。TABLE_STORAGE_METRICSビューでTime Travel用ストレージ(TIME_TRAVEL_BYTES)を定期的に監視することを推奨します。

UNDROPで復元した場合、テーブルの権限(GRANT)やClustering Keysも復元されますか?

はい、UNDROP TABLEを実行すると、テーブルのデータだけでなく、テーブルに付与されていたGRANT権限、Clustering Keys定義、コメント、タグなどのメタデータも復元されます。UNDROP SCHEMA / UNDROP DATABASEの場合も、スキーマ/データベース内の全オブジェクトが権限情報を含めて復元されます。ただし、同名のオブジェクトが既に存在する場合はUNDROPが失敗するため、先にALTER TABLE ... RENAME TOで既存オブジェクトをリネームする必要があります。

Transient Table・Temporary TableでもTime Travelは使えますか?

Transient Tableは最大1日(DATA_RETENTION_TIME_IN_DAYS = 0 または 1)のTime Travelが利用可能ですが、Fail-safe期間はありません。Temporary Tableもセッション内で最大1日のTime Travelが利用可能で、セッション終了とともに自動削除されます。Enterprise EditionでもTransient/Temporary Tableの保持期間は最大1日に制限されており、90日への延長はPermanent Tableのみ可能です。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.