如何恢复从 Google BigQuery 意外删除的数据
已发表: 2022-04-12您是否曾经意外删除了 Google BigQuery 中的重要表、视图或整个数据集? 如果有,您就知道无法继续处理包含已删除数据的表和查询。
我们已经编写了详细的说明来帮助您恢复意外删除的数据,并且不会提前得到任何白发。
目录
- 如何恢复已删除的表
- 如何恢复已删除的视图
- 如何恢复已删除的数据集
- 如何防止将来出现类似问题
- 如果问题再次发生,如何减少问题的规模
如何恢复已删除的表
如果删除的表自删除后不超过 7 天,并且您知道其名称和从中删除它的数据集的名称,则可以恢复已删除的表。
要恢复表,请在 Google BigQuery 界面中打开 Cloud Shell 命令行:

输入以下命令:
bq cp mydataset.mytable@-3600000 mydataset.newtable
bq cp mydataset.mytable@-3600000 mydataset.newtable
具有表和数据集名称的相同命令示例:
bq cp OWOXBI_Reports.123_Transactions_withModels@-13600000 OWOXBI_Reports_Restore.123_Transactions_withModels
bq cp OWOXBI_Reports.123_Transactions_withModels@-13600000 OWOXBI_Reports_Restore.123_Transactions_withModels
在哪里:
- OWOXBI_Reports.123_Transactions_withModels — 是已删除的数据集和表。
- OWOXBI_Reports_Restore.123_Transactions_withModels — 是数据集和其中要恢复数据的表的名称。
- @-13600000 — 过去(13,600,000 毫秒前)您要查找的表仍然存在的距离。 例如,如果一个表在 30 分钟前被删除,设置时间间隔 @ -3600000 就足够了,即一个小时前(60 秒 ×60 分钟 × 1000)。
输入请求后,需要授权。 点击授权按钮:

命令运行成功后,表将恢复:

您将看到类似于以下内容的文本:
Waiting on bqjob_r4ca30008c2e3147d_0000017af0d58e5e_1 ... (0s) Current status: DONE Table 'summer-drive-112011:OWOXBI_Reports_Restore.test_table@-600000' successfully copied to 'summer-drive-112011:OWOXBI_Reports_Restore.test_table'
Waiting on bqjob_r4ca30008c2e3147d_0000017af0d58e5e_1 ... (0s) Current status: DONE Table 'summer-drive-112011:OWOXBI_Reports_Restore.test_table@-600000' successfully copied to 'summer-drive-112011:OWOXBI_Reports_Restore.test_table'
如何恢复已删除的视图
您无法以上述方式恢复远程视图。 该方法仅适用于表格。
Google 支持建议使用日志资源管理器来恢复已删除的视图。
要查找更新远程视图的查询,请在 Google Cloud Platform 日志中运行以下查询:
resource.type="bigquery_resource" protoPayload.methodName="tableservice.update" protoPayload.serviceData.tableUpdateRequest.resource.tableName.tableId="custom_events_attribution_VIEW"
resource.type="bigquery_resource" protoPayload.methodName="tableservice.update" protoPayload.serviceData.tableUpdateRequest.resource.tableName.tableId="custom_events_attribution_VIEW"
在哪里:
- tableservice.update — 是在日志中显示视图更新的命令
- custom_events_attribution_VIEW — 视图的名称
在选择时间范围设置中,设置可以对视图进行更改的时间段(例如,一年):

执行该命令时,将显示更新您正在查找的视图的所有查询。 选择最后一个时间戳查询:

从日志中复制查询并重新创建视图。

此外,您可以找到创建您正在寻找的视图的查询(在此之前,我们搜索了更新视图的查询)。 为此,请使用以下命令:
resource.type="bigquery_resource" protoPayload.methodName="tableservice.insert" protoPayload.serviceData.tableInsertRequest.resource.tableName.tableId="query_name_VIEW"
resource.type="bigquery_resource" protoPayload.methodName="tableservice.insert" protoPayload.serviceData.tableInsertRequest.resource.tableName.tableId="query_name_VIEW"

我们建议您设置尽可能长的时间来搜索所需条目的日志。

