履歴データへのアクセス
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
ここで、LOCATION
はデータセットのロケーションです。
ただし、このドキュメントの説明に従って、ある時点から新しいテーブルにコピーすることでテーブルを復元できます。
特定の時点のテーブルを復元する
過去のデータをテーブルにコピーすることで、過去のデータからテーブルを復元できます。テーブルが削除されている場合や期限切れの場合でも、タイムトラベル期間内でテーブルを復元する限り、データをコピーできます。
テーブルから過去のデータをコピーするには、次の構文を使用して、テーブル名にデコレータを追加します。
tableid@TIME
。TIME
は Unix エポック時刻からの経過時間(ミリ秒単位)です。tableid@-TIME_OFFSET
。TIME_OFFSET
は、現在の時刻からの相対オフセット(ミリ秒単位)です。tableid@0
: 使用可能な過去のデータの中で最も古いものを指定します。
たとえば、次の bq コマンドライン ツールのコマンドは、1 時間前の table1
という名前のテーブルを table1_restored
という名前のテーブルにコピーします。時間 -3600000
は、相対オフセットを使用してミリ秒単位で指定します。
bq cp mydataset.table1@-3600000 mydataset.table1_restored
次の bq コマンドライン ツールコマンドは、table1
という名前のテーブルを table1_restored
という名前のテーブルにコピーします。時間 1624046611000
は、Unix エポック時刻からの経過時間をミリ秒単位で指定します。
bq cp mydataset.table1@1624046611000 mydataset.table1_restored
詳細については、削除されたテーブルの復元をご覧ください。
次のステップ
- テーブル スナップショットの詳細を確認する。