管理数据集
本文档介绍如何在 BigQuery 中复制数据集、在其他位置重新创建数据集、保护数据集、删除数据集、恢复已删除数据集中的表以及恢复删除的数据集。
作为 BigQuery 管理员,您可以整理和控制分析师使用的表和视图的访问权限。如需详细了解数据集,请参阅数据集简介。
您无法在现有数据集创建后更改其名称或迁移其位置。 如需更改数据集名称的解决方法,您可以复制数据集并更改目标数据集的名称。如需迁移数据集,您可以采用以下方法之一:
所需的角色
本部分介绍管理数据集所需的角色和权限。如果源数据集或目标数据集与您用于复制的数据集位于同一项目中,则您不需要针对该数据集的额外权限或角色。
如需获得管理数据集所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
复制数据集(Beta 版):
-
针对目标项目的 BigQuery Admin (
roles/bigquery.admin
) 角色 -
针对源数据集的 BigQuery Data Viewer (
roles/bigquery.dataViewer
) 角色 -
针对目标数据集的 BigQuery Data Editor (
roles/bigquery.dataEditor
) 角色
-
针对目标项目的 BigQuery Admin (
-
删除数据集:针对项目的 BigQuery Data Owner (
roles/bigquery.dataOwner
) 角色 -
恢复已删除的数据集:针对项目的 BigQuery User (
roles/bigquery.user
) 角色
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色可提供管理数据集所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
您必须拥有以下权限才能管理数据集:
-
复制数据集:
-
针对目标项目的
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
。
复制数据集
从下列选项中选择一项:
控制台
确保您拥有所需的角色。
如果您打算为 Pub/Sub 设置转移作业运行通知(后续步骤中的方法 2),则您必须具有
pubsub.topics.setIamPolicy
权限。如果您只设置电子邮件通知,则不需要 Pub/Sub 权限。如需了解详情,请参阅 BigQuery Data Transfer Service 运行通知。
在源数据集所在的区域或其他区域中创建 BigQuery 数据集。
方法 1:使用 BigQuery 复制函数
如需创建一次性转移作业,请使用 BigQuery 复制函数:
转到 BigQuery 页面。
在浏览器面板中,展开您的项目并选择数据集。
在数据集信息部分中,点击
复制,然后执行以下操作:在数据集字段中,创建新数据集或从列表中选择一个现有数据集 ID。
项目中的数据集名称必须唯一。项目和数据集可以位于不同区域,但并非所有区域都支持进行跨区域的数据集复制。
位置字段中会显示源数据集的位置。
可选:如需使用源表覆盖目标表的数据和架构,请选中覆盖目标表复选框。源表和目标表都必须具有相同的分区架构。
如需复制数据集,请点击复制。
方法 2:使用 BigQuery Data Transfer Service
如需安排周期性复制并配置电子邮件或 Pub/Sub 通知,请使用目标项目的 Google Cloud 控制台中的 BigQuery Data Transfer Service:
进入数据传输页面。
点击创建转移作业。
在来源列表中,选择数据集副本。
在显示名称字段中,输入转移作业运行的名称。
在时间表选项部分中,执行以下操作:
在重复频率部分,选择转移作业的运行频率选项:
如果您选择自定义,请输入自定义频率,例如
every day 00:00
。如需了解详情,请参阅设置时间表的格式。在开始日期和运行时间部分,输入开始转移作业的日期和时间。如果您选择的是立即开始,则系统会停用此选项。
在目标设置部分中,选择用于存储转移数据的目标数据集。您还可以点击新建数据集来创建新数据集,然后再为此转移作业选择该数据集。
在数据源详细信息部分中,输入以下信息:
- 在源数据集部分,输入要复制的数据集 ID。
- 在源项目部分,输入源数据集的项目 ID。
如需使用源表覆盖目标表的数据和架构,请选中覆盖目标表复选框。源表和目标表都必须具有相同的分区架构。
在服务账号菜单中,从与您的 Google Cloud 项目关联的服务账号中选择一个服务账号。您可以将服务账号与转移作业相关联,而不是使用用户凭据。如需详细了解如何将服务账号用于数据转移,请参阅使用服务账号。
可选:在通知选项部分中,执行以下操作:
点击保存。
bq
确保您拥有所需的角色。
如需创建 BigQuery 数据集,请使用
bq mk
命令 并添加数据集创建标志--dataset
和location
标志:bq mk \ --dataset \ --location=LOCATION \ PROJECT:DATASET
请替换以下内容:
LOCATION
:您要复制数据集的位置PROJECT
:目标数据集的项目 IDDATASET
:目标数据集的名称
如需复制数据集,请使用
--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
:要复制的源数据集的 IDsource_project_id
:源数据集所在项目的 IDoverwrite_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
确保您拥有所需的角色。
如需创建 BigQuery 数据集,请使用已定义的数据集资源调用
datasets.insert
方法。要复制数据集,请使用
projects.locations.transferConfigs.create
方法并提供一个TransferConfig
资源实例。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用pip install google-cloud-bigquery-datatransfer
安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
为了避免产生额外的存储费用,请考虑删除之前的数据集。
查看数据集复制作业
如需在 Google Cloud 控制台中查看数据集复制作业的状态和详细信息,请执行以下操作:
在 Google Cloud 控制台中,转到数据传输页面。
根据要查看哪个传输作业的详细信息选择转移作业,然后执行以下操作:
在转移作业详情页面上,选择转移作业运行。
如需刷新,请点击
刷新。
在其他位置重新创建数据集
如需手动将数据集从一个位置移动到另一个位置,请按照以下步骤操作:
-
将数据从 BigQuery 表导出到数据集所在位置中的 Cloud Storage 存储桶或数据集内某个位置中的 Cloud Storage 存储桶。例如,如果数据集位于
EU
多区域位置,则可以将数据导出到位于欧盟内的europe-west1
比利时位置。从 BigQuery 导出数据不会产生费用,但是将导出的数据存储在 Cloud Storage 中会产生费用。BigQuery 导出操作需要遵循导出作业的相关限制。
-
将数据从导出 Cloud Storage 存储桶复制或移动到您在目标位置创建的新存储桶。例如,如果您要将数据从
US
多区域移动到asia-northeast1
东京区域,则需要将数据转移到您在东京创建的存储桶。如需了解如何转移 Cloud Storage 对象,请参阅 Cloud Storage 文档中的复制、重命名和移动对象。在区域之间转移数据会在 Cloud Storage 中产生网络出站流量费用。
-
在新位置创建新的 BigQuery 数据集,然后将数据从 Cloud Storage 存储桶加载到新数据集。
您不需要为将数据加载到 BigQuery 而付费,但在删除数据或存储桶之前,您需要为在 Cloud Storage 中存储数据支付费用。数据加载完毕后,在 BigQuery 中存储数据也须支付费用。将数据加载到 BigQuery 会受到加载作业限制。
您还可以使用 Cloud Composer 以编程方式移动和复制大型数据集。
如需详细了解如何使用 Cloud Storage 存储和移动大型数据集,请参阅使用 Cloud Storage 处理大数据。
保护数据集
如需控制对 BigQuery 中数据集的访问权限,请参阅控制对数据集的访问权限。 如需了解数据加密,请参阅静态加密。
删除数据集
使用 Google Cloud 控制台删除数据集时,数据集中的表和视图(包括其数据)也会随之一起删除。使用 bq 命令行工具删除数据集时,您必须使用 -r
标志删除表和视图。
如需删除数据集,请选择以下选项之一:
控制台
转到 BigQuery 页面。
在浏览器窗格中,展开您的项目,然后选择数据集。
展开
操作选项,然后点击删除。在删除数据集对话框中,在字段中输入
delete
,然后点击删除。
SQL
如需删除数据集,请使用 DROP SCHEMA
DDL 语句。
以下示例会删除名为 mydataset
的数据集:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,输入以下语句:
DROP SCHEMA IF EXISTS mydataset;
默认情况下,此方法仅适用于删除空数据集。如需删除数据集及其所有内容,请使用
CASCADE
关键字:DROP SCHEMA IF EXISTS mydataset CASCADE;
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
bq
使用 bq rm
命令 并根据需要添加 --dataset
或 -d
标志。如果数据集包含表,您必须使用 -r
标志移除数据集中的所有表。如果使用 -r
标志,则可以省略 --dataset
或 -d
标志。
运行该命令后,系统会要求确认。您可以使用 -f
标志跳过确认。
如果您要删除非默认项目中的表,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET
。
bq rm -r -f -d PROJECT_ID:DATASET
请替换以下内容:
PROJECT_ID
:您的项目 IDDATASET
:您要删除的数据集的名称
示例:
输入以下命令可从默认项目中移除名为 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 客户端。然后创建转移作业配置以复制数据集。
以下代码示例会删除数据集及其所有内容:
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用pip install google-cloud-bigquery-datatransfer
安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
Java
以下代码示例会删除空数据集。
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用pip install google-cloud-bigquery-datatransfer
安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
以下代码示例会删除数据集及其所有内容:
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用pip install google-cloud-bigquery-datatransfer
安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
PHP
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 PHP 设置说明进行操作。 如需了解详情,请参阅 BigQuery PHP API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用pip install google-cloud-bigquery-datatransfer
安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用pip install google-cloud-bigquery-datatransfer
安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
Ruby
以下代码示例会删除空数据集。
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 BigQuery Ruby API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
使用pip install google-cloud-bigquery-datatransfer
安装适用于 BigQuery Data Transfer API 的 Python 客户端。然后创建转移作业配置以复制数据集。
以下代码示例会删除数据集及其所有内容:
从已删除的数据集中恢复表
您可以从已删除的数据集恢复在数据集的时间旅行窗口内的表。如需恢复整个数据集,请参阅恢复删除的数据集。
- 创建一个与原始数据集同名并且位于同一数据集中的数据集。
- 选择原始数据集被删除之前的时间戳,格式为从计时原点开始计算的毫秒数,例如
1418864998000
。 将时间
1418864998000
的originaldataset.table1
表复制到新的数据集:bq cp originaldataset.table1@1418864998000 mydataset.mytable
如需查找已删除数据集中非空表的名称,请在时间旅行窗口内查询数据集的
INFORMATION_SCHEMA.TABLE_STORAGE
视图。
恢复删除的数据集
您可以恢复删除的数据集,以将其恢复到删除时的状态。您只能恢复处于时间旅行窗口内的数据集。这种恢复包括数据集中包含的所有对象、数据集属性和安全设置。对于未恢复的资源,请参阅恢复删除的数据集的限制。
恢复删除的数据集的限制
- 恢复的数据集可能会引用不再存在的安全主体。
- 恢复删除操作不会恢复对关联数据集中已删除数据集的引用。订阅方必须重新订阅才能手动恢复链接。
- 恢复删除操作不会恢复业务标记。
- 您必须手动刷新具体化视图并向已获授权的视图、已获授权的数据集和已获授权的例程重新授权。请注意,删除已获授权的资源(视图、数据集和例程)后,最长可能需要 24 小时才能删除授权。因此,如果您在删除后 24 小时内对包含已获授权的资源的数据集执行恢复删除操作,则可能不需要重新授权。最佳实践是始终在恢复删除的资源后验证授权。
恢复删除的数据集
如需恢复删除的数据集,请选择以下方法之一:
SQL
使用 UNDROP SCHEMA
数据定义语言 (DDL) 语句:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,输入以下语句:
UNDROP SCHEMA
DATASET_ID
;将
DATASET_ID
替换为您要执行恢复删除操作的数据集。点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
API
恢复删除的数据集时,可能会出现以下错误:
ALREADY_EXISTS
:您尝试在其中执行恢复删除操作的区域中已存在同名的数据集。您无法使用恢复删除来覆盖或合并数据集。NOT_FOUND
:您尝试恢复的数据集已超过其时间旅行窗口、从未存在,或者您未指定数据集的正确位置。ACCESS_DENIED
:您没有正确的权限对此数据集执行恢复删除操作。
配额
如需了解复制配额,请参阅复制作业。
INFORMATION_SCHEMA
中提供了复制作业的用量。如需了解如何查询 INFORMATION_SCHEMA.JOBS
视图,请参阅 JOBS
视图。
价格
如需了解复制数据集的价格信息,请参阅数据复制价格。
BigQuery 会发送经压缩的数据以进行跨区域复制,因此计费数据可能小于数据集的实际大小。如需了解详情,请参阅 BigQuery 价格。