テーブル スナップショットを作成する

このドキュメントでは、Google Cloud コンソール、CREATE SNAPSHOT TABLE SQL ステートメント、bq cp --snapshot コマンド、または jobs.insert API を使用して、テーブル スナップショットを作成する方法について説明します。このドキュメントは、BigQuery のテーブル スナップショットについて一定の知識を持つユーザーを対象としています。

権限とロール

このセクションでは、テーブル スナップショットの作成に必要な Identity and Access Management(IAM)権限と、その権限を付与する IAM 事前定義ロールについて説明します。

権限

テーブル スナップショットを作成するには、次の権限が必要です。

権限 リソース メモ
次のすべて:

bigquery.tables.get
bigquery.tables.getData
bigquery.tables.createSnapshot
bigquery.datasets.get
bigquery.jobs.create
スナップショットを作成するテーブル。 有効期限を過ぎたスナップショットは削除されるため、有効期限付きのスナップショットを作成する場合は bigquery.tables.deleteSnapshot 権限が必要になります。
bigquery.tables.create
bigquery.tables.updateData
テーブル スナップショットを含むデータセット。

ロール

必要な権限を持つ BigQuery 事前定義ロールは次のとおりです。

ロール リソース メモ
次のいずれかの少なくとも 1 つ:

bigquery.dataViewer
bigquery.dataEditor
bigquery.dataOwner

また、次のいずれかの少なくとも 1 つ:

bigquery.jobUser
bigquery.studioUser
bigquery.user
bigquery.studioAdmin
bigquery.admin
スナップショットを作成するテーブル。 有効期限付きスナップショットの作成に使用できるのは、bigquery.dataOwnerbigquery.adminbigquery.studioAdmin のみです。
次のいずれかの少なくとも 1 つ:

bigquery.dataEditor
bigquery.dataOwner
bigquery.studioAdmin
bigquery.admin
新しいテーブル スナップショットを含むデータセット。

制限事項

テーブル スナップショットの制限については、テーブル スナップショットの制限事項をご覧ください。

さらに、テーブル スナップショットの作成には次の制限があります。この制限はすべてのテーブルコピー ジョブに適用されます。

  • テーブル スナップショットを作成する際、その名前は、テーブルの作成時と同じ命名規則を遵守する必要があります。
  • テーブル スナップショットの作成には、コピージョブに関する BigQuery の制限が適用されます。
  • テーブル スナップショットのデータセットは、スナップショットの対象となるテーブルを含むデータセットと同じリージョンで、同じ組織の下に存在している必要があります。たとえば、EU ベースのデータセットに存在するテーブルのスナップショットを、US ベースのデータセットには作成できません。その代わりにテーブルのコピーを作成する必要があります。
  • BigQuery では、基盤となるストレージが動的に管理されるため、テーブル スナップショットの作成にかかる時間は、異なる実行ごとに大きく変わる可能性があります。
  • BigQuery CLI を使用してテーブル スナップショットを作成すると、スナップショットに宛先データセットのデフォルトの暗号鍵が含まれます。SQL を使用してテーブル スナップショットを作成する場合、スナップショットの暗号鍵はソーステーブルと同じになります。

テーブル スナップショットを作成する

テーブル スナップショットは、ベーステーブルとは異なるデータセットに作成することをおすすめします。これにより、ベーステーブルのデータセットが誤って削除された場合でも、テーブル スナップショットからベーステーブルを復元できます。

テーブル スナップショットを作成する際は、スナップショットを作成するテーブルと、テーブル スナップショットに付ける一意の名前を指定します。スナップショットの時刻とテーブル スナップショットの有効期限は、必要に応じて指定できます。

有効期限を指定したテーブル スナップショットを作成する

次のいずれかのオプションを使用して、24 時間後に期限切れになるテーブルのスナップショットを作成できます。

コンソール

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [エクスプローラ] ペインで、スナップショットを作成するテーブルのプロジェクトとデータセット ノードを開きます。

  3. スナップショットを作成するテーブルの名前をクリックします。

  4. 表示されたテーブルペインで、[スナップショット] をクリックします。

    [スナップショット] をクリックする

  5. 表示された [テーブル スナップショットの作成] ペインで、新しいテーブル スナップショットのプロジェクトデータセットテーブルの情報を入力します。

  6. [有効期限] フィールドに、現在から 24 時間後の日付と時刻を入力します。

  7. [保存] をクリックします。

SQL

