创建表快照
本文档介绍如何使用 Google Cloud Console、CREATE SNAPSHOT TABLE
SQL 语句、bq cp --snapshot
命令或 jobs.insert
API 创建表快照。本文档适用于熟悉 BigQuery 表快照的用户。
权限和角色
本部分介绍了创建表快照所需的 Identity and Access Management (IAM) 权限以及授予这些权限的预定义 IAM 角色。
权限
如需复制表快照,您需要以下权限:
权限 | 资源 | Notes |
---|---|---|
以下所有项: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 角色如下所示:
角色 | 资源 | Notes |
---|---|---|
以下任意一项:bigquery.dataViewer bigquery.dataEditor bigquery.dataOwner bigquery.admin
|
此标志表示要创建快照的表。 | 只有 bigquery.dataOwner 和 bigquery.admin 可用于创建具有到期时间的快照。 |
以下任意一项:bigquery.dataEditor bigquery.dataOwner bigquery.admin
|
包含新表快照的数据集。 |
限制
如需了解表快照限制,请参阅表快照限制。
此外,表快照的创建受到以下限制,这些限制适用于所有表复制作业:
- 创建表快照时,其名称必须遵循与创建表相同的命名规则。
- 表快照创建过程受复制作业的 BigQuery 限制约束。
- 表快照数据集必须与您要获取快照的表所属的数据集位于同一区域和组织。例如,对于欧盟境内的数据集中的表,不能在美国境内的数据集中创建该表的表快照。您需要改为创建表的副本。
- 由于底层存储是动态管理的,因此 BigQuery 创建表快照所花费的时间可能因不同的运行大不相同。
创建表快照
最佳实践是在与基表不同的数据集中创建表快照。这种实践允许从基表快照恢复表,即使意外删除基表的数据集也是如此。
创建表快照时,指定要创建快照的表和表快照的唯一名称。您可以指定快照的时间和表快照的到期时间。
创建具有到期时间的表快照
您可以使用以下选项之一创建在 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 小时后的日期和时间。
与表一样,如果未指定到期时间,则表快照将在包含表快照的数据集的默认表到期时间之后过期。
使用时间旅行创建表快照
您可以使用以下选项之一创建表的快照,就像一小时前的表一样:
控制台
在 Google Cloud 控制台中,转到 BigQuery 页面。
在浏览器窗格中,展开要截取快照的表的项目和数据集节点。
点击要截取快照的表的名称。
在出现的表窗格中,点击快照。
在显示的创建表快照窗格中,输入新的表快照的项目、数据集和表信息。
在快照时间字段中,输入 1 小时前的日期和时间。
点击保存。
SQL
将 CREATE SNAPSHOT TABLE
DDL 语句与 FOR SYSTEM_TIME AS OF
子句搭配使用:
在 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 中表的访问权限,请参阅表访问权限控制简介。
创建表快照时,对表快照的表级层访问权限会设置如下:
- 如果表快照会覆盖现有表,则系统会保留现有表的表级访问权限。不会从基表复制标记。
- 如果表快照是一项新资源,则表快照的表级访问权限将由在其中创建该表快照的数据集的访问权限政策来决定。此外,标记会从基表复制到表快照。