データセットのコピー

データを抽出して移動してから BigQuery に再読み込みしなくても、データセットを同じリージョン内で、またはあるリージョンから別のリージョンにコピーできます。1 回だけコピーすることはもちろん、任意に指定した定期的なスケジュールでコピーすることも可能です。

割り当てと上限

BigQuery データセットのコピーには、次の割り当てと制限が適用されます。

コピーの割り当て

データセットをコピーするには、データセット内のテーブルごとに 1 つのコピージョブが必要です。

テーブルのコピーに関する BigQuery ジョブには、次の上限が適用されます。各上限は、bq コマンドライン ツール、Cloud Console、または copy-type の jobs.insert API メソッドで作成されたジョブに適用されます。成功か失敗かに関係なく、すべてのコピージョブがこの上限にカウントされます。

上限 デフォルト
宛先テーブルごとの 1 日あたりコピージョブ数 1 日のテーブル オペレーションをご覧ください。
1 日あたりのコピージョブ数 100,000 ジョブ 1 日あたりプロジェクトで最大 100,000 個のコピージョブを実行できます。
宛先テーブルあたりの 1 日のリージョン間コピージョブの数 100 ジョブ プロジェクトでは、宛先テーブルに対して 1 日あたり 100 個までのリージョン間コピージョブを実行できます。
1 日あたりのリージョン間コピージョブ 2,000 ジョブ プロジェクトで 1 日あたり最大 2,000 件のリージョン間コピージョブを実行できます。

データセットのコピーには、以下の上限が適用されます。

上限 デフォルト
コピー元データセット内の最大テーブル数 20,000 個のテーブル コピー元データセットには、最大 20,000 個のテーブルを含めることができます。
実行ごとに同じリージョン内の宛先データセットにコピーできる最大テーブル数 20,000 個のテーブル プロジェクトでは、同じリージョンにある宛先データセットに、実行あたり 20,000 個のテーブルをコピーできます。
実行間で別のリージョンの宛先データセットにコピーできる最大テーブル数 1,000 個のテーブル 実行ごとに 1,000 個のテーブルを異なるリージョンの宛先データセットにコピーできます。8,000 個のテーブルを含むデータセットのリージョン間コピーを構成すると、BigQuery Data Transfer Service により 8 個の実行単位が順次自動的に作成されます。最初の実行で 1,000 個のテーブルがコピーされます。24 時間後の 2 回目の実行で 1,000 個のテーブルがコピーされます。このプロセスは、データセット内のすべてのテーブルがコピーされるまで(データセットあたり最大 20,000 個のテーブルがコピーされるまで)継続されます。

詳細については、コピージョブをご覧ください。

一般的な制限事項

  • データセット コピーの転送構成を作成する前に、コピー先データセットを作成する必要があります。

  • データセット コピー構成ごとに、一度にアクティブにできるコピーは 1 つだけです。追加の転送実行はキューに入れられます。

データ型の制限

  • ビューのコピーはサポートされていません。
  • 外部テーブルのコピーはサポートされていません。
  • ストリーミング バッファ内のストレージのコピーはサポートされていません。
  • 顧客管理の暗号鍵で暗号化されたテーブルをコピーできるかどうかは、同じリージョン内でコピーするか異なるリージョン間でコピーするかによって異なります。

リージョン内

同じリージョン内でデータセットをコピーする場合は、顧客管理の暗号鍵(CMEK)で暗号化されたテーブルを含む暗号化されたテーブルをコピーできます。

リージョン間

デフォルトの暗号化を使用したテーブルについては、リージョン間でコピーできます。現時点では、顧客管理の暗号鍵(CMEK)で暗号化されたテーブルをリージョン間でコピーすることはできません。コピー先データセットにテーブルをコピーするときに、CMEK で暗号化されたテーブルはスキップされます。

宛先データセットの制限事項

顧客管理の暗号鍵(CMEK)を持つデータセットは、リージョン間でコピーするときに宛先として使用できません。ただし、CMEK を含むテーブルは、リージョン内でコピーする場合の宛先として使用できます。

テーブルの制限事項

  • パーティション分割テーブルのコピーは現在サポートされています。ただし、パーティション分割テーブルへのデータの追加はサポートされていません。

  • コピー元データセットとコピー先データセットにある同じテーブルの内容が、最後にコピーが成功してから変更されていない場合、そのテーブルはスキップされます。これは、[コピー先テーブルを上書きする] ボックスがチェックされている場合でも同様です。

  • テーブルを切り捨てる場合は、データセットのコピーが開始される前に、コピー先データセットに加えられた変更は確認されません。コピー先データセット内のすべてのデータが更新(上書き)されます。テーブルとスキーマの両方が上書きされます。

    • overwrite_destination_table フラグを使ってコピー時にコピー先のテーブルを上書きする場合は、どちらのテーブルにも同じパーティショニング スキーマが必要です。

始める前に

