恢复表快照

本文档介绍如何使用 Google Cloud 控制台、CREATE TABLE CLONE 查询、bq cp 命令或 jobs.insert API 通过表快照创建一个可写表。本文档适用于熟悉表快照的用户。

权限和角色

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

权限

如需通过表快照创建可写表,您需要具有以下权限:

权限 资源
以下所有项:

bigquery.tables.get
bigquery.tables.getData
bigquery.tables.restoreSnapshot
要复制到可写表的表快照。
bigquery.tables.create 包含目标表的数据集。

角色

提供所需权限的预定义 BigQuery 角色如下所示:

角色 资源
以下任意一项:

bigquery.dataEditor
bigquery.dataOwner
bigquery.admin
要复制到可写表的表快照。
以下任意一项:

bigquery.dataEditor
bigquery.dataOwner
bigquery.admin
包含目标表的数据集。

恢复表快照

如需通过快照创建可写表,请指定要复制的表快照及目标表。目标表可以是新表,也可以使用表快照覆盖现有表。

恢复到新表

您可以使用以下方式之一将表快照恢复到新表中:

控制台

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

    转到 BigQuery

  2. 探索器窗格中,展开要从中恢复数据的表快照的项目和数据集节点。

  3. 点击表快照的名称。

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

    从快照恢复表

  5. 在出现的恢复快照窗格中,输入新表的项目数据集信息。

  6. 点击保存

SQL

使用 CREATE TABLE CLONE DDL 语句

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

    转到 BigQuery

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

    CREATE TABLE TABLE_PROJECT_ID.TABLE_DATASET_NAME.NEW_TABLE_NAME
    CLONE SNAPSHOT_PROJECT_ID.SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME;

    请替换以下内容:

    • TABLE_PROJECT_ID:要在其中创建新表的项目的 ID。
    • TABLE_DATASET_NAME:要在其中创建新表的数据集的名称。
    • NEW_TABLE_NAME:新表的名称。
    • SNAPSHOT_PROJECT_ID:要从中恢复数据的快照所在的项目的 ID。
    • SNAPSHOT_DATASET_NAME:包含要用做恢复源的快照的数据集名称。
    • SNAPSHOT_NAME:要从中恢复数据的快照的名称。

  3. 点击 运行

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

bq

在 Cloud Shell 中输入以下命令:

转到 Cloud Shell

bq cp \
--restore \
--no_clobber \
SNAPSHOT_PROJECT_ID:SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME \
TABLE_PROJECT_ID:TABLE_DATASET_NAME.NEW_TABLE_NAME

请替换以下内容:

  • SNAPSHOT_PROJECT_ID:要从中恢复数据的快照所在的项目的 ID。
  • SNAPSHOT_DATASET_NAME:包含要用做恢复源的快照的数据集名称。
  • SNAPSHOT_NAME:要从中恢复数据的快照的名称。
  • TABLE_PROJECT_ID:要在其中创建新表的项目的 ID。
  • TABLE_DATASET_NAME:要在其中创建新表的数据集的名称。
  • NEW_TABLE_NAME:新表的名称。

--no_clobber 标志指示如果目标表已存在,则该命令失败。

API

使用以下参数调用 jobs.insert 方法:

参数
projectId 负责此操作的结算费用的项目的 ID。
请求正文
{
  "configuration": {
    "copy": {
      "sourceTables": [
        {
          "projectId": "SNAPSHOT_PROJECT_ID",
          "datasetId": "SNAPSHOT_DATASET_NAME",
          "tableId": "SNAPSHOT_NAME"
        }
      ],
      "destinationTable": {
        "projectId": "TABLE_PROJECT_ID",
        "datasetId": "TABLE_DATASET_NAME",
        "tableId": "NEW_TABLE_NAME"
      },
      "operationType": "RESTORE",
      "writeDisposition": "WRITE_EMPTY"
    }
  }
}

请替换以下内容:

  • SNAPSHOT_PROJECT_ID:要从中恢复数据的快照所在的项目的 ID。
  • SNAPSHOT_DATASET_NAME:包含要用做恢复源的快照的数据集名称。
  • SNAPSHOT_NAME:要从中恢复数据的快照的名称。
  • TABLE_PROJECT_ID:要在其中创建新表的项目的 ID。
  • TABLE_DATASET_NAME:要在其中创建新表的数据集的名称。
  • NEW_TABLE_NAME:新表的名称。

如果未指定到期时间,则目标表将在包含目标表的数据集的默认表到期时间之后到期。

覆盖现有表

您可以通过以下任一方法使用表快照覆盖现有表:

控制台

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

    转到 BigQuery

  2. 探索器窗格中,展开要从中恢复数据的表快照的项目和数据集节点。

  3. 点击表快照的名称。

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

    从快照恢复表

  5. 在出现的恢复快照窗格中,输入现有表的项目数据集信息。

  6. 选择覆盖表(如果存在)

  7. 点击保存

SQL

使用 CREATE TABLE CLONE DDL 语句

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

    转到 BigQuery

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

    CREATE OR REPLACE TABLE TABLE_PROJECT_ID.TABLE_DATASET_NAME.TABLE_NAME
    CLONE 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:要从中恢复数据的快照的名称。

  3. 点击 运行

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

bq

在 Cloud Shell 中输入以下命令:

转到 Cloud Shell

bq cp \
--restore \
--force \
SNAPSHOT_PROJECT_ID:SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME \
TABLE_PROJECT_ID:TABLE_DATASET_NAME.TABLE_NAME

请替换以下内容:

  • SNAPSHOT_PROJECT_ID:要从中恢复数据的快照所在的项目的 ID。
  • SNAPSHOT_DATASET_NAME:包含要用做恢复源的快照的数据集名称。
  • SNAPSHOT_NAME:要从中恢复数据的快照的名称。
  • TABLE_PROJECT_ID:要在其中创建新表的项目的 ID。
  • TABLE_DATASET_NAME:包含要覆盖的表的数据集名称。
  • TABLE_NAME:要覆盖的表的名称。

API

使用以下参数调用 jobs.insert 方法:

参数
projectId 负责此操作的结算费用的项目的 ID。
请求正文
{
  "configuration": {
    "copy": {
      "sourceTables": [
        {
          "projectId": "SNAPSHOT_PROJECT_ID",
          "datasetId": "SNAPSHOT_DATASET_NAME",
          "tableId": "SNAPSHOT_NAME"
        }
      ],
      "destinationTable": {
        "projectId": "TABLE_PROJECT_ID",
        "datasetId": "TABLE_DATASET_NAME",
        "tableId": "TABLE_NAME"
      },
      "operationType": "RESTORE",
      "writeDisposition": "WRITE_TRUNCATE"
    }
  }
}

请替换以下内容:

  • SNAPSHOT_PROJECT_ID:要从中恢复数据的快照所在的项目的 ID。
  • SNAPSHOT_DATASET_NAME:包含要用做恢复源的快照的数据集名称。
  • SNAPSHOT_NAME:要从中恢复数据的快照的名称。
  • TABLE_PROJECT_ID:要在其中创建新表的项目的 ID。
  • TABLE_DATASET_NAME:包含要覆盖的表的数据集名称。
  • TABLE_NAME:要覆盖的表的名称。

如果未指定到期时间,则目标表将在包含目标表的数据集的默认表到期时间之后到期。

后续步骤