テーブル スナップショットを作成する
このドキュメントでは、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.dataOwner 、bigquery.admin 、bigquery.studioAdmin のみです。 |
次のいずれかの少なくとも 1 つ:bigquery.dataEditor bigquery.dataOwner bigquery.studioAdmin bigquery.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 でテーブルへのアクセスを制御するには、テーブルのアクセス制御の概要をご覧ください。
テーブル スナップショットを作成すると、テーブル スナップショットへのテーブルレベルのアクセス権が次のように設定されます。
- テーブル スナップショットが既存のテーブルを上書きする場合は、既存のテーブルに対するテーブルレベルのアクセスが維持されます。タグはベーステーブルからコピーされません。
- テーブルスナップショットが新しいリソースの場合、テーブル スナップショットに対するテーブルレベルのアクセスは、テーブル スナップショットが作成されるデータセットのアクセス ポリシーによって決まります。さらに、タグがベーステーブルからテーブル スナップショットにコピーされます。
次のステップ
- テーブル スナップショットの説明、有効期限、またはアクセス ポリシーを更新する。
- テーブル スナップショットを復元する。
- スケジュールされたクエリを実行するサービス アカウントを使用して、テーブルのスナップショットを毎月作成する。