CREATE SNAPSHOT TABLE DDL ステートメントを使用します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE SNAPSHOT TABLE SNAPSHOT_PROJECT_ID.SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME
    CLONE TABLE_PROJECT_ID.TABLE_DATASET_NAME.TABLE_NAME
      OPTIONS (
        expiration_timestamp = TIMESTAMP 'TIMESTAMP_VALUE');

    次のように置き換えます。

    • SNAPSHOT_PROJECT_ID: スナップショットの作成を行うプロジェクトのプロジェクト ID。
    • SNAPSHOT_DATASET_NAME: スナップショットの作成を行うデータセットの名前。
    • SNAPSHOT_NAME: 作成するスナップショットの名前。
    • TABLE_PROJECT_ID: スナップショットの作成元となるテーブルを含むプロジェクトのプロジェクト ID。
    • TABLE_DATASET_NAME: スナップショットの作成元となるテーブルを含むデータセットの名前。
    • TABLE_NAME: スナップショットの作成元となるテーブルの名前。
    • TIMESTAMP_VALUE: 24 時間後の日付と時刻を表すタイムスタンプ値

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

bq

Cloud Shell で次のコマンドを入力します。

Cloud Shell に移動

bq cp \
--snapshot \
--no_clobber \
--expiration=86400 \
TABLE_PROJECT_ID:TABLE_DATASET_NAME.TABLE_NAME \
SNAPSHOT_PROJECT_ID:SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME

次のように置き換えます。

  • TABLE_PROJECT_ID: スナップショットの作成元となるテーブルを含むプロジェクトのプロジェクト ID。
  • TABLE_DATASET_NAME: スナップショットの作成元となるテーブルを含むデータセットの名前。
  • TABLE_NAME: スナップショットの作成元となるテーブルの名前。
  • SNAPSHOT_PROJECT_ID: スナップショットの作成を行うプロジェクトのプロジェクト ID。
  • SNAPSHOT_DATASET_NAME: スナップショットの作成を行うデータセットの名前。
  • SNAPSHOT_NAME: 作成するスナップショットの名前。

--no_clobber フラグは必須です。

API

次のパラメータを使用して、jobs.insert メソッドを呼び出します。

パラメータ
projectId このオペレーションの請求先プロジェクトのプロジェクト ID。
リクエストの本文
{
  "configuration": {
    "copy": {
      "sourceTables": [
        {
          "projectId": "TABLE_PROJECT_ID",
          "datasetId": "TABLE_DATASET_NAME",
          "tableId": "TABLE_NAME"
        }
      ],
      "destinationTable": {
        "projectId": "SNAPSHOT_PROJECT_ID",
        "datasetId": "SNAPSHOT_DATASET_NAME",
        "tableId": "SNAPSHOT_NAME"
      },
      "operationType": "SNAPSHOT",
      "writeDisposition": "WRITE_EMPTY",
      "destinationExpirationTime":"TIMESTAMP_VALUE"
    }
  }
}

次のように置き換えます。

  • TABLE_PROJECT_ID: スナップショットの作成元となるテーブルを含むプロジェクトのプロジェクト ID。
  • TABLE_DATASET_NAME: スナップショットの作成元となるテーブルを含むデータセットの名前。
  • TABLE_NAME: スナップショットの作成元となるテーブルの名前。
  • SNAPSHOT_PROJECT_ID: スナップショットの作成を行うプロジェクトのプロジェクト ID。
  • SNAPSHOT_DATASET_NAME: スナップショットの作成を行うデータセットの名前。
  • SNAPSHOT_NAME: 作成するスナップショットの名前。
  • TIMESTAMP_VALUE: 24 時間後の日付と時刻を表すタイムスタンプ値

テーブルと同様に、有効期限が指定されていない場合、テーブル スナップショットは、そのテーブル スナップショットを含むデータセットのデフォルトのテーブルの有効期限を経過すると、期限切れになります。

タイムトラベルを使用してテーブル スナップショットを作成する

次のいずれかのオプションを使用して、1 時間前のテーブルのテーブル スナップショットを作成できます。

コンソール

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [エクスプローラ] ペインで、スナップショットを作成するテーブルのプロジェクトとデータセット ノードを開きます。

  3. スナップショットを作成するテーブルの名前をクリックします。

  4. 表示されたテーブルペインで、[スナップショット] をクリックします。

    [スナップショット] をクリックする

  5. 表示された [テーブル スナップショットの作成] ペインで、新しいテーブル スナップショットのプロジェクトデータセットテーブルの情報を入力します。

  6. [スナップショット時間] フィールドに、1 時間前の日時を入力します。

  7. [保存] をクリックします。

SQL

FOR SYSTEM_TIME AS OFを指定したCREATE SNAPSHOT TABLE DDL ステートメントを使用します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE SNAPSHOT TABLE SNAPSHOT_PROJECT_ID.SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME
    CLONE TABLE_PROJECT_ID.TABLE_DATASET_NAME.TABLE_NAME
    FOR SYSTEM_TIME AS OF
      TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR);

    次のように置き換えます。

    • SNAPSHOT_PROJECT_ID: スナップショットの作成を行うプロジェクトのプロジェクト ID。
    • SNAPSHOT_DATASET_NAME: スナップショットの作成を行うデータセットの名前。
    • SNAPSHOT_NAME: 作成するスナップショットの名前。
    • TABLE_PROJECT_ID: スナップショットの作成元となるテーブルを含むプロジェクトのプロジェクト ID。
    • TABLE_DATASET_NAME: スナップショットの作成元となるテーブルを含むデータセットの名前。
    • TABLE_NAME: スナップショットの作成元となるテーブルの名前。

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

bq

Cloud Shell で次のコマンドを入力します。

Cloud Shell に移動

bq cp \
--no_clobber \
--snapshot \
TABLE_PROJECT_ID:TABLE_DATASET_NAME.TABLE_NAME@-3600000 \
SNAPSHOT_PROJECT_ID:SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME

次のように置き換えます。

  • TABLE_PROJECT_ID: スナップショットの作成元となるテーブルを含むプロジェクトのプロジェクト ID。
  • TABLE_DATASET_NAME: スナップショットの作成元となるテーブルを含むデータセットの名前。
  • TABLE_NAME: スナップショットの作成元となるテーブルの名前。
  • SNAPSHOT_PROJECT_ID: スナップショットの作成を行うプロジェクトのプロジェクト ID。
  • SNAPSHOT_DATASET_NAME: スナップショットの作成を行うデータセットの名前。
  • SNAPSHOT_NAME: 作成するスナップショットの名前。

--no_clobber フラグは必須です。

API

次のパラメータを指定して、jobs.insert メソッドを呼び出します。

パラメータ
projectId このオペレーションの請求先プロジェクトのプロジェクト ID。
リクエストの本文
{
  "configuration": {
    "copy": {
      "sourceTables": [
        {
          "projectId": "TABLE_PROJECT_ID",
          "datasetId": "TABLE_DATASET_NAME",
          "tableId": "TABLE_NAME@-360000"
        }
      ],
      "destinationTable": {
        "projectId": "SNAPSHOT_PROJECT_ID",
        "datasetId": "SNAPSHOT_DATASET_NAME",
        "tableId": "SNAPSHOT_NAME"
      },
      "operationType": "SNAPSHOT",
      "writeDisposition": "WRITE_EMPTY"
    }
  }
}

次のように置き換えます。

  • TABLE_PROJECT_ID: スナップショットの作成元となるテーブルを含むプロジェクトのプロジェクト ID。
  • TABLE_DATASET_NAME: スナップショットの作成元となるテーブルを含むデータセットの名前。
  • TABLE_NAME: スナップショットの作成元となるテーブルの名前。
  • SNAPSHOT_PROJECT_ID: スナップショットの作成を行うプロジェクトのプロジェクト ID。
  • SNAPSHOT_DATASET_NAME: スナップショットの作成を行うデータセットの名前。
  • SNAPSHOT_NAME: 作成するスナップショットの名前。

過去のバージョンのテーブルを指定する方法については、タイムトラベルを使用した履歴データへのアクセスをご覧ください。

テーブルのアクセス制御

BigQuery でテーブルへのアクセスを制御するには、テーブルのアクセス制御の概要をご覧ください。

テーブル スナップショットを作成すると、テーブル スナップショットへのテーブルレベルのアクセス権が次のように設定されます。

  • テーブル スナップショットが既存のテーブルを上書きする場合は、既存のテーブルに対するテーブルレベルのアクセスが維持されます。タグはベーステーブルからコピーされません。
  • テーブルスナップショットが新しいリソースの場合、テーブル スナップショットに対するテーブルレベルのアクセスは、テーブル スナップショットが作成されるデータセットのアクセス ポリシーによって決まります。さらに、タグがベーステーブルからテーブル スナップショットにコピーされます。

次のステップ