ふくふくHukuhuku Inc.
EP.06Snowflake 13分公開: 2026-09-01

Time Travel と Fail-safe ── 戻せる範囲を、費用と釣り合わせる

誤って消したデータをその場で戻せるのは大きな安心です。ただし保持期間は保管費用に直結します。何をどれだけ戻せるようにするかの設計を扱います。

#Snowflake#運用#バックアップ#コスト
執筆 / 監修
松尾 亮合同会社ふくふく 代表社員

データ基盤・データパイプライン構築 / BI / 生成 AI 活用支援を専門とするエンジニア (28 年)。 本記事は AI 利用ポリシーに基づき、生成 AI の補助で執筆 → 人間が監修・編集して公開しています。

プロフィール詳細
シェア

は、過去の時点のデータを参照・復元できる機能です。誤った削除や更新の直後に、その場で戻せます。運用上の安心感は大きい。

一方で、保持期間は保管費用に直結します。この回は、戻せる範囲をどう設計するかを扱います。

1. 何ができるのか

できることは大きく3つです。過去の時点を参照するその時点の内容で複製を作る削除したものを復元する

過去の時点を参照する / 復元する
SQL
-- 5分前の状態を参照する(現在のデータには影響しない)SELECT * FROM orders AT (OFFSET => -60 * 5);
-- 特定の時刻の状態を参照するSELECT * FROM orders AT (TIMESTAMP => '2026-10-06 09:00:00'::TIMESTAMP_LTZ);
-- 問題のあった更新の「直前」を参照する(その処理を除いた状態)SELECT * FROM orders BEFORE (STATEMENT => '01a2b3c4-...');
-- その時点の内容で別テーブルを作る(比較や検証に使う)CREATE TABLE orders_before_incident CLONE orders    AT (TIMESTAMP => '2026-10-06 09:00:00'::TIMESTAMP_LTZ);
-- 削除したテーブルを復元するUNDROP TABLE orders;

実務で最も使うのは3番目です。特定の処理の直前を指定できるため、「あのバッチが壊した」と分かっている場合に、その処理を除いた状態を正確に取り出せます。

まず上書きせず、複製して比較する

事故の直後に元テーブルへ直接書き戻すのは危険です。まず過去の時点で複製を作り、現在と比較して、何が変わったのかを確認してください。原因を把握しないまま戻すと、正当な更新まで巻き戻すことになります。

2. 保持期間と費用の関係

費用は、保持期間 × 変更量でおおよそ決まります。ここで効くのは期間ではなく変更量のほうです。

表の性質ごとの方針
表の性質過去の版の量保持期間の考え方
追記のみ(ログなど)少ない長めでも費用への影響は小さい
一部を更新中程度業務上の必要期間で決める
毎回全件を入れ替え非常に多い短くする。日数分の複製が積み上がる
一時的な作業用不要最短にする、または一時テーブルにする

3行目が費用の主犯になりやすい形です。毎日全件を入れ替えると、保持日数ぶんの複製がそのまま積み上がります。EP.3 で「現在の量より過去の版のほうが大きい表」を探しましたが、そこで見つかるのはたいていこの形です。逆に言えば、全件入れ替えを差分更新に変えると、性能と保管費用の両方が同時に改善します。この構造は パフォーマンスチューニング実践 EP.07 で扱ったバッチの差分化と同じ話です。

テーブルごとに保持期間を設定する
SQL
-- 一時的な作業用テーブルは保持しないALTER TABLE staging_orders SET DATA_RETENTION_TIME_IN_DAYS = 0;
-- 重要な業務データは長めにALTER TABLE contracts SET DATA_RETENTION_TIME_IN_DAYS = 30;
-- 現在の設定を確認するSHOW TABLES LIKE 'orders%';
-- データベース単位の既定値も設定できるALTER DATABASE staging SET DATA_RETENTION_TIME_IN_DAYS = 1;

