履歴データへのアクセス

BigQuery では、タイムトラベル期間内に変更または削除された BigQuery に保存されているデータをクエリして復元できます。

特定の時点のデータをクエリで取得する

タイムトラベル期間内で、特定の時点におけるテーブルの過去のデータをクエリするには、FOR SYSTEM_TIME AS OF 句を使用します。この句は、タイムスタンプの定数式を受け取り、そのタイムスタンプの時点で最新であったテーブルのバージョンを参照します。テーブルは BigQuery に保存されている必要があります。外部テーブルは使用できません。SYSTEM_TIME AS OF を使用する場合、テーブルサイズに上限はありません。

たとえば、次のクエリを実行すると、1 時間前のテーブルの履歴バージョンが返されます。

SELECT *
FROM `mydataset.mytable`
  FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR);

タイムスタンプが、タイムトラベル期間の前かテーブルの作成時刻より前の場合、クエリは失敗し、次のようなエラーが返されます。

Invalid snapshot time 1601168925462 for table
myproject:mydataset.table1@1601168925462. Cannot read before 1601573410026.

CREATE OR REPLACE TABLE ステートメントを使用して既存のテーブルを置き換えると、FOR SYSTEM_TIME AS OF を使用してテーブルの以前のバージョンをクエリで取得できます。

テーブルが削除されている場合、クエリは失敗し、次のようなエラーが返されます。

Not found: Table myproject:mydataset.table was not found in location LOCATION

特定の時点のテーブルを復元する

履歴データをテーブルにコピーすることで、履歴データからテーブルを復元できます。テーブルが削除されている場合や期限切れの場合でも、タイムトラベル期間内でテーブルを復元する限り、履歴データをコピーできます。

テーブルから過去のデータをコピーするには、次のいずれかの構文を使用して、テーブル名にデコレータを追加します。

  • tableid@TIMETIME は Unix エポック時刻からの経過時間(ミリ秒単位))。
  • tableid@-TIME_OFFSETTIME_OFFSET は、現在の時刻からの相対オフセット(ミリ秒単位)です。
  • tableid@0: 使用可能な過去のデータの中で最も古いものを指定します。

たとえば、次の bq コマンドライン ツールのコマンドは、1 時間前の table1 という名前のテーブルを table1_restored という名前のテーブルにコピーします。時間 -3600000 は、相対オフセットを使用してミリ秒単位で指定します。

bq cp mydataset.table1@-3600000 mydataset.table1_restored

指定した時刻の同等の Unix エポック時刻を取得するには、次のコマンドを実行します。

  date -d '2023-08-04 16:00:34.456789Z' +%s000
  

次の bq コマンドライン ツールコマンドは、table1 という名前のテーブルを table1_restored という名前のテーブルにコピーします。前のコマンドで取得した UNIX エポック時刻 1691164834000 を置き換えます。

bq cp mydataset.table1@1691164834000 mydataset.table1_restored

詳細については、削除されたテーブルの復元をご覧ください。

次のステップ