建立資料表快照
本文說明如何使用Google Cloud 控制台、CREATE SNAPSHOT TABLE SQL 陳述式、bq cp --snapshot 指令或 jobs.insert API 建立資料表快照。本文適用於熟悉 BigQuery 資料表快照的使用者。
權限與角色
本節說明建立資料表快照所需的 Identity and Access Management (IAM) 權限,以及授予這些權限的預先定義 IAM 角色。
權限
如要建立資料表快照,您必須具備下列權限:
| 權限 | 資源 | 注意事項 |
|---|---|---|
符合下列所有條件:bigquery.tables.getbigquery.tables.getDatabigquery.tables.createSnapshotbigquery.datasets.getbigquery.jobs.create
|
要建立快照的資料表。 | 由於快照到期後會刪除快照,因此您必須具備 bigquery.tables.deleteSnapshot 權限,才能建立有到期時間的快照。 |
bigquery.tables.createbigquery.tables.updateData
|
包含資料表快照的資料集。 |
角色
提供必要權限的預先定義 BigQuery 角色如下:
| 角色 | 資源 | 注意事項 |
|---|---|---|
至少以下其中一項:bigquery.dataViewerbigquery.dataEditorbigquery.dataOwner另須滿足下列其中一項條件: bigquery.jobUserbigquery.studioUserbigquery.userbigquery.studioAdminbigquery.admin
|
要建立快照的資料表。 | 只有 bigquery.dataOwner、bigquery.admin 和 bigquery.studioAdmin 可用於建立具有到期時間的快照。 |
至少符合下列其中一項條件:bigquery.dataEditorbigquery.dataOwnerbigquery.studioAdminbigquery.admin
|
包含新資料表快照的資料集。 |
限制
如要瞭解資料表快照限制,請參閱「資料表快照限制」。
此外,建立資料表快照時須遵守下列限制,這些限制適用於所有資料表複製工作:
- 建立資料表快照時,名稱必須遵守與建立資料表時相同的命名規則。
- 建立資料表快照時,須遵守 BigQuery 對複製工作的限制。
- 資料表快照資料集必須與要建立快照的資料表資料集位於相同的區域和組織。舉例來說,如果資料表位於歐盟境內的資料集,您就無法在美國境內的資料集建立資料表快照。請改為建立資料表副本。
- BigQuery 建立資料表快照所需的時間,可能會因基礎儲存空間是動態管理,而有顯著差異。
- 使用 BigQuery CLI 建立資料表快照時,快照會採用目的地資料集的預設加密金鑰。使用 SQL 建立資料表快照時,快照會與來源資料表使用相同的加密金鑰。
建立資料表快照
最佳做法是在與基礎資料表不同的資料集中建立資料表快照。這樣一來,即使基礎資料表的資料集不小心遭到刪除,也能從資料表快照還原基礎資料表。
建立資料表快照時,您必須指定要建立快照的資料表,以及資料表快照的專屬名稱。您可以視需要指定快照的時間和資料表快照的到期時間。
建立有到期時間的資料表快照
您可以透過下列任一選項,建立 24 小時後到期的資料表快照:
控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
點選左側窗格中的 「Explorer」。

如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。
在「Explorer」窗格中展開專案,依序點選「Datasets」(資料集) 和資料集。
依序點選「Overview」(總覽) >「Tables」(資料表),然後點選要建立快照的 資料表名稱。
在詳細資料窗格中,依序點選「更多」>「建立快照」。
在隨即顯示的「Create table snapshot」(建立資料表快照) 窗格中,輸入新資料表快照的「Project」(專案)、「Dataset」(資料集) 和「Table」(資料表) 資訊。
在「Expiration time」(到期時間) 欄位中,輸入從現在起 24 小時後的日期和時間。
按一下「儲存」。
SQL
使用 CREATE SNAPSHOT TABLE DDL 陳述式:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
CREATE SNAPSHOT TABLE SNAPSHOT_PROJECT_ID.SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME CLONE TABLE_PROJECT_ID.TABLE_DATASET_NAME.TABLE_NAME OPTIONS ( expiration_timestamp = TIMESTAMP 'TIMESTAMP_VALUE');
替換下列內容:
SNAPSHOT_PROJECT_ID:要建立快照的專案 ID。SNAPSHOT_DATASET_NAME:要在其中建立快照的資料集名稱。SNAPSHOT_NAME:要建立的快照名稱。TABLE_PROJECT_ID:專案 ID,用於存放您要建立快照的資料表。TABLE_DATASET_NAME:資料集名稱,其中包含您要建立快照的資料表。TABLE_NAME:要建立快照的資料表名稱。TIMESTAMP_VALUE:時間戳記值,代表 24 小時後的日期和時間。
按一下「 執行」。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
bq
在 Cloud Shell 中輸入下列指令:
bq cp \ --snapshot \ --no_clobber \ --expiration=86400 \ TABLE_PROJECT_ID:TABLE_DATASET_NAME.TABLE_NAME \ SNAPSHOT_PROJECT_ID:SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME
替換下列內容:
TABLE_PROJECT_ID:專案 ID,用於存放您要建立快照的資料表。TABLE_DATASET_NAME:資料集名稱,其中包含您要建立快照的資料表。TABLE_NAME:要建立快照的資料表名稱。SNAPSHOT_PROJECT_ID:要建立快照的專案 ID。SNAPSHOT_DATASET_NAME:要在其中建立快照的資料集名稱。SNAPSHOT_NAME:要建立的快照名稱。
必須使用 --no_clobber 旗標。
API
使用下列參數呼叫 jobs.insert 方法:
| 參數 | 值 |
|---|---|
projectId |
這項作業的計費專案 ID。 |
| 要求主體 | { "configuration": { "copy": { "sourceTables": [ { "projectId": "TABLE_PROJECT_ID", "datasetId": "TABLE_DATASET_NAME", "tableId": "TABLE_NAME" } ], "destinationTable": { "projectId": "SNAPSHOT_PROJECT_ID", "datasetId": "SNAPSHOT_DATASET_NAME", "tableId": "SNAPSHOT_NAME" }, "operationType": "SNAPSHOT", "writeDisposition": "WRITE_EMPTY", "destinationExpirationTime":"TIMESTAMP_VALUE" } } } |
替換下列內容:
TABLE_PROJECT_ID:專案 ID,用於存放您要建立快照的資料表。TABLE_DATASET_NAME:資料集名稱,其中包含您要建立快照的資料表。TABLE_NAME:要建立快照的資料表名稱。SNAPSHOT_PROJECT_ID:要建立快照的專案 ID。SNAPSHOT_DATASET_NAME:要在其中建立快照的資料集名稱。SNAPSHOT_NAME:要建立的快照名稱。TIMESTAMP_VALUE:時間戳記值,代表 24 小時後的日期和時間。
與資料表一樣,如果未指定到期時間,資料表快照會在預設資料表到期時間或包含資料表快照的資料集到期後失效。
使用時間旅行功能建立資料表快照
您可以使用下列任一選項,建立一小時前的資料表快照:
控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
點選左側窗格中的 「Explorer」。