データセットのコピーを作成する前に、次のことを行います。

  • データセットのコピーには、BigQuery Data Transfer Service の機能を使用します。宛先データセットの Google Cloud プロジェクトで、BigQuery Data Transfer Service の有効化に必要なすべての操作が完了していることを確認します。
  • コピー先データセットとして、コピー元データセットと同じリージョンまたは異なるリージョンに BigQuery データセットを作成します。データセットの作成時に、BigQuery データを保存するロケーションを指定します。データセットのコピーができるリージョンはまだ限られています(サポートされているリージョンをご覧ください)。データセット名はプロジェクトごとに一意である必要があります。
  • コピー元のデータセットの ID と、コピー元のプロジェクトの ID を探します。
  • Pub/Sub の転送実行通知を設定する場合は、pubsub.topics.setIamPolicy 権限が必要です。メール通知を設定するだけの場合、Pub/Sub の権限は必要ありません。詳細については、BigQuery Data Transfer Service の実行通知をご覧ください。
  • overwrite_destination_table フラグを使ってコピー時にコピー先のテーブルを上書きする場合は、どちらのテーブルにも同じパーティショニング スキーマが必要です。
  • このドキュメントの各タスクを実行するために必要な権限をユーザーに与える Identity and Access Management(IAM)のロールを付与します。

必要な権限

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

  • コピー転送を作成するには、プロジェクトに対する次の権限が必要です。

    • bigquery.transfers.update
    • bigquery.jobs.create
  • コピー元データセットでは、次のものが必要です。

    • bigquery.datasets.get
    • bigquery.tables.list
  • コピー先データセットでは、次のものが必要です。

    • bigquery.datasets.get
    • bigquery.datasets.update
    • bigquery.tables.create
    • bigquery.tables.list

IAM 事前定義ロール roles/bigquery.admin には、データセットのコピーを作成するために必要な権限が含まれています。

BigQuery での IAM ロールの詳細については、事前定義ロールと権限または IAM 権限のリファレンスをご覧ください。

データセットのコピーの設定

データセットのコピーを作成するには:

Console

オプション 1: [コピー] ボタンを使用する。

  1. Cloud Console の BigQuery ページに移動します。

    BigQuery ページに移動

  2. [エクスプローラ] パネルでプロジェクトを開いて、データセットを選択します。

  3. アクション オプションを開いて、[開く] をクリックします。

  4. [コピー] をクリックします。表示された [データセットをコピー] ダイアログで、次の操作を行います。

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

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

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

    3. 省略可: コピー先テーブルのデータとスキーマの両方をコピー元テーブルで上書きするには、[コピー先テーブルを上書きする] チェックボックスをオンにします。

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

余分なストレージ コストがかからないようにするため、古いデータセットを削除することを検討してください。

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

  1. BigQuery Data Transfer Service を有効にします
  2. データソースの転送を作成します

bq

bq mk コマンドを入力して、転送作成フラグ --transfer_config を指定します。次のフラグも必要です。

  • --project_id
  • --data_source
  • --target_dataset
  • --display_name
  • --params

    bq mk --transfer_config --project_id=PROJECT_ID --data_source=cross_region_copy --target_dataset=DATASET --display_name=NAME --params='PARAMETERS'
    

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

  • PROJECT_ID: Google Cloud プロジェクト ID。--project_id を指定しない場合は、デフォルトのプロジェクトが使用されます。
  • DATASET: 転送構成の BigQuery ターゲット データセット。
  • NAME: コピージョブ(転送構成)の表示名。転送名には、後で修正が必要になった場合に簡単に識別できる任意の名前を使用できます。
  • PARAMETERS には、作成される転送構成のパラメータを JSON 形式で指定します(例: --params='{"param":"param_value"}')。データセットをコピーする場合は source_dataset_id パラメータと source_project_id パラメータを指定する必要があり、必要に応じて overwrite_destination_table パラメータを指定します。

データセット コピー構成のパラメータは次のとおりです。

  • source_dataset_id: コピーするデータセットの ID。
  • source_project_id: コピー元データセットがあるプロジェクトの ID。
  • (省略可)overwrite_destination_table: 以前のコピーのテーブルを切り捨て、すべてのデータを更新する場合は、このパラメータを使用します。

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

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

bq mk コマンドの詳細については、コマンドライン ツール リファレンスをご覧ください。

API

projects.locations.transferConfigs.create メソッドを使用して、TransferConfig リソースのインスタンスを指定します。

Java

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

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()
            .setDestinationDatasetId(destinationDatasetId)
            .setDisplayName("Your Dataset Copy Name")
            .setDataSourceId("cross_region_copy")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .setSchedule("every 24 hours")
            .build();
    copyDataset(destinationProjectId, transferConfig);
  }

  public static void copyDataset(String projectId, TransferConfig transferConfig)
      throws IOException {
    try (DataTransferServiceClient dataTransferServiceClient = DataTransferServiceClient.create()) {
      ProjectName parent = ProjectName.of(projectId);
      CreateTransferConfigRequest request =
          CreateTransferConfigRequest.newBuilder()
              .setParent(parent.toString())
              .setTransferConfig(transferConfig)
              .build();
      TransferConfig config = dataTransferServiceClient.createTransferConfig(request);
      System.out.println("Copy dataset created successfully :" + config.getName());
    } catch (ApiException ex) {
      System.out.print("Copy dataset was not created." + ex.toString());
    }
  }
}