如果在开始记录日志之前创建了视图,则无法恢复它。 在这种情况下,我们上面描述的 tableservice.update 命令可以提供帮助。
如何恢复已删除的数据集
如果您删除数据集,您将无法恢复它。 您必须创建一个同名的新数据集,恢复已删除数据集中的表和视图,并将它们移动到新数据集。
在删除数据集后的前 24 小时内,您无法创建具有相同名称的新数据集,但您仍然可以找到属于已删除数据集的表和视图的名称。 但是,表格和视图本身将不再可见。
您可以通过在 BigQuery 中搜索,按名称从已删除数据集中查找视图:

无法通过搜索找到表列表,因为表的名称中没有共同的组成部分。
要从已删除的数据集中查找表名,请使用以下 SQL 查询。 在查询中,指定可以修改表的时间段(creation_time BETWEEN)。 因此,查询将返回在什么时间段内对其进行了更改的表。 这些将是已删除数据集中的表。
SELECT * FROM ( SELECT query, user_email, CONCAT(destination_table.project_id,".",destination_table.dataset_id,".",destination_table.table_id) AS destination_table, COUNT(job_id) AS job_ids, MAX(creation_time) AS lastUpdateDate FROM region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY) AND TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 0 DAY) AND state = 'DONE' AND CONCAT(destination_table.project_id,".",destination_table.dataset_id,".",destination_table.table_id) LIKE "%OWOXBI_Reports.%" GROUP BY 1, 2, 3 ORDER BY 5 DESC)
SELECT * FROM ( SELECT query, user_email, CONCAT(destination_table.project_id,".",destination_table.dataset_id,".",destination_table.table_id) AS destination_table, COUNT(job_id) AS job_ids, MAX(creation_time) AS lastUpdateDate FROM region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY) AND TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 0 DAY) AND state = 'DONE' AND CONCAT(destination_table.project_id,".",destination_table.dataset_id,".",destination_table.table_id) LIKE "%OWOXBI_Reports.%" GROUP BY 1, 2, 3 ORDER BY 5 DESC)
作为请求的结果,您将收到以下信息:
- query — 对destination_table 进行更改的查询文本
- user _email — 发起destination_table 更新请求的用户
- destination_table — 已更新的表
- job_ids — 在指定时间间隔内开始查询的次数(creation_time BETWEEN ...)
- lastUpdateDate — 上次开始查询的时间 (MAX(creation_time) AS lastUpdateDate)
删除数据集 24 小时后,您可以创建同名的新数据集并开始恢复表和视图。
如何防止将来出现类似问题
- 当您开始使用该项目时,请在您的 Google BigQuery 项目中启用日志收集。
- 不要将表命名为与数据集相同的视图。
- 仔细检查您要从 Google BigQuery 中删除的任何表的名称。
- 通过查询删除表,而不是通过用户界面。
- 将实体类型添加到数据集、表和视图名称。 例如:
- OWOXBI_report_dataset
- OWOXBI_report_table
- OWOXBI_report_view
您可以使用查询删除表:
DROP TABLE `summer-drive-112011.OWOXBI_Reports_Restore.test_table`
DROP TABLE `summer-drive-112011.OWOXBI_Reports_Restore.test_table`
您还可以使用查询删除视图:
DROP VIEW `summer-drive-112011.OWOXBI_Reports_Restore.test_VIEW`
DROP VIEW `summer-drive-112011.OWOXBI_Reports_Restore.test_VIEW`
如果问题再次发生,如何减少问题的规模
- 不要更改 Schedule 和 Google Apps Script 中的查询; 第二天,恢复所有视图和表格,之后计划和 Google Apps 脚本将正常工作。
- 如果视图或表参与了归因模型的设置,您将需要在将数据恢复到之前的位置后重新启动归因计算。
关于该主题的有用链接
恢复已删除的表
删除表
管理视图
如何立即恢复 Google BigQuery 中的表

我们的客户
生长 快22%
通过衡量在您的营销中最有效的方法来更快地增长
分析您的营销效率,找到增长领域,提高投资回报率
获取演示