管理数据集

本文档介绍如何在 BigQuery 中复制数据集、在其他位置重新创建数据集、保护数据集、删除数据集、恢复已删除数据集中的表以及恢复删除的数据集。

作为 BigQuery 管理员,您可以整理和控制分析师使用的视图的访问权限。如需详细了解数据集,请参阅数据集简介

您无法在现有数据集创建后更改其名称或迁移其位置。 如需更改数据集名称的解决方法,您可以复制数据集并更改目标数据集的名称。如需迁移数据集,您可以采用以下方法之一:

所需的角色

本部分介绍管理数据集所需的角色和权限。如果源数据集或目标数据集与您用于复制的数据集位于同一项目中,则您不需要针对该数据集的额外权限或角色。

如需获得管理数据集所需的权限,请让您的管理员为您授予以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

这些预定义角色可提供管理数据集所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

您必须拥有以下权限才能管理数据集:

  • 复制数据集:
    • 针对目标项目的 bigquery.transfers.update 权限
    • 针对目标项目的 bigquery.jobs.create 权限
    • 针对源数据集和目标数据集的 bigquery.datasets.get 权限
    • 针对源数据集和目标数据集的 bigquery.tables.list 权限
    • 对于目标数据集的 bigquery.datasets.update 权限
    • 对于目标数据集的 bigquery.tables.create 权限
  • 删除数据集:
    • 针对项目的 bigquery.datasets.delete 权限
    • 针对项目的 bigquery.tables.delete 权限
  • 恢复已删除的数据集:
    • 针对项目的 bigquery.datasets.create 权限
    • 针对数据集的 bigquery.datasets.get 权限

您也可以使用自定义角色或其他预定义角色来获取这些权限。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅 IAM 简介

复制数据集

您可以复制数据集(包括一个区域内或跨区域的分区数据),而无需提取、移动数据或将数据重新加载到 BigQuery。BigQuery 使用后端中的 BigQuery Data Transfer Service 复制数据集。如需了解转移数据时的位置注意事项,请参阅数据位置和转移

每个数据集副本配置一次只能有一个活动的转移作业运行。其他转移作业运行会被排入队列。如果您使用的是 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

复制数据集

从下列选项中选择一项:

控制台

  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 复制函数

如需创建一次性转移作业,请使用 BigQuery 复制函数:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器面板中,展开您的项目并选择数据集。

  3. 数据集信息部分中,点击 复制,然后执行以下操作:

    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 项目关联的服务账号中选择一个服务账号。您可以将服务账号与转移作业相关联,而不是使用用户凭据。如需详细了解如何将服务账号用于数据转移,请参阅使用服务账号

    • 如果您使用联合身份登录,则需要有服务账号才能创建转移作业。如果您使用 Google 账号登录,则转移作业的服务账号是可选的。
    • 服务账号必须具有所需的角色
  10. 可选:在通知选项部分中,执行以下操作:

    • 要启用电子邮件通知,请点击切换开关。启用此选项后,转移作业配置的所有者会在转移作业运行失败时收到电子邮件通知。
    • 如需启用 Pub/Sub 通知,请点击切换开关,然后从列表中选择主题名称,或点击创建主题。此选项用于为您的转移作业配置 Pub/Sub 运行通知
  11. 点击保存

bq

  1. 为目标数据集启用 BigQuery Data Transfer Service

  2. 确保您拥有所需的角色

  3. 如需创建 BigQuery 数据集,请使用 bq mk 命令 并添加数据集创建标志 --datasetlocation 标志:

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

    请替换以下内容:

    • LOCATION:您要复制数据集的位置
    • PROJECT:目标数据集的项目 ID
    • DATASET:目标数据集的名称
  4. 如需复制数据集,请使用 --transfer_config 命令并添加转移作业创建标志 --data_sourcebq 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\"}'
      

    例如,以下命令会创建名为 My Transfer 的数据集副本配置,其中目标数据集名为 mydataset,项目 ID 为 myproject

    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()
            .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 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

使用 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}")

为了避免产生额外的存储费用,请考虑删除之前的数据集

查看数据集复制作业

