履歴データへのアクセス
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
特定の時点のテーブルを復元する
過去のデータを新しいテーブルにコピーすることで、過去のデータからテーブルを復元できます。テーブルが削除されている場合や期限切れの場合でも、タイムトラベル期間内でテーブルを復元する限り、履歴データをコピーできます。
過去のデータからテーブルを復元しても、元のテーブルのタグは復元したテーブルにコピーされません。 テーブルのパーティショニング情報も宛先テーブルにコピーされません。元のテーブルのパーティショニング スキームを再作成するには、Cloud Logging で最初のテーブル作成リクエストを表示し、その情報を使用して復元されたテーブルをパーティショニングします。
削除されたテーブルは、タイムトラベル期間内であれば、@<time> 時間デコレータを使用してテーブルを新しいテーブルにコピーすることで復元できます。時間デコレータを使用しても、削除されたテーブルをクエリすることはできません。まずテーブルを復元する必要があります。
@<time> 時間デコレータで次の構文を使用します。
tableid@TIME(TIMEは Unix エポック時刻からの経過時間(ミリ秒単位)です)。tableid@-TIME_OFFSET。TIME_OFFSETは、現在の時刻からの相対オフセット(ミリ秒単位)です。tableid@0: 使用可能な履歴データの中で最も古いものを指定します。
テーブルを復元するには、次のいずれかのオプションを選択します。
コンソール
Google Cloud コンソールを使用してテーブルの削除を取り消すことはできません。
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
テーブルを復元するには、まずテーブルが存在していたときの UNIX タイムスタンプ(ミリ秒単位)を特定します。Linux の
dateコマンドを使用して、通常のタイムスタンプ値から UNIX タイムスタンプを生成できます。date -d '2023-08-04 16:00:34.456789Z' +%s000
次に、
@<time>タイムトラベル デコレータを指定してbq copyコマンドを使用し、テーブルのコピー オペレーションを実行します。たとえば、
1418864998000の時点のmydataset.mytableテーブルを新しいテーブルmydataset.newtableにコピーするには、次のコマンドを入力します。bq cp mydataset.mytable@1418864998000 mydataset.newtable
(省略可)
--locationフラグを指定して、その値をロケーションに設定します。相対オフセットを指定することもできます。次の例は、1 時間前のテーブルのバージョンをコピーします。
bq cp mydataset.mytable@-3600000 mydataset.newtable
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。
Node.js
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。
タイムトラベル期間によって許されている期間後にテーブルを復元することが想定される場合は、テーブルのスナップショットを作成します。 さらに詳しい内容については、テーブル スナップショットの概要をご覧ください。
論理ビューを直接復元することはできません。詳細については、ビューを復元するをご覧ください。
次のステップ
- テーブル スナップショットの詳細を確認する。
- タイムトラベルとフェイルセーフによるデータの保持の詳細を確認する。
- テーブルの管理の詳細を確認する。