還原已刪除的資料表
本文說明如何在 BigQuery 中還原 (或取消刪除) 已刪除的資料表。您可以在資料集指定的時間回溯期內,還原已刪除的資料表,包括因資料表到期而明確刪除和隱含刪除的資料表。您也可以設定時間旅行視窗。
如要瞭解如何還原已刪除的整個資料集或快照,請參閱下列資源:
時間回溯期可介於 2 到 7 天。超過時空旅行時間範圍後,BigQuery 會提供安全期,自動保留已刪除的資料七天。安全期過後,您就無法再以任何方式還原資料表,包括提交支援單。
事前準備
確認您具備必要的 Identity and Access Management (IAM) 權限,可以還原已刪除的資料表。
必要的角色
如要取得還原已刪除資料表所需的權限,請要求管理員授予專案的 BigQuery 使用者 (roles/bigquery.user) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
還原資料表
如要從歷來資料還原資料表,請將歷來資料複製到新資料表。只要在時間回溯期內還原資料表,即使資料表已遭刪除或過期,您仍可複製歷來資料。
從歷來資料還原資料表時,來源資料表的標記不會複製到目的地資料表。資料表分區資訊也不會複製到目的地資料表。如要重新建立原始資料表的分區架構,請在 Cloud Logging 中查看初始資料表建立要求,並使用該資訊將還原的資料表分區。
如要還原已刪除但仍在時間旅行視窗內的資料表,請使用 @<time> 時間修飾符將資料表複製到新資料表。即使使用時間修飾符,您也無法查詢已刪除的資料表。你必須先還原。
請搭配 @<time> 時間裝飾器使用下列語法:
tableid@TIME,其中TIME是自 Unix 紀元起經過的毫秒數。tableid@-TIME_OFFSET,其中TIME_OFFSET是以毫秒為單位的相對偏移量,表示與目前時間的差距。tableid@0:指定最舊的可用歷來資料。
如要還原資料表,請選取下列其中一個選項:
控制台
您無法使用 Cloud de Confiance 控制台還原已刪除的資料表。
bq
-
在 Cloud de Confiance 控制台中啟用 Cloud Shell。
Cloud de Confiance 主控台底部會開啟一個 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已針對您目前的專案設定好相關值。工作階段可能要幾秒鐘的時間才能初始化。
如要還原資料表,請先確定資料表存在時間的 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。
如果您預期之後可能會還原資料表,但時間超出時空旅行時間範圍,請建立資料表的快照。詳情請參閱「資料表快照簡介」。
您無法直接還原邏輯檢視區塊。詳情請參閱「還原檢視畫面」。
找出資料表的刪除時間
在 Cloud de Confiance 控制台的 Logs Explorer 中使用下列篩選條件,找出顯示指定表格到期或刪除的稽核項目:
resource.type="bigquery_resource"
protoPayload.resourceName="projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID"
(protoPayload.methodName="google.cloud.bigquery.v2.TableService.DeleteTable" OR protoPayload.methodName="tableservice.delete" OR protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.query.statementType="DROP_TABLE" OR protoPayload.methodName="InternalTableExpired")
更改下列內容:
PROJECT_ID:您的專案 ID。DATASET_ID:包含資料表的資料集 ID。TABLE_ID:已刪除資料表的 ID。
或者,您也可以使用下列篩選器,找出包含資料表的資料集到期或刪除時間:
resource.type="bigquery_dataset"
protoPayload.resourceName="projects/PROJECT_ID/datasets/DATASET_ID"
(protoPayload.methodName="google.cloud.bigquery.v2.DatasetService.DeleteDataset" OR protoPayload.methodName="datasetservice.delete")
更改下列內容:
PROJECT_ID:您的專案 ID。DATASET_ID:包含資料表的資料集 ID。
找出資料表遭刪除的原因
您可以使用 INFORMATION_SCHEMA.TABLE_STORAGE 檢視畫面,判斷資料表的刪除方式。
INFORMATION_SCHEMA.TABLE_STORAGE 檢視畫面會顯示目前資料表和時間回溯期內刪除的資料表相關資訊。如果資料表已刪除,table_deletion_time 欄會顯示刪除時間戳記,table_deletion_reason 欄則會顯示刪除方法。
如要判斷資料表遭到刪除的原因,請查詢 INFORMATION_SCHEMA.TABLE_STORAGE 檢視畫面:
SELECT table_name, deleted, table_deletion_time, table_deletion_reason FROM `PROJECT_ID`.`region-REGION`.INFORMATION_SCHEMA.TABLE_STORAGE WHERE table_schema = "DATASET_ID" AND table_name = "TABLE_ID"
請替換下列變數:
PROJECT_ID:您的專案 ID。REGION:包含資料表的資料集所在區域。DATASET_ID:包含資料表的資料集 ID。TABLE_ID:已刪除資料表的 ID。
「table_deletion_reason」欄會說明表格遭刪除的原因:
TABLE_EXPIRATION:資料表在設定的到期時間過後遭到刪除。DATASET_DELETION:使用者刪除了資料表所屬的資料集。USER_DELETED:使用者刪除了資料表。
排解資料表復原問題
使用過去的時間戳記查詢已刪除的資料表
您無法使用時間戳記裝飾符查詢過去已刪除的資料表,或使用 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。
發生錯誤: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 年的時間戳記。如要解決這個問題,請在設定表格裝飾值時驗證位移或時間戳記值,並適當使用 - 符號。
具體化檢視表
您無法直接還原已刪除的具體化檢視表,如果刪除具體化檢視區塊,您必須重新建立。
如果刪除具體化檢視表的基礎資料表,就無法再查詢或重新整理該檢視表。如果您按照「還原資料表」一節的步驟還原基礎資料表,也必須重新建立使用該資料表的任何具體化檢視區塊。
外部資料表
您無法直接還原已刪除的外部資料表,如果刪除外部資料表,就必須重新建立。如要重新建立資料表,您必須知道原始資料表的定義,尤其是下列項目:
- 資料表的結構定義
- 指向外部資料的來源 URI
- 外部資料的格式
您可以從 Cloud Logging 取得這項資訊,方法是尋找資料表建立記錄項目。如果資料表剛刪除,您也可以嘗試查詢INFORMATION_SCHEMA.TABLE_OPTIONS檢視區塊來取得 URI。
刪除外部資料表不會一併刪除基礎資料。