如需在 Google Cloud 控制台中查看数据集复制作业的状态和详细信息,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到数据传输页面。

    转到“数据传输”

  2. 根据要查看哪个传输作业的详细信息选择转移作业,然后执行以下操作:

    1. 转移作业详情页面上,选择转移作业运行。

    2. 如需刷新,请点击 刷新

在其他位置重新创建数据集

如需手动将数据集从一个位置移动到另一个位置,请按照以下步骤操作:

  1. 数据从 BigQuery 表导出到数据集所在位置中的 Cloud Storage 存储桶或数据集内某个位置中的 Cloud Storage 存储桶。例如,如果数据集位于 EU 多区域位置,则可以将数据导出到位于欧盟内的 europe-west1 比利时位置。

    从 BigQuery 导出数据不会产生费用,但是将导出的数据存储在 Cloud Storage 中会产生费用。BigQuery 导出操作需要遵循导出作业的相关限制。

  2. 将数据从导出 Cloud Storage 存储桶复制或移动到您在目标位置创建的新存储桶。例如,如果您要将数据从 US 多区域移动到 asia-northeast1 东京区域,则需要将数据转移到您在东京创建的存储桶。如需了解如何转移 Cloud Storage 对象,请参阅 Cloud Storage 文档中的复制、重命名和移动对象

    在区域之间转移数据会在 Cloud Storage 中产生网络出站流量费用

  3. 在新位置创建新的 BigQuery 数据集,然后将数据从 Cloud Storage 存储桶加载到新数据集。

    您不需要为将数据加载到 BigQuery 而付费,但在删除数据或存储桶之前,您需要为在 Cloud Storage 中存储数据支付费用。数据加载完毕后,在 BigQuery 中存储数据也须支付费用。将数据加载到 BigQuery 会受到加载作业限制。

您还可以使用 Cloud Composer 以编程方式移动和复制大型数据集。

如需详细了解如何使用 Cloud Storage 存储和移动大型数据集,请参阅使用 Cloud Storage 处理大数据

保护数据集

如需控制对 BigQuery 中数据集的访问权限,请参阅控制对数据集的访问权限。 如需了解数据加密,请参阅静态加密

删除数据集

使用 Google Cloud 控制台删除数据集时,数据集中的表和视图(包括其数据)也会随之一起删除。使用 bq 命令行工具删除数据集时,您必须使用 -r 标志删除表和视图。

如需删除数据集,请选择以下选项之一:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器窗格中,展开您的项目,然后选择数据集。

  3. 展开 操作选项,然后点击删除

  4. 删除数据集对话框中,在字段中输入 delete,然后点击删除

SQL

如需删除数据集,请使用 DROP SCHEMA DDL 语句

以下示例会删除名为 mydataset 的数据集:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    DROP SCHEMA IF EXISTS mydataset;

    默认情况下,此方法仅适用于删除空数据集。如需删除数据集及其所有内容,请使用 CASCADE 关键字:

    DROP SCHEMA IF EXISTS mydataset CASCADE;

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

使用 bq rm 命令 并根据需要添加 --dataset-d 标志。如果数据集包含表,您必须使用 -r 标志移除数据集中的所有表。如果使用 -r 标志,则可以省略 --dataset-d 标志。

运行该命令后,系统会要求确认。您可以使用 -f 标志跳过确认。

如果您要删除非默认项目中的表,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET

bq rm -r -f -d PROJECT_ID:DATASET

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • DATASET:您要删除的数据集的名称

示例

输入以下命令可从默认项目中移除名为 mydataset 的数据集以及其中的所有表。该命令使用 -d 标志。

bq rm -r -d mydataset

出现提示时,请输入 y 并按 Enter 键。

输入以下命令可从 myotherproject 中移除 mydataset 及其所含的全部表。该命令未选用 -d 标志。-f 标志用于跳过确认。

bq rm -r -f myotherproject:mydataset

您可以使用 bq ls 命令确认数据集已删除。

API

调用 datasets.delete 方法来删除数据集,并将 deleteContents 参数设置为 true 来删除其中所含的表。

C#

