データ基盤
Snowflake Time Travel(タイムトラベル)とは?保持期間と復元
シリーズSnowflake 入門全13回
- 第1回Snowflakeとは?仕組み・料金・使い方をわかりやすく解説
- 第2回Snowflakeのウェアハウスとは?サイズとクレジット・自動停止
- 第3回Snowflakeの料金の仕組みとは?計算・保存・転送とコスト管理
- 第4回Snowflake マイクロパーティションとは?プルーニングとクラスタリング
- 第5回Snowflake VARIANTとは?JSONを扱う半構造化データの仕組み
- 第6回Snowflake Time Travel(タイムトラベル)とは?保持期間と復元
- 第7回Snowflake レプリケーションとは?別リージョンに複製して切り替える
- 第8回Snowflake ロールとは?権限をロールに与えて階層で渡す仕組み
- 第9回Snowflake Dynamic Tablesとは?SELECTだけで結果の表を最新に保つ
- 第10回Snowflake データ共有とは?コピーせずに取引先と同じ表を使う
- 第11回Snowflake Icebergテーブルとは?同じデータを他のエンジンでも読む
- 第12回Snowflake Cortexとは?データを外に出さずにSQLでAIを使う
- 第13回Snowflake Well-Architectedとは?5つの柱で自分の判断を見直す
- Time Travel
- タイムトラベル
- Snowflake
- 保持期間
- UNDROP
- Fail-safe
- ゼロコピークローニング
- クローン
- AT | BEFORE
- マイクロパーティション
- 保存の料金
- TRANSIENT
- クエリ ID
- TABLE_STORAGE_METRICS
- Enterprise Edition
- Backups
- 保持ロック
- SWAP WITH
- Well-Architected
- データ基盤
目次
データベースでは、表の行を誤って書き換えたり、表そのものを消したりすることがある。ふつうは、定期的に取っておいたバックアップから戻す。バックアップを取った時点より後の変更は、戻せない。
Snowflake では、変える前や消す前の表を、決めた期間だけ自動で残しておく。この機能を Time Travel という1。日本語の公式ドキュメントでも「Time Travel」と英語で書く。
Snowflake の Time Travel とは何で、利用者は過去の表をいつまで、どう戻せるのか。
Time Travel は、変える前や消す前の表を保持期間のあいだ残す機能である。保持期間は既定で 1 日、Enterprise Edition 以上の永続の表なら最大 90 日で、その間、利用者は過去の時点の表を読んだり写したりでき、消した表を UNDROP で戻せる。
過去の表を読めるのは、Snowflake が表のファイルを書き換えず、変更のたびに新しいファイルを足すからである。永続の表では、保持期間を過ぎた履歴は 7 日の Fail-safe に移り、そこからは Snowflake だけがその履歴を戻せる。保持期間を長くするほど、またよく書き換わる表ほど、履歴の保存の料金が増える。
過去の時点を指定して、そのときの表を読む
Time Travel では、利用者が過去の時点を指定すると、その時点の表の中身を読める。表は、Snowflake の公式ドキュメントにある 2 列の tt1 を使う2。2024 年 6 月 5 日の 15 時 25 分(セッションのタイムゾーンで)に tt1 を作って 2 行を入れ、5 分後に 3 行目を入れたとする。3 行目を入れる前の 15 時 29 分を指定すると、そのときの 2 行が返る。
- 利用者Snowflake1. 15 時 25 分に tt1 を作り、2 行を入れる
- 利用者Snowflake2. 5 分後に 3 行目を入れる
- 利用者Snowflake3. 15 時 29 分の tt1 を読む
- Snowflake利用者4. 3 行目を入れる前の 2 行を返す
- 利用者Snowflake5. 今の tt1 を読む
- Snowflake利用者6. 3 行を返す
時点は、問い合わせの表の名前の後に AT で書く2。
SELECT * FROM tt1 AT(TIMESTAMP => '2024-06-05 15:29:00'::TIMESTAMP_LTZ);
+----+----+
| C1 | C2 |
|----+----|
| 1 | 2 |
| 2 | 3 |
+----+----+
過去の時点を読んでも、表の今の中身は 3 行のまま変わらない。誤って書き換えた表を戻すときも、この指定で過去の時点を選ぶ。時刻には、TIMESTAMP_LTZ のようにタイムゾーンの決まる型を付ける。::TIMESTAMP のようにタイムゾーンを持たない型で書くと、設定によっては UTC(協定世界時、Coordinated Universal Time)の時刻として読まれ、意図と違う時点を指す2。
過去を残せるのは、ファイルを書き換えないから
Snowflake の創業者らによる 2016 年の論文(データベースの国際会議 SIGMOD で発表)は、その仕組みを次のように説明している3。
- 表のファイルは書き換えない。保存にクラウドのオブジェクトストレージ(Amazon S3)を使うことから来た設計である。
- 行を足す、変える、消すといった書き込みは、ファイルを丸ごと足したり外したりして、表の新しい版を作る。
- 新しい版で外れたファイルは、決めた期間(論文の時点で最大 90 日)消さずに残す。
- 残したファイルを読めば、前の版の表を効率よく読める。これが Time Travel である。
今の Snowflake では、表のデータを小さく分けて持つファイルを、マイクロパーティションという。変更があると、影響を受けたマイクロパーティションが作り直され、前のものは履歴として保持期間のあいだ保たれる4。どの版の表がどのマイクロパーティションでできているかは、データとは別の管理用の記録(メタデータ)に残される5。
保持期間:既定は 1 日、最大 90 日
履歴を残す期間を、保持期間という。保持期間は既定で 1 日で、どのアカウントでも自動で有効になっている1。
- 1 日より長くするには、Snowflake の契約の種類(エディション)が Enterprise Edition 以上である必要がある。永続の表(ふつうの表)なら、0 から 90 日まで決められる1。
- Standard Edition では、0 日か 1 日である1。
- 0 日にすると、その表の Time Travel は事実上止まる1。アカウントの最低保持期間(後で述べる)も含めて、実際の保持期間が 0 日の表を消すと、UNDROP でも戻せない1。Snowflake は、どの表も少なくとも 1 日は保つよう勧めている1。
保持期間は、パラメータ DATA_RETENTION_TIME_IN_DAYS で、アカウント、データベース、スキーマ、表の単位で決める6。上の単位で期間を変えると、期間を明示していない下のデータベース、スキーマ、表は、すでにあるものも新しい期間を引き継ぐ1。Snowflake は、予期しない結果になりうると注意し、とくにアカウントの単位で期間を 0 にすることは勧めていない1。
アカウントに MIN_DATA_RETENTION_TIME_IN_DAYS を決めておくと、表ごとの値がそれより短くても、長いほうが使われる1。利用者が表の保持期間を 0 日にしても、アカウントで決めた最低の期間は保たれる。
期間を数え始めるのは、表を作ったときではなく、そのデータが変わったり消されたりしたときである1。期間を延ばすと、いま Time Travel にある履歴も長く保たれる。ただし、すでに Fail-safe に移った履歴は戻らない1。
データベースを消すと、その中の表に別の保持期間を決めていても、表はデータベースの保持期間に従う1。表ごとの期間を守りたいなら、先に表を消してからデータベースを消す。
過去を読む、消した表を戻す、過去の時点を写す
保持期間の間は、次の三つができる1。
過去を読む(AT と BEFORE): SELECT の表の名前の後に、AT か BEFORE で時点を指定する。時点の指定は三つある2。
| 指定 | 意味 |
|---|---|
| TIMESTAMP | 日時 |
| OFFSET | 今から-60*5 なら |
| STATEMENT | 文の |
AT は、指定した時点の変更を含む。BEFORE は、指定した時点の直前を指す2。BEFORE で STATEMENT を指定したときは、文が始まる前ではなく、文が終わる直前を指す2。文が動いている間に、ほかのクエリが確定させた変更は、結果に含まれる2。
クエリ ID で指定できるのは、14 日以内に実行した文だけである。それより前の文は、その文の時刻で指定する2。保持期間の外の時点を指定すると、エラーが返る2。過去の中身は、今の表の定義(列や既定の値)で返る2。
消した表を戻す(UNDROP): UNDROP TABLE は、消した表の最も新しい版を、消したときのデータベースとスキーマに戻す7。スキーマとデータベースにも UNDROP がある1。
同じ名前の表を作り直していると、UNDROP は失敗する。今の表の名前を変えてから UNDROP すると、前の版が戻る1。同じ名前で消すことと作ることを繰り返していれば、UNDROP は、最も新しく消した版から順に戻す1。
過去の時点を写す(クローン): CREATE TABLE … CLONE に AT か BEFORE を付けると、過去の時点の表の写しを作れる。データベースやスキーマごとでも作れる8。
Snowflake の Well-Architected Framework は、誤った UPDATE や DELETE のようなデータの論理的な破損に対して、Time Travel を「最初の、最も速い守り」と位置付けている9。戻し方を手順書にして、定期的に試しておくよう勧めている9。同じ文書は、誤ってデータを変えた文のクエリ ID をクエリの履歴から探し、その文の直前の時点を BEFORE で読んで、正しいデータを表へ入れ直す手順も示している9。
CREATE TABLE … CLONE と ALTER TABLE … SWAP WITH を組み合わせる次の戻し方は、Snowflake のドキュメントに手順としては載っていない。誤った文の直前の時点のクローンを作り、中身を確かめてから、元の表と名前を入れ替える。
-- 誤った UPDATE の直前の表を写す。COPY GRANTS で元の表の権限も写す
CREATE TABLE my_table_restored CLONE my_table
BEFORE (STATEMENT => '<誤った UPDATE のクエリ ID>')
COPY GRANTS;
-- 中身を確かめてから、二つの表の名前を入れ替える
ALTER TABLE my_table SWAP WITH my_table_restored;
CLONE の後に AT か BEFORE、その後に COPY GRANTS を書く10。SWAP WITH は、二つの表の名前を一つのトランザクションで入れ替える11。
入れ替えた後の表は、元の表とは別の表なので、次の点が変わる。
- COPY GRANTS で写るのは明示的に与えた権限で、所有権(OWNERSHIP)と、スキーマ内に新しく作る表などへ自動で与える権限(future grants)は写らない128。
- 自動クラスタリングは止まった状態で作られ、ストレージのライフサイクルポリシーも付かない8。
- Time Travel の履歴はクローンを作った時点から始まる。それより前の履歴は、名前を入れ替えたほうの表が持つ12。
Fail-safe:保持期間の後の 7 日は、Snowflake だけが戻せる
永続の表では、保持期間を過ぎた履歴は Fail-safe に移る1。消すまで残る TRANSIENT の表と、セッションが終わると消える TEMPORARY の表には Fail-safe がない13。Fail-safe の期間は 7 日で、変えられない14。
- Fail-safe の履歴は、利用者は読めない。戻すには Snowflake のサポートに依頼する14。
- 戻すのはベストエフォートで、ほかの戻し方をすべて試した後に使うためのものである。戻すのに数時間から数日かかる14。
- 目的は、システムの障害やセキュリティの侵害のような、極端な事態で失われたデータを Snowflake が戻すことである14。
Snowflake の Well-Architected Framework も、Fail-safe はふだんの戻し方に組み込まず、最後の守りとして扱うよう勧めている9。
保存の料金:履歴も料金の対象になる
Time Travel と Fail-safe の履歴は、保存の料金の対象になる15。履歴は、今の表、Time Travel、Fail-safe の順に移り、Fail-safe を出るまで料金がかかる4。行を足すだけの表でも、INSERT や COPY で読み込むと、小さなマイクロパーティションをまとめ直す処理で古いものが消され、その分が Time Travel と Fail-safe の料金の対象になる4。
よく書き換わる表では、履歴が今の表よりずっと大きくなることがある4。Snowflake のドキュメントは、極端な例として、200 GB の表のすべての行を 1 日に 20 回書き換える場合を示している。今の表 200 GB に対して、Time Travel が 4 TB、Fail-safe が 28 TB で、合わせて 32.2 TB になる4。
それでも Snowflake は、ほとんどの場合は永続の表にして、Time Travel と Fail-safe で守るのがよいとしている。保存の料金は安く、よく書き換わる表の多くは、保存するデータ全体のうち小さい割合だからである4。保存するデータが大きくなりすぎる表に限って、保持期間 0 日の TRANSIENT の表にし、定期的に永続の表へ写す方法を挙げている。1 日 1 回写すなら、合わせて 2 TB になる4。
表の種類ごとの期間は、次のとおりである13。
| 表の | Time Travel と |
|---|---|
| 永続 | Time Travel は |
| TRANSIENT | Time Travel は |
| TEMPORARY | Time Travel は |
TRANSIENT の表の履歴は、保持期間を過ぎると Snowflake にも戻せない。Snowflake は、TRANSIENT の表は Snowflake の外で作り直せるデータにだけ使い、ファクトテーブルのように長く使う表は常に永続にするよう書いている15。使う期間が 1 日に満たない ETL(Extract-Transform-Load、抽出・変換・読み込み)の作業用の表は、TRANSIENT にしてよいとしている15。ただし、消えたデータを読み込み直す時間や、そのあいだ業務が止まる時間を考えると、Fail-safe の料金を払っても永続の表のほうがよいこともあるとしている15。
どの表がどれだけ履歴を持っているかは、TABLE_STORAGE_METRICS で見られる16。
| 列 | 意味 |
|---|---|
| ACTIVE_BYTES | 今の |
| TIME_TRAVEL_BYTES | Time Travel の |
| FAILSAFE_BYTES | Fail-safe の |
| RETAINED_FOR_CLONE_BYTES | 消したが、 |
数字が更新されるまでに、1〜2 時間かかることがある16。FAILSAFE_BYTES を ACTIVE_BYTES で割った比が大きい表が、よく書き換わる表である4。
ゼロコピークローニング:ファイルの記録だけを写す
Snowflake では、ファイルを写さずに表やスキーマ、データベースの写しを作ることを、ゼロコピークローニングという8。
論文によれば、クローンは元の表のメタデータを写すだけである。作った直後は、二つの表が同じファイルを参照し、その後はそれぞれ別に変えられる3。今のドキュメントでも、クローンは書き込みができ、元の表とは独立している8。
- クローンは、中身を変えたり足したりするまで、保存するデータを増やさない8。
- クローンを変えると、新しいマイクロパーティションができ、それはクローンだけのものになる4。
- 元の表で消したマイクロパーティションも、クローンが参照していれば保たれ、TABLE_STORAGE_METRICS の RETAINED_FOR_CLONE_BYTES に出る16。
- 元の表の読み込みの履歴。元の表に読み込んだファイルを、クローンにもう一度読み込める。
- 元の表に与えた権限(COPY GRANTS を付けない場合)。
- データベースやスキーマのクローンでの、外部テーブル。
- 表のステージにあるファイル。
- クローンの Time Travel の履歴。クローンの履歴は、クローンを作った時点から始まる。
データベースやスキーマのクローンに入るタスクは、止まった状態で作られる12。ただし、時刻(TIMESTAMP)で過去の時点を指定したクローンには、データベースやスキーマの中のタスクは入らない8。クローンを作るのは速いが、大きな表では一瞬ではない12。
もっと長く、消せない形で残すなら
Time Travel と Fail-safe は短い期間の守りで、規則によってはもっと長く、変えられない形で残す必要がある9。Snowflake では、そのための機能を Backups という。2025 年 8 月にプレビューとして出て(当時の名前は WORM snapshots。WORM は Write Once, Read Many の略で、一度書いたら変えられないことを指す)、2025 年 12 月に一般提供になった17。
- バックアップは、ある時点の表、スキーマ、データベースの写しで、変えられない18。クローンと同じく、ファイルを写さない18。
- バックアップに保持ロックを付けると、期限まではどのロールでもそのバックアップを消せない。付けると外せず、Snowflake のサポートも外せない。保持ロックは Business Critical Edition 以上で使える18。
- バックアップ自体はどのエディションでも使えるが、TRANSIENT の表は対象にならない18。
- Time Travel の保持期間は 0 日まで縮められるが、保持ロック付きのバックアップの期限は縮められない18。
Snowflake の Well-Architected Framework は、別のリージョンへの複製は、リージョンの障害には要るが、人の誤りやデータの破損への備えの代わりにはならないとしている9。同じ文書は、複製に加えて、重要なデータベースのゼロコピークローンを定期的に自動で作るか、変えられないバックアップを Snapshots(いまの Backups)で定期的に作るよう勧めている9。
出典18件
-
Snowflake「Understanding & using Time Travel | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/user-guide/data-time-travel — 保持期間、継承、UNDROP と同じ名前の表。日本語版の題は「Time Travelの理解と使用」。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18
-
Snowflake「AT | BEFORE | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/sql-reference/constructs/at-before — 時点を指定したクエリの例と結果、14 日の制限。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10
-
Benoit Dageville ほか「The Snowflake Elastic Data Warehouse」SIGMOD 2016、2016年6月、2026年10月27日取得. https://info.snowflake.net/rs/252-RFO-227/images/Snowflake_SIGMOD.pdf — 3.3.2 節と 4.4 節、書き換えないファイル、Time Travel とクローン。 ↩ ↩2
-
Snowflake「Data storage considerations | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/user-guide/tables-storage-considerations — よく書き換わる表の例と、クローンの保存。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Ashish Motivala「How FoundationDB Powers Snowflake Metadata Forward」Snowflake Blog、2018年4月19日、2026年10月27日取得. https://www.snowflake.com/en/blog/how-foundationdb-powers-snowflake-metadata-forward/ — Snowflake の公式ブログ。筆者は、上の SIGMOD 2016 の論文の共著者の一人。 ↩
-
Snowflake「Parameters | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/sql-reference/parameters — DATA_RETENTION_TIME_IN_DAYS。 ↩
-
Snowflake「UNDROP TABLE | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/sql-reference/sql/undrop-table ↩
-
Snowflake「CREATE <object> … CLONE | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/sql-reference/sql/create-clone — 日本語版は「ゼロコピークローン」。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Snowflake「Reliability」Snowflake Well-Architected Framework、2026年6月17日更新、2026年10月27日取得. https://www.snowflake.com/en/developers/guides/well-architected-framework-reliability/ — Time Travel、Fail-safe、手順書の勧め、誤った文を戻す手順。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
Snowflake「CREATE TABLE | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/sql-reference/sql/create-table — CLONE の構文。 ↩
-
Snowflake「ALTER TABLE | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/sql-reference/sql/alter-table ↩
-
Snowflake「Cloning considerations | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/user-guide/object-clone ↩ ↩2 ↩3 ↩4 ↩5
-
Snowflake「Working with Temporary and Transient Tables | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/user-guide/tables-temp-transient ↩ ↩2
-
Snowflake「Understanding and viewing Fail-safe | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/user-guide/data-failsafe — ベストエフォート、サポートへの依頼、数時間から数日。 ↩ ↩2 ↩3 ↩4
-
Snowflake「Storage costs for Time Travel and Fail-safe | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/user-guide/data-cdp-storage-costs — 日本語版は TRANSIENT と TEMPORARY の訳語がページによって違うので、英語の名前で探すとよい。 ↩ ↩2 ↩3 ↩4
-
Snowflake「TABLE_STORAGE_METRICS view | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/sql-reference/info-schema/table_storage_metrics ↩ ↩2 ↩3
-
Snowflake「Dec 10, 2025: General availability of WORM backups | Snowflake Documentation」2025年12月10日、2026年10月27日取得. https://docs.snowflake.com/en/release-notes/2025/other/2025-12-10-worm-backups — プレビューは 2025 年 8 月 18 日のリリースノート。 ↩
-
Snowflake「Backups for disaster recovery and immutable storage | Snowflake Documentation」日付なし、2026年10月27日取得. https://docs.snowflake.com/en/user-guide/backups — 日本語版の題は「障害復旧向けのバックアップと不変ストレージ」。 ↩ ↩2 ↩3 ↩4 ↩5
この記事はAIを使用して執筆されました。内容には誤りが含まれる可能性があります。事実や数字の出典は脚注から確かめられます。