如何恢復從 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%
通過衡量在您的營銷中最有效的方法來更快地增長
分析您的營銷效率,找到增長領域,提高投資回報率
獲取演示