以下代码示例会删除空数据集。

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 C# 设置说明进行操作。 如需了解详情,请参阅 BigQuery C# API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

使用 pip install google-cloud-bigquery-datatransfer 安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。

using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryDeleteDataset
{
    public void DeleteDataset(
        string projectId = "your-project-id",
        string datasetId = "your_empty_dataset"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        // Delete a dataset that does not contain any tables
        client.DeleteDataset(datasetId: datasetId);
        Console.WriteLine($"Dataset {datasetId} deleted.");
    }
}

以下代码示例会删除数据集及其所有内容:

// Copyright(c) 2018 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
//

using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryDeleteDatasetAndContents
{
    public void DeleteDatasetAndContents(
        string projectId = "your-project-id",
        string datasetId = "your_dataset_with_tables"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        // Use the DeleteDatasetOptions to delete a dataset and its contents
        client.DeleteDataset(
            datasetId: datasetId,
            options: new DeleteDatasetOptions() { DeleteContents = true }
        );
        Console.WriteLine($"Dataset {datasetId} and contents deleted.");
    }
}

Go

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

使用 pip install google-cloud-bigquery-datatransfer 安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// deleteDataset demonstrates the deletion of an empty dataset.
func deleteDataset(projectID, datasetID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	ctx := context.Background()

	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	// To recursively delete a dataset and contents, use DeleteWithContents.
	if err := client.Dataset(datasetID).Delete(ctx); err != nil {
		return fmt.Errorf("Delete: %v", err)
	}
	return nil
}

Java

以下代码示例会删除空数据集。

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

使用 pip install google-cloud-bigquery-datatransfer 安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQuery.DatasetDeleteOption;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.DatasetId;

public class DeleteDataset {

  public static void runDeleteDataset() {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    deleteDataset(projectId, datasetName);
  }

  public static void deleteDataset(String projectId, String datasetName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      DatasetId datasetId = DatasetId.of(projectId, datasetName);
      boolean success = bigquery.delete(datasetId, DatasetDeleteOption.deleteContents());
      if (success) {
        System.out.println("Dataset deleted successfully");
      } else {
        System.out.println("Dataset was not found");
      }
    } catch (BigQueryException e) {
      System.out.println("Dataset was not deleted. \n" + e.toString());
    }
  }
}

以下代码示例会删除数据集及其所有内容:

/*
 * Copyright 2020 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.bigquery;

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.DatasetId;

// Sample to delete dataset with contents.
public class DeleteDatasetAndContents {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    deleteDatasetAndContents(projectId, datasetName);
  }

  public static void deleteDatasetAndContents(String projectId, String datasetName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      DatasetId datasetId = DatasetId.of(projectId, datasetName);
      // Use the force parameter to delete a dataset and its contents
      boolean success = bigquery.delete(datasetId, BigQuery.DatasetDeleteOption.deleteContents());
      if (success) {
        System.out.println("Dataset deleted with contents successfully");
      } else {
        System.out.println("Dataset was not found");
      }
    } catch (BigQueryException e) {
      System.out.println("Dataset was not deleted with contents. \n" + e.toString());
    }
  }
}

Node.js

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

使用 pip install google-cloud-bigquery-datatransfer 安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function deleteDataset() {
  // Deletes a dataset named "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset';

  // Create a reference to the existing dataset
  const dataset = bigquery.dataset(datasetId);

  // Delete the dataset and its contents
  await dataset.delete({force: true});
  console.log(`Dataset ${dataset.id} deleted.`);
}

PHP

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 PHP 设置说明进行操作。 如需了解详情,请参阅 BigQuery PHP API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

使用 pip install google-cloud-bigquery-datatransfer 安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->delete();
printf('Deleted dataset %s' . PHP_EOL, $datasetId);

Python

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

使用 pip install google-cloud-bigquery-datatransfer 安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set model_id to the ID of the model to fetch.
# dataset_id = 'your-project.your_dataset'

# Use the delete_contents parameter to delete a dataset and its contents.
# Use the not_found_ok parameter to not receive an error if the dataset has already been deleted.
client.delete_dataset(
    dataset_id, delete_contents=True, not_found_ok=True
)  # Make an API request.

print("Deleted dataset '{}'.".format(dataset_id))

Ruby

以下代码示例会删除空数据集。

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 BigQuery Ruby API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

使用 pip install google-cloud-bigquery-datatransfer 安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
require "google/cloud/bigquery"

def delete_dataset dataset_id = "my_empty_dataset"
  bigquery = Google::Cloud::Bigquery.new

  # Delete a dataset that does not contain any tables
  dataset = bigquery.dataset dataset_id
  dataset.delete
  puts "Dataset #{dataset_id} deleted."
end

以下代码示例会删除数据集及其所有内容:

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require "google/cloud/bigquery"

def delete_dataset_and_contents dataset_id = "my_dataset_with_tables"
  bigquery = Google::Cloud::Bigquery.new

  # Use the force parameter to delete a dataset and its contents
  dataset = bigquery.dataset dataset_id
  dataset.delete force: true
  puts "Dataset #{dataset_id} and contents deleted."
end

从已删除的数据集中恢复表

您可以从已删除的数据集恢复在数据集的时间旅行窗口内的表。如需恢复整个数据集,请参阅恢复删除的数据集

  1. 创建一个与原始数据集同名并且位于同一数据集中的数据集。
  2. 选择原始数据集被删除之前的时间戳,格式为从计时原点开始计算的毫秒数,例如 1418864998000
  3. 将时间 1418864998000originaldataset.table1 表复制到新的数据集:

    bq cp originaldataset.table1@1418864998000 mydataset.mytable
    

    如需查找已删除数据集中非空表的名称,请在时间旅行窗口内查询数据集的 INFORMATION_SCHEMA.TABLE_STORAGE 视图

恢复删除的数据集

您可以恢复删除的数据集,以将其恢复到删除时的状态。您只能恢复处于时间旅行窗口内的数据集。这种恢复包括数据集中包含的所有对象、数据集属性和安全设置。对于未恢复的资源,请参阅恢复删除的数据集的限制

恢复删除的数据集的限制

  • 恢复的数据集可能会引用不再存在的安全主体。
  • 恢复删除操作不会恢复对关联数据集中已删除数据集的引用。订阅方必须重新订阅才能手动恢复链接。
  • 恢复删除操作不会恢复业务标记。
  • 您必须手动刷新具体化视图并向已获授权的视图已获授权的数据集已获授权的例程重新授权。请注意,删除已获授权的资源(视图、数据集和例程)后,最长可能需要 24 小时才能删除授权。因此,如果您在删除后 24 小时内对包含已获授权的资源的数据集执行恢复删除操作,则可能不需要重新授权。最佳实践是始终在恢复删除的资源后验证授权。

恢复删除的数据集

如需恢复删除的数据集,请选择以下方法之一:

SQL

使用 UNDROP SCHEMA 数据定义语言 (DDL) 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    UNDROP SCHEMA DATASET_ID;

    DATASET_ID 替换为您要执行恢复删除操作的数据集。

  3. 指定您要执行恢复删除操作的数据集的位置

  4. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

API

调用 datasets.undelete 方法

恢复删除的数据集时,可能会出现以下错误:

  • ALREADY_EXISTS:您尝试在其中执行恢复删除操作的区域中已存在同名的数据集。您无法使用恢复删除来覆盖或合并数据集。
  • NOT_FOUND:您尝试恢复的数据集已超过其时间旅行窗口、从未存在,或者您未指定数据集的正确位置
  • ACCESS_DENIED:您没有正确的权限对此数据集执行恢复删除操作。

配额

如需了解复制配额,请参阅复制作业INFORMATION_SCHEMA 中提供了复制作业的用量。如需了解如何查询 INFORMATION_SCHEMA.JOBS 视图,请参阅 JOBS 视图

价格

如需了解复制数据集的价格信息,请参阅数据复制价格

BigQuery 会发送经压缩的数据以进行跨区域复制,因此计费数据可能小于数据集的实际大小。如需了解详情,请参阅 BigQuery 价格

后续步骤