在「Explorer」窗格中展開專案,依序點選「Datasets」(資料集) 和資料集。
依序點選「Overview」(總覽) >「Tables」(資料表),然後點選 要建立快照的資料表名稱。
在詳細資料窗格中,依序點選「更多」>「建立快照」。
在隨即顯示的「Create table snapshot」(建立資料表快照) 窗格中,輸入新資料表快照的「Project」(專案)、「Dataset」(資料集) 和「Table」(資料表) 資訊。
在「Snapshot time」(快照時間) 欄位中,輸入 1 小時前的日期和時間。
按一下「儲存」。
SQL
使用 CREATE SNAPSHOT TABLE DDL 陳述式和 FOR SYSTEM_TIME AS OF 子句:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
CREATE SNAPSHOT TABLE SNAPSHOT_PROJECT_ID.SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME CLONE TABLE_PROJECT_ID.TABLE_DATASET_NAME.TABLE_NAME FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR);
替換下列內容:
SNAPSHOT_PROJECT_ID:要建立快照的專案 ID。SNAPSHOT_DATASET_NAME:要在其中建立快照的資料集名稱。SNAPSHOT_NAME:要建立的快照名稱。TABLE_PROJECT_ID:專案 ID,用於存放您要建立快照的資料表。TABLE_DATASET_NAME:資料集名稱,其中包含您要建立快照的資料表。TABLE_NAME:要建立快照的資料表名稱。
按一下「 執行」。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
bq
在 Cloud Shell 中輸入下列指令:
bq cp \ --no_clobber \ --snapshot \ TABLE_PROJECT_ID:TABLE_DATASET_NAME.TABLE_NAME@-3600000 \ SNAPSHOT_PROJECT_ID:SNAPSHOT_DATASET_NAME.SNAPSHOT_NAME
替換下列內容:
TABLE_PROJECT_ID:專案 ID,用於存放您要建立快照的資料表。TABLE_DATASET_NAME:資料集名稱,其中包含您要建立快照的資料表。TABLE_NAME:要建立快照的資料表名稱。SNAPSHOT_PROJECT_ID:要建立快照的專案 ID。SNAPSHOT_DATASET_NAME:要在其中建立快照的資料集名稱。SNAPSHOT_NAME:要建立的快照名稱。
必須使用 --no_clobber 旗標。
API
使用下列參數呼叫 jobs.insert 方法:
| 參數 | 值 |
|---|---|
projectId |
這項作業的計費專案 ID。 |
| 要求主體 | { "configuration": { "copy": { "sourceTables": [ { "projectId": "TABLE_PROJECT_ID", "datasetId": "TABLE_DATASET_NAME", "tableId": "TABLE_NAME@-360000" } ], "destinationTable": { "projectId": "SNAPSHOT_PROJECT_ID", "datasetId": "SNAPSHOT_DATASET_NAME", "tableId": "SNAPSHOT_NAME" }, "operationType": "SNAPSHOT", "writeDisposition": "WRITE_EMPTY" } } } |
替換下列內容:
TABLE_PROJECT_ID:專案 ID,用於存放您要建立快照的資料表。TABLE_DATASET_NAME:資料集名稱,其中包含您要建立快照的資料表。TABLE_NAME:要建立快照的資料表名稱。SNAPSHOT_PROJECT_ID:要建立快照的專案 ID。SNAPSHOT_DATASET_NAME:要在其中建立快照的資料集名稱。SNAPSHOT_NAME:要建立的快照名稱。
如要進一步瞭解如何指定資料表的過往版本,請參閱「使用時間旅行功能存取歷來資料」。
資料表存取控管
如要控管 BigQuery 資料表的存取權,請參閱「使用 IAM 控管資源存取權」。
建立資料表快照時,資料表快照的資料表層級存取權設定如下:
- 如果資料表快照覆寫現有資料表,則會保留現有資料表的資料表層級存取權。標記不會從基礎資料表複製。
- 如果資料表快照是新資源,則資料表快照的資料表層級存取權,取決於建立資料表快照的資料集存取權政策。此外,標記會從基礎資料表複製到資料表快照。