履歴データへのアクセス
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@TIME
(TIME
は Unix エポック時刻からの経過時間(ミリ秒単位))。tableid@-TIME_OFFSET
。TIME_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
詳細については、削除されたテーブルの復元をご覧ください。
次のステップ
- テーブル スナップショットの詳細を確認する。
- タイムトラベルとフェイルセーフによるデータの保持の詳細を確認する。
- テーブルの管理の詳細を確認する。