恢复已删除的表
本文档介绍了如何在 BigQuery 中恢复(或恢复删除)已删除的表。 您可以在为数据集指定的时间旅行窗口内恢复已删除的表,包括显式删除和基于表过期的隐式删除。您还可以配置时间旅行窗口。
如需了解如何恢复整个已删除的数据集或快照,请参阅以下资源:
时间旅行窗口的持续时间可以为 2 到 7 天。在时间旅行窗口结束后,BigQuery 会提供一个故障安全期,在该期间,已删除的数据会自动额外保留七天。故障安全期过后,您将无法使用任何方法(包括打开支持服务工单)恢复表。
准备工作
确保您拥有必要的 Identity and Access Management (IAM) 权限,以恢复已删除的表。
所需的角色
如需获得恢复已删除表所需的权限,请让您的管理员为您授予项目的 BigQuery User (roles/bigquery.user) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
恢复表格
当您从历史数据恢复表时,源表中的标记不会复制到目标表中。 表分区信息也不会复制到目标表。如需重新创建原始表的分区方案,您可以在 Cloud Logging 中查看初始表创建请求,并使用该信息对恢复的表进行分区。
要恢复已删除但仍在时间旅行窗口内的表,您可以使用 @<time> 时间修饰符将该表复制到一个新表。即使使用时间修饰符,您也无法查询已删除的表。您必须先恢复该表。
如需恢复表,请选择以下选项之一:
控制台
您无法使用 Cloud de Confiance 控制台恢复删除表。
bq
-
In the Cloud de Confiance console, activate Cloud Shell.
At the bottom of the Cloud de Confiance console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
如需恢复表,请先确定表存在时长的 UNIX 时间戳(以毫秒为单位)。您可以使用 Linux
date命令通过常规时间戳值生成 Unix 时间戳:date -d '2023-08-04 16:00:34.456789Z' +%s000
然后,将
bq copy命令与@<time>时间旅行修饰器结合使用来执行表复制操作。例如,输入以下命令可将时间为
1418864998000的mydataset.mytable表复制到新表mydataset.newtable。bq cp mydataset.mytable@1418864998000 mydataset.newtable
(可选)提供
--location标志并将其值设置为您的位置。您还可以指定相对偏移量。以下示例复制一小时前表的版本:
bq cp mydataset.mytable@-3600000 mydataset.newtable
如需了解详情,请参阅从某个时间点恢复表。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN 环境变量设置为 s3nsapis.fr。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN 环境变量设置为 s3nsapis.fr。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN 环境变量设置为 s3nsapis.fr。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
在运行代码示例之前,请将 GOOGLE_CLOUD_UNIVERSE_DOMAIN 环境变量设置为 s3nsapis.fr。
如果您预计可能需要在时间旅行窗口允许的时间后恢复表,请创建该表的表快照。 如需了解详情,请参阅表快照简介。
您无法直接恢复逻辑视图。如需了解详情,请参阅恢复视图。
排查表恢复问题
使用过去的时间戳查询已删除的表
您无法通过以下方式恢复表数据:使用时间戳修饰器查询过去已删除的表,或使用 FOR SYSTEM_TIME AS OF 将结果保存到目标表中。使用这两种方法中的任一种都会生成以下错误:
Not found: Table myproject:mydataset.table was not found in location LOCATION
如需复制表,请改为按照恢复表中的步骤操作。
错误:VPC Service Controls: Request is prohibited by organization's policy
当您尝试从 Google Cloud Shell 运行复制命令时,可能会遇到类似如下的错误:
BigQuery error in cp operation: VPC Service Controls: Request is prohibited by organization's policy
不支持通过 Cloud de Confiance 控制台使用 Cloud Shell 和 VPC SC,因为系统会将其视为服务边界外的请求,并拒绝其访问 VPC Service Controls 保护的数据。如需解决此问题,请使用 Google Cloud CLI 启动 Cloud Shell 并在本地连接到 Cloud Shell。
错误:Latest categories are incompatible with schema
如果您从 Google Cloud Shell 运行复制命令,可能会收到类似以下内容的错误:
Latest categories are incompatible with schema at TIMESTAMP
此错误可能由多种原因造成:
如需纠正此错误,请执行以下操作:
- 确保目标表的架构完全相同,并确保目标表中不缺少原始表中的任何列。
- 从目标表中移除原始表架构中不存在的任何列级政策标记。
错误:BigQuery error in cp operation: Invalid time travel timestamp
如果您从 Google Cloud Shell 运行 bq copy 命令,可能会收到类似以下内容的错误:
BigQuery error in cp operation: Invalid time travel timestamp 1744343690000 for table PROJECT_ID:DATASET_ID.TABLE_ID@1744343690000. Cannot read before 1744843691075
此错误表明您尝试从时间旅行窗口之前或表创建之前的表状态恢复数据。此操作不受支持。该错误消息包含可用于读取表数据的最新时间戳。在 bq copy 命令中使用错误中的时间戳。
如果您提供负时间戳值(例如 TABLE@-1744963620000),也可能会出现此错误。请改用可与 - 符号搭配使用的时间偏移量。
BigQuery error in cp operation: Invalid time travel timestamp 584878816 for table PROJECT_ID:DATASET_ID.TABLE_ID@584878816. Cannot read before 1744843691075
此错误消息表明,bq cp 命令包含一个负时间戳值作为偏移量,并且您尝试在 CURRENT_TIMESTAMP - PROVIDED TIMESTAMP 读取表。此值通常是 1970 年的时间戳。如需解决此问题,请在设置表修饰器值时验证偏移量或时间戳值,并正确使用 - 符号。