Python

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

pip install google-cloud-bigquery-datatransfer を使用して BigQuery Data Transfer API 用の Python クライアントをインストールします。次に、データセットをコピーするための転送構成を作成します。
from google.cloud import bigquery_datatransfer

transfer_client = bigquery_datatransfer.DataTransferServiceClient()

destination_project_id = "my-destination-project"
destination_dataset_id = "my_destination_dataset"
source_project_id = "my-source-project"
source_dataset_id = "my_source_dataset"
transfer_config = bigquery_datatransfer.TransferConfig(
    destination_dataset_id=destination_dataset_id,
    display_name="Your Dataset Copy Name",
    data_source_id="cross_region_copy",
    params={
        "source_project_id": source_project_id,
        "source_dataset_id": source_dataset_id,
    },
    schedule="every 24 hours",
)
transfer_config = transfer_client.create_transfer_config(
    parent=transfer_client.common_project_path(destination_project_id),
    transfer_config=transfer_config,
)
print(f"Created transfer config: {transfer_config.name}")

データセット コピージョブの表示と更新

[データ転送] でデータセット コピーの進行状況と詳細を見るには、次の操作を行います。

  1. Cloud Console で、BigQuery ページに移動します。

    BigQuery ページに移動

  2. [データ転送] をクリックします。

  3. 詳細を表示する転送を選択します。

    1. [転送の詳細] ページで、転送実行を選択します。

    2. 更新するには、[その他] > [転送を更新] をクリックします。

料金

データセットのコピーは、ベータ期間中は無料で利用できます。

一般提供になると、リージョンまたはマルチリージョン間のデータのコピーで、下り(外向き)データに対して費用が発生します。料金は BigQuery データ抽出の料金と同じです。同じリージョン内またはマルチリージョン内でのデータセットのコピーは無料です。

同じリージョン(またはマルチリージョン)内のデータセットをコピーしても、下り(外向き)料金はかかりません。リージョン間でデータセットをコピーする場合(またはリージョンとマルチリージョン間でデータセットをコピーする場合)は、下り(外向き)料金が発生します。

リージョン間のコピーではデータを圧縮して送信するため、課金される GB 数はデータセットのサイズより小さくなる場合があります。

詳しくは、BigQuery の料金をご覧ください。

サポートされるリージョン

ロケーションには、2 つの種類があります。

  • リージョンは、ロンドンなどの特定の地理的な場所となります。

  • マルチリージョンは、米国などの、2 つ以上の地理的な場所を含む広い地理的なエリアとなります。

データセットのコピーは、リージョンからリージョン、単一リージョンからマルチリージョン、マルチリージョンから単一リージョン、マルチリージョンからマルチリージョンに対して行うことができます。

現在、データセットのコピーができるリージョンは限られています。以下に示すように、データセットのコピーは BigQuery Data Transfer Service が現在サポートされているリージョンでのみ作成できます。

リージョンのロケーション

リージョンの説明 リージョン名
南北アメリカ
アイオワ us-central1 リーフアイコン 低 CO2
ラスベガス us-west4
ロサンゼルス us-west2
モントリオール northamerica-northeast1 リーフアイコン 低 CO2
北バージニア us-east4
オレゴン us-west1 リーフアイコン 低 CO2
ソルトレイクシティ us-west3
サンパウロ southamerica-east1 リーフアイコン 低 CO2
サンティアゴ southamerica-west1
サウスカロライナ us-east1
トロント northamerica-northeast2
ヨーロッパ
ベルギー europe-west1 リーフアイコン 低 CO2
フィンランド europe-north1 リーフアイコン 低 CO2
フランクフルト europe-west3
ロンドン europe-west2
オランダ europe-west4
ワルシャワ europe-central2
チューリッヒ europe-west6 リーフアイコン 低 CO2
アジア太平洋
デリー asia-south2
香港 asia-east2
ジャカルタ asia-southeast2
メルボルン australia-southeast2
ムンバイ asia-south1
大阪 asia-northeast2
ソウル asia-northeast3
シンガポール asia-southeast1
シドニー australia-southeast1
台湾 asia-east1
東京 asia-northeast1

マルチリージョン

マルチリージョンの説明 マルチリージョン名
欧州連合の加盟国内のデータセンター1 EU
米国内のデータセンター US

1 EU マルチリージョン内のデータは europe-west2(ロンドン)や europe-west6(チューリッヒ)のデータセンターには保存されません。

データセットのセキュリティ

BigQuery でデータセットへのアクセスを制御するには、データセットへのアクセスの制御をご覧ください。データ暗号化の詳細については、保存データの暗号化をご覧ください。

次のステップ

  • 転送構成に関する情報の取得、転送構成の一覧表示、転送の実行履歴の表示など、転送の使用方法の詳細については、転送の操作をご覧ください。