Snowflakeのタイムトラベル機能であの頃(の状態のデータ)に戻ろう

時間旅行のツアーはいかが?時間旅行のツアーはいかが?時間旅行のツアーはいかが?時間旅行のツアーはいかが?時間旅行のツアーはいかが?時間旅行のツアーはいかが?
2020.02.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大阪オフィスの玉井です。

データベース(DWH等も含む)を扱っていると、「データの運用保守」に神経質になって、しんどくなることはありませんか。

  • ユーザによるケアレスミス
  • システムのエラー
  • バックアップにかかる日々のタスク、それにかかる時間

…などなど、とにかく「間違った操作したらどうしよう」とか「戻すのが大変だ」とか、ミスったら終わり的な空気を一人で抱え込みがちではないでしょうか。「いっそのこと、いつでも好きな時の状態(のデータ)に戻れたら、こんなに気にしなくてもいいのに」って思ったことありませんか。

Snowflakeは戻れます。過去(のデータ)へ(90日まで)。

タイムトラベルとは

戻りたかったあの頃(のデータ)へ

タイムトラベル機能を使用すると、定義された期間の内、任意の時点でのデータにアクセスすることができます。つまり、データをうっかり変更や削除してしまっても、うっかりやっちゃう前の状態のデータにアクセスすることができます。まさにタイムトラベル。

ただし注意事項があります。

  • 戻れる期間の最大は90日
  • 全エディションで使用可能
    • ただし、StandardとPremiumは最大1日まで
    • Enterprise以上だと最大90日まで
    • Enterprise以上でもTransient及びTemporaryテーブルは最大1日まで

何に適用できるのか

下記の3つが適用対象となります。

  • テーブル
  • スキーマ
  • データベース

タイムトラベルのメリット

「過去のデータに戻れる」というのが既に最大のメリットですが、、あえて(もう少し具体的に)言語化するならば下記の通りでしょうか。

  • 昔の状態のデータにアクセスできる
  • 誤ったDROPやDELETE等に対して対応できる
  • バックアップ用途して使用できる

適用方法

実は何もせずとも、Snowflakeはデフォルトで全オブジェクトに最大1日までのタイムトラベルがセットされています。

ただ、Enterpriseエディション以上の場合は、最大90日まで設定することができます。DATA_RETENTION_TIME_IN_DAYSというパラメータに任意の日数を設定することで、遡れる日数(=データを保持する日数)を変更することができます。

CREATE TABLE my_table (c1 int) SET DATA_RETENTION_TIME_IN_DAYS=90
ALTER TABLE my_table SET DATA_RETENTION_TIME_IN_DAYS=30

実は0にすることもできるのですが、0を指定すると実質タイムトラベルを無効となります。タイムトラベルを無効にするメリットがあまりない(コスト節約程度)ので、0はあまりオススメしません。

やってみた

実際に使ってみます。

テスト用のテーブルを作ります。

テーブル履歴を確認します。dropped_onはNULLです。(当たり前ですが)要するにDROPされてないということです。

では上記で作ったテーブルを早速DROPしてみます。

DROPされています。

ここでタイムトラベルの威力を目にすることができます。DROPしたテーブルはUNDROPすることで、元に戻すことができます。

何事もなかったのようにDROPされる前の状態に戻りました。

おわりに

今回はシンプルな確認方法をとりましたが、タイムトラベルは他にも編集前のテーブルに戻すこともできますし、SELECT文でクエリする時にATBEFOREを使うことで、指定した日時の時点での状態のテーブルを照会することも可能です。

非常に強力な機能なので、単純に便利なのですが、それとは別に「後で戻せるから気軽に操作しよう」という心のゆとりを得ることができるのも、ある種強力なメリットだと思います。

参考資料