データセットを管理する

このドキュメントでは、BigQuery でデータセットのコピー、別のロケーションでのデータセットの再作成、データセットの保護、データセットの削除、削除されたデータセットからのテーブルの復元を行う方法について説明します。削除されたデータセットを復元する(または削除を取り消す)方法については、削除されたデータセットを復元するをご覧ください。

BigQuery 管理者は、アナリストが使用するテーブルビューへのアクセスを整理して制御できます。データセットの詳細については、データセットの概要をご覧ください。

既存のデータセットの名前の変更や、データセットの作成後にデータセットを移動することはできません。データセット名を変更する代替手段として、データセットをコピーして、宛先データセットの名前を変更します。データセットを再配置するには、次のいずれかの方法を使用します。

必要なロール

このセクションでは、データセットの管理に必要なロールと権限について説明します。コピー元またはコピー先のデータセットが、コピーに使用するプロジェクトと同じプロジェクトにある場合、そのデータセットに対する追加の権限またはロールは必要ありません。

データセットをコピーする

データセットをコピーするには、次のロールを付与します。データセットのコピーは(ベータ版)です。

データセットのコピーに必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

  • BigQuery 管理者(roles/bigquery.admin)- コピー先プロジェクト
  • BigQuery データ閲覧者(roles/bigquery.dataViewer)- コピー元データセット
  • BigQuery データ編集者(roles/bigquery.dataEditor)- コピー先データセット

ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

これらの事前定義ロールには、データセットのコピーに必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

データセットをコピーするには次の権限が必要です。

  • コピー先プロジェクトに対する bigquery.transfers.update
  • コピー先プロジェクトに対する bigquery.jobs.create
  • コピー元とコピー先のデータセットに対する bigquery.datasets.get
  • コピー元とコピー先のデータセットに対する bigquery.tables.list
  • コピー先データセットに対する bigquery.datasets.update
  • コピー先データセットに対する bigquery.tables.create

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

データセットを削除する

データセットを削除するには、次のロールを付与します。

データセットを削除するために必要な権限を取得するには、プロジェクトに対する BigQuery データオーナーroles/bigquery.dataOwner)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

この事前定義ロールには、データセットの削除に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

データセットを削除するには次の権限が必要です。

  • プロジェクトに対する bigquery.datasets.delete
  • プロジェクトに対する bigquery.tables.delete

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

データセットをコピーする

データの抽出、移動、BigQuery への再読み込みなしに、パーティション分割データを含むデータセットをリージョン内またはリージョン間でコピーできます。BigQuery は、バックエンドで BigQuery Data Transfer Service を使用してデータセットをコピーします。データを転送する際のロケーションに関する考慮事項については、データのロケーションと転送をご覧ください。

データセット コピー構成ごとに、一度にアクティブにできる転送実行は 1 つだけです。追加の転送実行はキューに入れられます。 Google Cloud コンソールを使用している場合は、BigQuery Data Transfer Service で定期的なコピーをスケジュールし、メールまたは Pub/Sub 通知を構成できます。

制限事項

