创建表快照

本文档介绍了如何使用 Google Cloud 控制台、CREATE SNAPSHOT TABLE SQL 语句、bq cp --snapshot 命令或 jobs.insert API 创建表快照。本文档适用于熟悉 BigQuery 表快照的用户。

权限和角色

本部分介绍了创建表快照所需的 Identity and Access Management (IAM) 权限以及授予这些权限的预定义 IAM 角色

权限

如需复制表快照,您需要以下权限:

权限 资源 备注
以下所有项:

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 角色如下所示:

角色 资源 备注
至少具有以下角色之一:

bigquery.dataViewer
bigquery.dataEditor
bigquery.dataOwner

至少具有以下角色之一:

bigquery.jobUser
bigquery.studioUser
bigquery.user
bigquery.studioAdmin
bigquery.admin
此标志表示要创建快照的表。 只有 bigquery.dataOwnerbigquery.adminbigquery.studioAdmin 可用于创建具有到期时间的快照。
至少具有以下角色之一:

bigquery.dataEditor
bigquery.dataOwner
bigquery.studioAdmin
bigquery.admin
包含新表快照的数据集。

限制

如需了解表快照限制,请参阅表快照限制

此外,表快照的创建受到以下限制,这些限制适用于所有表复制作业

  • 创建表快照时,其名称必须遵循与创建表相同的命名规则
  • 表快照创建过程受复制作业的 BigQuery 限制约束。
  • 表快照数据集必须与您要获取快照的表所属的数据集位于同一区域组织。例如,对于欧盟境内的数据集中的表,不能在美国境内的数据集中创建该表的表快照。您需要改为创建表的副本。
  • 由于底层存储是动态管理的,因此 BigQuery 创建表快照所花费的时间可能因不同的运行大不相同。
  • 使用 BigQuery CLI 创建表快照时,快照会使用目标数据集的默认加密密钥。使用 SQL 创建表快照时,快照会使用与源表相同的加密密钥。

创建表快照

最佳实践是在与基表不同的数据集中创建表快照。这种实践允许从基表快照恢复表,即使意外删除基表的数据集也是如此。

创建表快照时,指定要创建快照的表和表快照的唯一名称。您可以指定快照的时间和表快照的到期时间

创建具有到期时间的表快照

您可以使用以下选项之一创建 24 小时后到期的表快照:

控制台

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

    转到 BigQuery

  2. 浏览器窗格中,展开要截取快照的表的项目和数据集节点。

  3. 点击要截取快照的表的名称。

  4. 在出现的表窗格中,点击快照

    点击“快照”

  5. 在显示的创建表快照窗格中,输入新的表快照的项目数据集信息。

  6. 到期时间字段中,输入从现在起 24 小时的日期和时间。

  7. 点击保存

SQL

使用 CREATE SNAPSHOT TABLE DDL 语句

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

    转到 BigQuery

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

    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 小时后的日期和时间。

  3. 点击 运行

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

bq

在 Cloud Shell 中输入以下命令:

转到 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 小时后的日期和时间。

与表一样,如果未指定到期时间,则表快照将在包含表快照的数据集的默认表到期时间之后过期。

使用时间旅行创建表快照

您可以使用以下选项之一创建表的快照,就像一小时前的表一样:

控制台

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

    转到 BigQuery

  2. 浏览器窗格中,展开要截取快照的表的项目和数据集节点。

  3. 点击要截取快照的表的名称。

  4. 在出现的表窗格中,点击快照

    点击“快照”

  5. 在显示的创建表快照窗格中,输入新的表快照的项目数据集信息。

  6. 快照时间字段中,输入 1 小时前的日期和时间。

  7. 点击保存

SQL

CREATE SNAPSHOT TABLE DDL 语句FOR SYSTEM_TIME AS OF 子句搭配使用:

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

    转到 BigQuery

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

    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:要从中创建快照的表的名称。

  3. 点击 运行

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

bq

在 Cloud Shell 中输入以下命令:

转到 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 中表的访问权限,请参阅表访问权限控制简介

创建表快照时,对表快照的表级访问权限设置如下:

  • 如果表快照会覆盖现有表,则系统会保留现有表的表级访问权限。标记不会从基表复制。
  • 如果表快照是一项新资源,则表快照的表级访问权限将由在其中创建该表快照的数据集的访问权限政策来决定。此外,标记会从基表复制到表快照。

后续步骤