🦁

BigQuery のタイムトラベル機能で誤ったデータ削除をなかったことに

2024/12/09に公開

株式会社 Hogetic Lab 取締役 CTO の岩尾です。

近年、データ分析や機械学習のプロジェクトが日々増加する中、データ管理の柔軟性やセキュリティはますます重要になっています。このような状況で、BigQuery のタイムトラベル機能は、過去のデータ状態へ簡単にアクセスできる強力なツールとして注目されています。

先日、社内メンバーから「誤って行を削除してしまった」という問い合わせがありました。その際、このタイムトラベル機能を使うことで、削除前の状態にあったデータを素早く参照し、必要な行を簡単に復旧することができました。このような事故発生時のタイムロスを最小限に抑えられる点は、タイムトラベル機能の大きな魅力です。

この記事では、このタイムトラベル機能について理解を深め、実際の使い方やベストプラクティス、短期・長期の監査対応での考慮点までを紹介します。

タイムトラベル機能とは?

タイムトラベルとは、BigQuery のテーブルに対して、過去の特定時点におけるデータ状態をクエリできる機能です。以下のような状況で役立ちます。

  • 誤って削除・更新してしまった行を復元したい
  • 過去時点のデータ状態をすぐに確認して不具合の原因を特定したい
  • 短期的な監査やトラブルシューティングを行いたい

これらの状況において、過去のデータに容易にアクセスできます。

ポイント:

  • デフォルトで最大 7 日間(168 時間)前まで遡れます。
  • 過去の特定時点のデータを参照できます。また、必要に応じてテーブルスナップショットを組み合わせることで、より長期の履歴管理にも対応可能です。
  • 現行テーブルに影響を与えることなく、安全に過去のデータを確認できます。

基本的な使い方

タイムトラベル機能を使うには、FOR SYSTEM_TIME AS OF 句を用います。通常のクエリに少し手を加えるだけで、過去の状態を参照できます。

SELECT *
FROM `project_id.dataset_id.table_id`
FOR SYSTEM_TIME AS OF TIMESTAMP('2024-12-01T00:00:00Z');

上記では、2024-12-01 00:00:00 UTC 時点での table_id の状態を参照します。TIMESTAMP() 関数の代わりに TIMESTAMP_SUBCURRENT_TIMESTAMP() を用いて相対的に指定することも可能です。

-- 24時間前の状態を確認する例
SELECT *
FROM `project_id.dataset_id.table_id`
FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR);

このように過去の特定時間を柔軟に指定することができます。

タイムトラベル機能の制約と考慮点

  1. データ保持期間: タイムトラベル機能はデフォルトで最大 7 日間のみ有効です。それを超えるデータ保持や特定時点のデータ保存が必要な場合は、ユーザーが明示的に作成したテーブルスナップショットやバックアップを活用する必要があります。
  2. コストに注意: 過去データ参照でもクエリコストが発生します。不要なフルスキャンを避け、パーティショニングやフィルタリングを適用してコストを抑えましょう。
  3. 権限管理: 過去データへのアクセスも適切な権限が必要。監査・復旧用途で使う場合は、プロジェクトやデータセットのアクセス権限を見直しておきましょう。

タイムトラベルの監査・コンプライアンスにおける活用

「監査・検証」というと、法定監査や長期的コンプライアンス対応を想起するかもしれませんが、タイムトラベルで遡れるのは最大7日間です。そのため、長期的な証跡保管には不十分な場合があります。

ただし、短期的な問題特定や初動対応には非常に有効です。

  • 短期的な不正・誤操作検証:
    数日前に発生したデータの異常増減などを即座に追跡できるため、不正アクセスやパイプラインのバグなどを迅速に特定できます。

  • インシデント対応の初動調査:
    データトラブルが発覚してから数日以内に原因を特定したい場合、タイムトラベルで問題発生直前の状態を参照することで、初動対応がスムーズになります。

一方、数ヶ月~数年単位の監査やコンプライアンス要件に応えるには、タイムトラベル機能だけでは不十分です。そのため、以下のようなタイムトラベル以外の補完策が必要です。

  • テーブルスナップショットの活用:
    定期的にスナップショットを取得・保管することで、後日任意の時点のデータにアクセスできます。

  • ロジックやバージョン管理との組み合わせ:
    データパイプラインや処理ロジックをバージョン管理し、変更のたびにスナップショットを残すことで、後日、詳細な監査要求にも対応できます。

ユースケース例

  • 緊急リカバリ:
    先日の社内事例のように、メンバーが誤って行を削除してしまった場合でも、タイムトラベル機能を用いれば削除前の状態を参照し、必要な行をすぐに復元できます。なお、7 日を超える期間のデータが必要な場合は、事前に作成したテーブルスナップショットが有効です。これにより、システムのダウンタイムやビジネスへの影響を最小限に抑えられます。

  • 短期的な監査・トラブルシューティング:
    直近数日のデータ異常をすぐに確認し、問題箇所を特定して迅速な対応が可能です。

  • 実験・検証:
    過去の状態を参照して特定期間の傾向分析やABテスト結果の再検証を行う場合にも役立ちます。

ベストプラクティス

  • スナップショットとの組み合わせ:
    7 日を超える保持が必要な場合は、定期的なスナップショット取得で長期履歴も確保し、必要に応じて過去状態へアクセス可能にしましょう。

  • パーティション分割・クラスタリングの活用:
    絞り込み効率が向上し、クエリコストの削減につながります。

  • ビューの作成:
    過去データを頻繁に参照する場合、特定のタイムトラベルクエリを事前に保存したビューを作成しておけば、タイムトラベルの利用が効率化されます。例えば、FOR SYSTEM_TIME AS OF 句を含むビューを用いれば、スクリプトを再利用する必要がなくなります。

これらのベストプラクティスを実行することで、データ管理の安全性と効率性がさらに高まります。

まとめ

BigQuery のタイムトラベル機能は、過去のデータ状態への即時アクセスを可能にし、短期的な問題解決やデータ管理を効率化します。スナップショットやバックアップを組み合わせ、柔軟で安全なデータ運用環境を構築してください。

Hogetic Lab

Discussion