データセットをコピーする場合は、次の制限事項が適用されます。

  • ソース データセットから次のリソースはコピーできません。

    • ビュー。
    • ルーティン(UDF など)。
    • 外部テーブル。
    • コピージョブがリージョン間で存在する場合、変更データ キャプチャ(CDC)テーブル。同じリージョン内での CDC テーブルのコピーがサポートされています。
    • 宛先データセットが CMEK で暗号化されておらず、CMEK が指定されていない場合、顧客管理の暗号鍵(CMEK)で暗号化されたテーブルでは、リージョンをまたぐテーブルのコピージョブはサポートされません。デフォルトの暗号化を使用したテーブルは、リージョンをまたいでコピーできます。

      CMEK で暗号化されたテーブルを含む、同じリージョン内のすべての暗号化されたテーブルをコピーできます。

  • 次のリソースをコピージョブの宛先データセットとして使用することはできません。

    • 書き込みに最適化されたストレージ。
    • データセットが CMEK で暗号化されている場合(コピージョブがリージョン間で行われ、ソーステーブルが CMEK で暗号化されていない場合)。

      ただし、CMEK で暗号化されたテーブルは、同じリージョン内でコピーする場合、宛先テーブルとして使用できます。

  • コピージョブ間の最小頻度は 12 時間です。

  • 宛先データセット内のパーティション分割テーブルまたはパーティション分割なしのテーブルへのデータの追加はサポートされていません。ソーステーブルに変更がない場合、テーブルはスキップされます。ソーステーブルが更新されると、宛先テーブルは完全に切り捨てられて置き換えられます。

  • ソース データセットと宛先データセットにテーブルが存在し、ソーステーブルが最後にコピーが成功してから変更されていない場合、そのテーブルはスキップされます。[宛先テーブルを上書きする] チェックボックスが選択されていたとしても、ソーステーブルはスキップされます。

  • 宛先データセット内のテーブルを切り捨てる場合、データセット コピージョブはコピージョブを開始する前に、宛先データセット内のリソースに加えられた変更を検出しません。データセットのコピージョブは、宛先データセットのすべてのデータ(テーブルとスキーマの両方を含む)を上書きします。

  • 宛先テーブルには、コピージョブの開始後にソーステーブルに加えられた変更が反映されない場合があります。

  • BigQuery Omni リージョンでは、データセットのコピーはサポートされていません。

  • データセットを別の VPC Service Controls サービス境界のプロジェクトにコピーするには、次の下り(外向き)ルールを設定する必要があります。

    • 宛先プロジェクトの VPC Service Controls サービス境界構成で、IAM プリンシパルに次のメソッドが必要です。

      • bigquery.datasets.get
      • bigquery.tables.list
      • bigquery.tables.get
      • bigquery.tables.getData
    • ソース プロジェクトの VPC Service Controls サービス境界構成で、使用する IAM プリンシパルのメソッドを All Methods に設定する必要があります。

  • 所有していないデータセット コピー転送構成を更新しようとすると、更新が失敗し、次のエラー メッセージが表示されることがあります。

    Cannot modify restricted parameters without taking ownership of the transfer configuration.

    データセット コピーのオーナーは、データセット コピーに関連付けられているユーザー、またはデータセット コピーに関連付けられているサービス アカウントへのアクセス権を持つユーザーです。関連付けられたユーザーは、データセット コピーの構成の詳細で確認できます。データセット コピーを更新して所有権を取得する方法については、認証情報を更新するをご覧ください。ユーザーにサービス アカウントへのアクセス権を付与するには、サービス アカウント ユーザーロールが必要です。

    データセット コピーの所有者制限付きパラメータは次のとおりです。

    • ソース プロジェクト
    • ソース データセット
    • 宛先データセット
    • 宛先テーブルの上書き設定
  • リージョン間のテーブルコピーの制限事項がすべて適用されます。

データセットをコピーする

次のオプションのいずれかを選択します。

コンソール

  1. 宛先データセットに対して BigQuery Data Transfer Service を有効にします。

    BigQuery Data Transfer Service API を有効にする

  2. 必要なロールがあることを確認します。

    Pub/Sub の転送実行通知を設定する場合は(これらの手順の後述のオプション 2)、pubsub.topics.setIamPolicy 権限が必要です。

    メール通知のみを設定する場合は、Pub/Sub 権限は必要ありません。詳細については、BigQuery Data Transfer Service の実行通知をご覧ください。

  3. ソース データセットと同じリージョンまたは別のリージョンに BigQuery データセットを作成します。

オプション 1: BigQuery のコピー関数を使用する

