【Snowflake】タイムトラベルで過去のデータにアクセスする

【Snowflake】タイムトラベルで過去のデータにアクセスする | Tableau-id Press -タブロイド-
snowflake-logo-1200x630-960x504

s.satoです。最近仕事でSnowflakeを使い始めました!
ある日、変わらないはずの集計データが数日前からおかしくなっており、原因を調査しないといけないことがありました。

集計元のテーブルは日別更新なので今はもうデータが変わっちゃってるし、どうやって調べようかなあ・・・と思っていたところ、
数日前に参加したSnowflakeのイベント「【Snowflake触って遊べる】BUILD.local Tokyo: LEGEND OF THE DATA HEROES」で習った「タイムトラベル」機能で解決できたのでご紹介します!

Snowflakeのタイムトラベルとは

タイムトラベルとは、定義された期間内の任意の時点のデータにアクセスすることができます。
現在は変更削除されているデータでも、定義期間内であれば好きな時点のデータを見ることができます。
Snowflake ドキュメント:Time Travelの理解と使用

タイムトラベルの使い方(3通り)

タイムトラベルの指定の仕方は3通りあります。

・タイムスタンプ指定

タイムスタンプを指定すると、指定したタイムスタンプ時点のデータを表示します。

select * from my_table at(timestamp => 'Nov, 01 Tue 2022 16:20:00 -0700'::timestamp_tz);

・現在時刻との差分指定

offsetに現在からさかのぼりたい時間を指定します。
単位は秒なので、例えば1時間前のテーブルの状態を見たいのであれば-60*60を指定すればよいです。

select * from my_table at(offset => -60*60);

・ステートメント指定

指定したステートメントによる変更前のデータにアクセスします。
ステートメントにはクエリIDを指定します。
例えばあるSQLでデータを更新してしまったが、SQL実行前の状態のデータを見たい、という場合は該当SQLのクエリIDを調べて指定します。

select * from my_table before(statement => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');

実際にタイムトラベルしてみる

試しに、「現在時刻との差分指定」でタイムトラベルしてみた例を見て見ましょう。

次のようなTEST_TBLテーブルがあります。

ここでTRUNCATEして全件削除してしまいます。

データが全件消えてしまいました。

OFFSETで5分前を指定してTEST_TBLをSELECTしてみます。

削除前のデータに簡単アクセスできましたね!すごい!

タイムトラベル可能期間

誰でもいつでも好きな時間にさかのぼれるというわけではないので、ご注意ください

・デフォルトでは、最大保持期間は1日(24時間)
・Snowflake Enterprise Edition 以上 では、最大90日まで設定可

上記条件の元、定義した期間内のデータにアクセスが可能です。

詳細は、Snowflake ドキュメント:オブジェクトのデータ保持期間の指定を参照してください。

おわりに

業務で行った調査では、タイムトラベルで数日前の時点のデータにアクセスし、現在のデータと比較しておかしくなった原因となるデータを特定したのでした。
このように、タイムトラベル機能は調査やデータ復旧など、いろいろと使い道がありそうです。
データベースで過去のデータを取り戻すのはかなり大変(場合によっては不可能)なイメージだったのですが、snowflakeでは簡単にできるので驚きました!

自分は超初心者の状態でsnowflakeのイベントに参加してしまったのですが、1つでも仕事に役に立つことを持って帰ることができて良かったです。連れて行って下さった職場の先輩N.Mimuraさんに感謝です!
N.Mimuraさんの技術ブログ snowflake関連の記事もあるのでぜひご覧ください!