テーブル スナップショットを作成する
このドキュメントでは、Google Cloud コンソール、CREATE SNAPSHOT TABLE SQL ステートメント、bq cp --snapshot コマンド、または jobs.insert API を使用して、テーブル スナップショットを作成する方法について説明します。このドキュメントは、BigQuery のテーブル スナップショットについて一定の知識を持つユーザーを対象としています。
権限とロール
このセクションでは、テーブル スナップショットの作成に必要な Identity and Access Management(IAM)権限と、その権限を付与する IAM 事前定義ロールについて説明します。
権限
テーブル スナップショットを作成するには、次の権限が必要です。
| 権限 | リソース | メモ | 
|---|---|---|
| 次のすべて: bigquery.tables.getbigquery.tables.getDatabigquery.tables.createSnapshotbigquery.datasets.getbigquery.jobs.create | スナップショットを作成するテーブル。 | 有効期限を過ぎたスナップショットは削除されるため、有効期限付きのスナップショットを作成する場合は bigquery.tables.deleteSnapshot権限が必要になります。 | 
| bigquery.tables.createbigquery.tables.updateData | テーブル スナップショットを含むデータセット。 | 
ロール
必要な権限を持つ BigQuery 事前定義ロールは次のとおりです。
| ロール | リソース | メモ | 
|---|---|---|
| 次のいずれかの少なくとも 1 つ: bigquery.dataViewerbigquery.dataEditorbigquery.dataOwnerまた、次のいずれかの少なくとも 1 つ: bigquery.jobUserbigquery.studioUserbigquery.userbigquery.studioAdminbigquery.admin | スナップショットを作成するテーブル。 | 有効期限付きスナップショットの作成に使用できるのは、 bigquery.dataOwner、bigquery.admin、bigquery.studioAdminのみです。 | 
| 次のいずれかの少なくとも 1 つ: bigquery.dataEditorbigquery.dataOwnerbigquery.studioAdminbigquery.admin | 新しいテーブル スナップショットを含むデータセット。 | 
制限事項
テーブル スナップショットの制限については、テーブル スナップショットの制限事項をご覧ください。
さらに、テーブル スナップショットの作成には次の制限があります。この制限はすべてのテーブルコピー ジョブに適用されます。
- テーブル スナップショットを作成する際、その名前は、テーブルの作成時と同じ命名規則を遵守する必要があります。
- テーブル スナップショットの作成には、コピージョブに関する BigQuery の制限が適用されます。
- テーブル スナップショットのデータセットは、スナップショットの対象となるテーブルを含むデータセットと同じリージョンで、同じ組織の下に存在している必要があります。たとえば、EU ベースのデータセットに存在するテーブルのスナップショットを、US ベースのデータセットには作成できません。その代わりにテーブルのコピーを作成する必要があります。
- BigQuery では、基盤となるストレージが動的に管理されるため、テーブル スナップショットの作成にかかる時間は、異なる実行ごとに大きく変わる可能性があります。
- BigQuery CLI を使用してテーブル スナップショットを作成すると、スナップショットに宛先データセットのデフォルトの暗号鍵が含まれます。SQL を使用してテーブル スナップショットを作成する場合、スナップショットの暗号鍵はソーステーブルと同じになります。
テーブル スナップショットを作成する
テーブル スナップショットは、ベーステーブルとは異なるデータセットに作成することをおすすめします。これにより、ベーステーブルのデータセットが誤って削除された場合でも、テーブル スナップショットからベーステーブルを復元できます。
テーブル スナップショットを作成する際は、スナップショットを作成するテーブルと、テーブル スナップショットに付ける一意の名前を指定します。スナップショットの時刻とテーブル スナップショットの有効期限は、必要に応じて指定できます。
有効期限を指定したテーブル スナップショットを作成する
次のいずれかのオプションを使用して、24 時間後に期限切れになるテーブルのスナップショットを作成できます。
コンソール
- Google Cloud コンソールで、[BigQuery] ページに移動します。 
- 左側のペインで、 [エクスプローラ] をクリックします。 - 左側のペインが表示されていない場合は、 左側のペインを開くをクリックしてペインを開きます。 
- [エクスプローラ] ペインで、プロジェクトを開き、[データセット] をクリックして、データセットをクリックします。 
- [概要> テーブル] をクリックし、スナップショットを作成するテーブルの名前をクリックします。 
- 表示された詳細ペインで、[スナップショット] をクリックします。 
- 表示された [テーブル スナップショットの作成] ペインで、新しいテーブル スナップショットのプロジェクト、データセット、テーブルの情報を入力します。 
- [有効期限] フィールドに、現在から 24 時間後の日付と時刻を入力します。 
- [保存] をクリックします。 
SQL
CREATE SNAPSHOT TABLE DDL ステートメントを使用します。
- Google Cloud コンソールで、[BigQuery] ページに移動します。 
- クエリエディタで次のステートメントを入力します。 - 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 時間後の日付と時刻を表すタイムスタンプ値。
 
- [実行] をクリックします。 
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
bq
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 時間前のテーブルのテーブル スナップショットを作成できます。
コンソール
- Google Cloud コンソールで、[BigQuery] ページに移動します。 
- 左側のペインで、 [エクスプローラ] をクリックします。 
- [エクスプローラ] ペインで、プロジェクトを開き、[データセット] をクリックして、データセットをクリックします。 
- [概要> テーブル] をクリックし、スナップショットを作成するテーブルの名前をクリックします。 
- 表示された詳細ペインで、[スナップショット] をクリックします。 
- 表示された [テーブル スナップショットの作成] ペインで、新しいテーブル スナップショットのプロジェクト、データセット、テーブルの情報を入力します。 
- [スナップショット時間] フィールドに、1 時間前の日時を入力します。 
- [保存] をクリックします。 
SQL
FOR SYSTEM_TIME AS OF 句を指定したCREATE SNAPSHOT TABLE DDL ステートメントを使用します。
- Google Cloud コンソールで、[BigQuery] ページに移動します。 
- クエリエディタで次のステートメントを入力します。 - 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: スナップショットの作成元となるテーブルの名前。
 
- [実行] をクリックします。 
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
bq
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 でテーブルへのアクセスを制御するには、IAM を使用してリソースへのアクセスを制御するをご覧ください。
テーブル スナップショットを作成すると、テーブル スナップショットへのテーブルレベルのアクセス権が次のように設定されます。
- テーブル スナップショットが既存のテーブルを上書きする場合は、既存のテーブルに対するテーブルレベルのアクセスが維持されます。タグはベーステーブルからコピーされません。
- テーブルスナップショットが新しいリソースの場合、テーブル スナップショットに対するテーブルレベルのアクセスは、テーブル スナップショットが作成されるデータセットのアクセス ポリシーによって決まります。さらに、タグがベーステーブルからテーブル スナップショットにコピーされます。
次のステップ
- テーブル スナップショットの説明、有効期限、またはアクセス ポリシーを更新する。
- テーブル スナップショットを復元する。
- スケジュールされたクエリを実行するサービス アカウントを使用して、テーブルのスナップショットを毎月作成する。