1 回限りの転送を作成するには、BigQuery のコピー関数を使用します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. 左側のペインで、 [エクスプローラ] をクリックします。

    エクスプローラ ペインのボタンがハイライト表示されている。

    左側のペインが表示されていない場合は、[ 左ペインを開く] をクリックしてペインを開きます。

  3. [エクスプローラ] ペインでプロジェクトを開き、[データセット] をクリックして、データセットを選択します。

  4. [データセット情報] セクションで、[ コピー] をクリックし、次の操作を行います。

    1. [データセット] フィールドで、新しいデータセットを作成するか、リストから既存のデータセット ID を選択します。

      プロジェクト内のデータセット名は一意である必要があります。プロジェクトとデータセットは異なるリージョンに存在していてもかまいませんが、リージョンを越えたコピーができるのは一部のリージョンのみに限られます。

      [ロケーション] フィールドに、ソース データセットのロケーションが表示されます。

    2. 省略可: 宛先テーブルのデータとスキーマの両方をソーステーブルで上書きするには、[宛先テーブルを上書きする] チェックボックスをオンにします。ソースと宛先の両方のテーブルは、同じパーティショニング スキーマを持つ必要があります。

    3. データセットをコピーするには、[コピー] をクリックします。

オプション 2: BigQuery Data Transfer Service を使用する

定期的なコピーをスケジュールし、メールまたは Pub/Sub 通知を構成するには、宛先プロジェクトの Google Cloud コンソールで BigQuery Data Transfer Service を使用します。

  1. [データ転送] ページに移動します。

    [データ転送] に移動

  2. [転送を作成] をクリックします。

  3. [ソース] リストで、[データセット コピー] を選択します。

  4. [表示名] フィールドに、転送実行の名前を入力します。

  5. [スケジュール オプション] セクションで、次の操作を行います。

    1. [繰り返しの頻度] で、転送を実行する頻度のオプションを選択します。

      [カスタム] を選択した場合は、カスタム頻度(たとえば、every day 00:00)を入力します。詳細については、スケジュールのフォーマットをご覧ください。

    2. [開始日と実行時間] に、転送を開始する日付と時刻を入力します。[すぐに開始可能] を選択した場合、このオプションは無効になります。

  6. [転送先の設定] セクションで、転送データを保存する宛先データセットを選択します。[新しいデータセットの作成] をクリックして、この転送用に選択する前に新しいデータセットを作成することもできます。

  7. [データソースの詳細] に、次の情報を入力します。

    1. [ソース データセット] に、コピーするデータセット ID を入力します。
    2. [ソース プロジェクト] に、ソースデータセットのプロジェクト ID を入力します。
  8. 宛先テーブルのデータとスキーマの両方をソーステーブルで上書きするには、[宛先テーブルを上書きする] チェックボックスをオンにします。ソースと宛先の両方のテーブルは、同じパーティショニング スキーマを持つ必要があります。

  9. [サービス アカウント] メニューで、Google Cloud プロジェクトに関連付けられているサービス アカウントからサービス アカウントを選択します。ユーザー認証情報を使用する代わりに、サービス アカウントを転送に関連付けることができます。データ転送でサービス アカウントを使用する方法の詳細については、サービス アカウントの使用をご覧ください。

    • フェデレーション ID でログインした場合、転送を作成するにはサービス アカウントが必要です。Google アカウントでログインした場合、転送用のサービス アカウントは省略可能です。
    • サービス アカウントには必要なロールが付与されている必要があります。
  10. 省略可: [通知オプション] セクションで、次のようにします。

    • メール通知を有効にするには、切り替えボタンをクリックします。このオプションを有効にすると、転送の実行が失敗した場合、転送構成のオーナーがメール通知を受信します。
    • Pub/Sub 通知を有効にするには、切り替えボタンをクリックしてから、リストからトピック名を選択するか、トピックを作成するをクリックするかします。このオプションで、Pub/Sub の転送実行通知を構成します。
  11. [保存] をクリックします。