一時テーブルや作業用の中間データに、本番と同じ保持期間を設定しているのは非常によく見る形です。ここを見直すだけで保管費用が下がることがあります。設定できる上限は契約する版によって異なるため、手元の環境で確認してください

3. Fail-safe を当てにしない

Time Travel の期間が切れたあと、 という期間があります。ただしこれは利用者が自分で参照できません。提供元への依頼が必要で、時間もかかります。

したがって、自分で戻せる範囲は Time Travel の期間内までと考えてください。Fail-safe は最後の保険であって、運用手順に組み込むものではありません。

Fail-safe の分も保管費用がかかる

利用者が使えないにもかかわらず、その期間の保管費用は発生します。EP.3 の集計で「保険GB」として出てくるのがこれです。変更量が多い表ほど、この分も積み上がります。

4. Time Travel でカバーできないもの

万能ではありません。何をカバーしないかを理解しておく必要があります。

  • 保持期間を超えた過去 — 気づくのが遅れた事故には効かない
  • 削除して作り直したテーブル — 同名でも別の実体になる場合がある
  • 間違ったデータを取り込み続けた場合 — どの時点も正しくない
  • 上流のデータそのものが失われた場合 — 取り込み元が消えていれば復元できない

1番目が実務では効いてきます。集計値の誤りは、気づくのが遅れるという性質を持ちます。誰も見ていない出力が壊れていた、月次で初めて気づいた ── こうしたケースでは保持期間を超えていることがあります。

したがって、Time Travel は「気づける仕組み」とセットでなければ機能しません。壊れたことに早く気づけるなら短い保持期間で足りますし、気づくのが遅い領域は長く持つか、別の手段が要ります。データ基盤トラブル事件簿 EP.06「数字が合わない」 に、気づくのが遅れる構造の例があります。

5. 復旧の手順を決めておく

機能があることと、事故のときに使えることは別です。手順を決めておかないと、慌てて余計な変更を加えることになります。

  1. 1まず止める — 壊し続けている処理があれば止める。これが最優先
  2. 2現状を保全する — 現在の状態も複製しておく。戻したあとの比較に要る
  3. 3過去の時点を複製する — 元テーブルには触らない
  4. 4差分を確認する — 何が変わったのかを把握してから判断
  5. 5戻す範囲を決めて適用する — 全件か、一部か
  6. 6記録する — 原因と、戻した範囲

2番目を飛ばしがちです。戻したあとで「やっぱり一部は残すべきだった」となったとき、現状を保全していないと取り返せません。複製は なら瞬時に作れて保管費用もほとんどかからないので、必ず作ってから作業してください(EP.7 で詳しく扱います)。事故対応の最中は判断が急ぎがちですが、この1手だけは省かないと決めておくと、後で選択肢が残ります。

6. 設計としてどう決めるか

保持期間は、気づくまでの時間から逆算します。

気づくまでの時間から逆算する
データの性質壊れたら気づくまで保持期間の目安
画面に出る、人が毎日見るその日のうち短くてよい
週次で確認する集計1週間程度それを超える期間
月次でしか見ない1か月長めに必要、または別の検知手段
誰も見ていない気づかない保持期間では解決しない。検知を作る

最下行が本質的な指摘です。誰も見ていないデータは、保持期間をいくら長くしても救えません。ここに必要なのは復旧手段ではなく、壊れたことに気づく仕組みです。保持期間の議論をしていて最下行に当たったら、それは別の問題を扱うべきというサインです。

ここまでのまとめ

実務で最も使うのは特定の処理の直前を指定する参照。費用は期間よりも変更量で決まり、毎回全件入れ替えが主犯になりやすい。一時テーブルの保持期間は見直す価値がある。Fail-safe は自分で使えないので当てにしない。保持期間は気づくまでの時間から逆算し、「誰も見ていない」なら検知の仕組みを先に作る。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp