Time Travelは、Snowflakeのデータ保護の中核機能で、テーブル・スキーマ・データベースの過去の状態にアクセスし、誤操作からの復旧や履歴データの参照を可能にします。AT/BEFORE句による過去時点クエリ、UNDROPによるオブジェクト復元、DATA_RETENTION_TIME_IN_DAYSによる保持期間制御が試験で頻出の3大ポイントです。
Time Travelの保持期間はDATA_RETENTION_TIME_IN_DAYSパラメータで制御します。この値はアカウント・データベース・スキーマ・テーブルの各レベルで設定でき、下位レベルの設定が上位を上書きします。
| エディション | Permanent Table | Transient Table | Temporary Table |
|---|---|---|---|
| Standard | 0〜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句は指定した時点の直前の状態を返します。タイムスタンプ指定・オフセット指定・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);-- 特定のDML実行直前の状態を取得(誤操作復旧に最適)
SELECT *
FROM analytics.orders
BEFORE (STATEMENT => '01b12345-0600-1234-0000-abcdef012345');Statement IDはQUERY_HISTORYビューから取得できます。誤ったUPDATE/DELETEを実行してしまった場合、そのStatement IDをBEFORE句に指定することで、まさにその操作の直前の状態に戻せます。
-- パターン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);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はTime Travel期間終了後の追加7日間にわたるデータ保護レイヤーです。Time Travelとは根本的に異なり、ユーザーが直接操作することはできません。
| 比較項目 | Time Travel | Fail-safe |
|---|---|---|
| 操作主体 | ユーザー(SQL操作) | Snowflakeサポートのみ |
| 期間 | 0〜90日(設定可能) | 固定7日間(Time Travel後) |
| 対象テーブル | Permanent / Transient / Temporary | Permanentのみ |
| ストレージコスト | 変更履歴分 | 変更履歴分(Permanentのみ) |
| 復旧方法 | AT/BEFORE句、UNDROP、CLONE | Snowflakeサポートへの問い合わせ |
|<── 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 Travel | Fail-safe | 主な用途 |
|---|---|---|---|
| Permanent(デフォルト) | 0〜90日 | 7日 | 本番データ・保護が必要なテーブル |
| Transient | 0〜1日 | なし | 中間テーブル・再生成可能なデータ |
| Temporary | 0〜1日 | なし | セッション内限定の一時作業 |
Data Protection
問題 1
Enterprise Editionを使用中に、誤ったDELETE文でテーブルの一部のデータを削除してしまった。QUERY_HISTORYから該当のStatement IDを特定済みである。データを復旧する最も適切な方法はどれか。
正解: 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のみ可能です。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...