如何恢復從 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%

通過衡量在您的營銷中最有效的方法來更快地增長

分析您的營銷效率,找到增長領域,提高投資回報率

獲取演示