如何恢复从 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 小时后,您可以创建同名的新数据集并开始恢复表和视图。

如何防止将来出现类似问题

  1. 当您开始使用该项目时,请在您的 Google BigQuery 项目中启用日志收集。
  2. 不要将表命名为与数据集相同的视图。
  3. 仔细检查您要从 Google BigQuery 中删除的任何表的名称。
  4. 通过查询删除表,而不是通过用户界面。
  5. 将实体类型添加到数据集、表和视图名称。 例如:
    1. OWOXBI_report_dataset
    2. OWOXBI_report_table
    3. 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%

通过衡量在您的营销中最有效的方法来更快地增长

分析您的营销效率,找到增长领域,提高投资回报率

获取演示