bq

  1. 宛先データセットに対して BigQuery Data Transfer Service を有効にします。

  2. 必要なロールがあることを確認します。

  3. BigQuery データセットを作成するには、データセット作成フラグ --datasetlocation フラグとともに bq mk コマンドを使用します。

    bq mk \
      --dataset \
      --location=LOCATION \
      PROJECT:DATASET

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

    • LOCATION: データセットをコピーするロケーション
    • PROJECT: ターゲット データセットのプロジェクト ID
    • DATASET: ターゲット データセットの名前
  4. データセットをコピーするには、転送作成フラグ --transfer_config--data_source フラグとともに bq mk コマンドを使用します。--data_source フラグを cross_region_copy に設定する必要があります。--data_source フラグの有効な値の一覧については、bq コマンドライン ツール リファレンスの transfer-config フラグをご覧ください。

    bq mk \
      --transfer_config \
      --project_id=PROJECT \
      --data_source=cross_region_copy \
      --target_dataset=DATASET \
      --display_name=NAME \
     --service_account_name=SERCICE_ACCOUNT \
      --params='PARAMETERS'

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

    • NAME: コピージョブまたは転送構成の表示名

    • SERVICE_ACCOUNT: 転送の認証に使用されるサービス アカウント名。サービス アカウントは、転送の作成に使用した project_id が所有している必要があります。また、必要な権限がすべて付与されている必要があります。

    • PARAMETERS: 転送構成のパラメータ(JSON 形式)

      データセット コピー構成のパラメータは次のものを含みます。

      • source_dataset_id: コピーするソース データセットの ID
      • source_project_id: ソース データセットがあるプロジェクトの ID
      • overwrite_destination_table: 前のコピーのテーブルを切り捨て、すべてのデータを更新できるオプションのフラグ

      ソースと宛先の両方のテーブルは、同じパーティショニング スキーマを持つ必要があります。

    次の例は、システムの環境に基づいたパラメータの形式を示しています。

    • Linux: 単一引用符を使用して JSON 文字列を囲みます。次に例を示します。

      '{"source_dataset_id":"mydataset","source_project_id":"mysourceproject","overwrite_destination_table":"true"}'
      
    • Windows コマンドライン: 二重引用符を使用して JSON 文字列を囲み、文字列内の二重引用符をバックスラッシュでエスケープします。次に例を示します。

      "{\"source_dataset_id\":\"mydataset\",\"source_project_id\":\"mysourceproject\",\"overwrite_destination_table\":\"true\"}"
      
    • PowerShell: 単一引用符を使用して JSON 文字列を囲み、文字列内の二重引用符をバックスラッシュでエスケープします。次に例を示します。

      '{\"source_dataset_id\":\"mydataset\",\"source_project_id\":\"mysourceproject\",\"overwrite_destination_table\":\"true\"}'
      

    たとえば、次のコマンドは、mydataset というターゲット データセットと ID が myproject のプロジェクトを使用して My Transfer という名前のデータセット コピー構成を作成します。

    bq mk \
      --transfer_config \
      --project_id=myproject \
      --data_source=cross_region_copy \
      --target_dataset=mydataset \
      --display_name='My Transfer' \
      --params='{
          "source_dataset_id":"123_demo_eu",
          "source_project_id":"mysourceproject",
          "overwrite_destination_table":"true"
          }'

API

  1. 宛先データセットに対して BigQuery Data Transfer Service を有効にします。

  2. 必要なロールがあることを確認します。

  3. BigQuery データセットを作成するには、定義済みのデータセット リソースを指定して datasets.insert メソッドを呼び出します。

  4. データセットをコピーするには、projects.locations.transferConfigs.create メソッドを使用し、TransferConfig リソースのインスタンスを提供します。

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.CreateTransferConfigRequest;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.ProjectName;
import com.google.cloud.bigquery.datatransfer.v1.TransferConfig;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

// Sample to copy dataset from another gcp project
public class CopyDataset {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String destinationProjectId = "MY_DESTINATION_PROJECT_ID";
    final String destinationDatasetId = "MY_DESTINATION_DATASET_ID";
    final String sourceProjectId = "MY_SOURCE_PROJECT_ID";
    final String sourceDatasetId = "MY_SOURCE_DATASET_ID";
    Map<String, Value> params = new HashMap<>();
    params.put("source_project_id", Value.newBuilder().setStringValue(sourceProjectId).build());
    params.put("source_dataset_id", Value.newBuilder().setStringValue(sourceDatasetId).build());
    TransferConfig transferConfig =
        TransferConfig.newBuilder()