本頁面說明如何使用時間點復原 (PITR) 功能,保留及復原 GoogleSQL 方言資料庫和 PostgreSQL 方言資料庫中的資料。
詳情請參閱「時間點復原」。
必要條件
本指南會使用 Spanner 快速入門導覽課程中定義的資料庫和結構定義。您可以執行快速入門導覽來建立資料庫和結構定義,也可以修改指令,以便搭配自己的資料庫使用。
設定保留期限
如要設定資料庫的保留期限,請按照下列步驟操作:
控制台
前往Google Cloud 控制台的 Spanner 執行個體頁面。
按一下包含資料庫的執行個體,開啟「Overview」(總覽) 頁面。
按一下資料庫,開啟「總覽」頁面。
選取「備份/還原」分頁標籤。

按一下「版本保留期限」欄位中的鉛筆圖示。
輸入保留期限的數量和時間單位,然後按一下「更新」。
gcloud
使用 ALTER DATABASE 陳述式更新資料庫的結構定義。例如:
gcloud spanner databases ddl update example-db \
--instance=test-instance \
--ddl="ALTER DATABASE \"example-db\" \
SET spanner.version_retention_period = '7d';"輸出內容如下所示:
ALTER DATABASE "example-db" SET "spanner.version_retention_period" = '7d';如要查看保留期限,請取得資料庫的 DDL:
gcloud spanner databases ddl describe example-db \
--instance=test-instance輸出內容如下所示:
ALTER DATABASE example-db SET OPTIONS (
version_retention_period = '7d'
);
...
用戶端程式庫
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
使用須知:
- 保留期限必須介於 1 小時至 7 天之間,且可以天、小時、分鐘或秒為單位指定。舉例來說,
1d、24h、1440m和86400s的值是等效的。 - 如果您已在專案中啟用 Spanner API 的記錄功能,系統會將事件記錄為 UpdateDatabaseDdl,並顯示在記錄檢視器中。
- 如要還原為 1 小時的預設保留期限,您可以將 GoogleSQL 資料庫的
version_retention_period資料庫選項設為NULL,或將 PostgreSQL 資料庫的version_retention_period資料庫選項設為DEFAULT。 - 延長保留期限後,系統不會回填先前的資料版本。舉例來說,如果將保留期限從 1 小時延長至 24 小時,系統必須累積舊資料 23 小時,您才能還原 24 小時前的資料。
取得保留期限和最早版本時間
version_retention_period:Spanner 保留資料庫所有資料版本的時間長度。earliest_version_time:可從資料庫讀取舊版資料的最早時間戳記。Spanner 會持續更新這個值,但查詢時會過時。如果您使用這個值來復原資料,請務必考量從查詢值到啟動復原作業之間的時間。
控制台
前往 Google Cloud 控制台的 Spanner 執行個體頁面。
按一下包含資料庫的執行個體,開啟「Overview」(總覽) 頁面。
按一下資料庫,開啟「總覽」頁面。
選取「備份/還原」分頁,開啟「備份/還原」頁面,並顯示保留期限。

按一下「建立」,開啟「建立備份」頁面,並顯示最早的版本時間。

gcloud
您可以呼叫「describe databases」或「list databases」來取得這些欄位。例如:
gcloud spanner databases describe example-db \
--instance=test-instance輸出內容如下所示:
createTime: '2020-09-07T16:56:08.285140Z'
earliestVersionTime: '2020-10-07T16:56:08.285140Z'
name: projects/my-project/instances/test-instance/databases/example-db
state: READY
versionRetentionPeriod: 3d
復原部分資料庫
執行過時讀取,並指定所需的復原時間戳記。請確認您指定的時間戳記比資料庫的
earliest_version_time.gcloud
使用 execute-sql 例如:
gcloud spanner databases execute-sql example-db \ --instance=test-instance \ --read-timestamp=2020-09-11T10:19:36.010459-07:00 \ --sql='SELECT * FROM SINGERS'用戶端程式庫
請參閱執行過時讀取。
儲存查詢結果。這是必要步驟,因為您無法在同一項交易中,將查詢結果寫回資料庫。如果資料量較少,可以列印到控制台或儲存在記憶體中。如果資料量較大,可能需要寫入本機檔案。
將復原的資料寫回需要復原的表格。例如:
gcloud
gcloud spanner rows update --instance=test-instance \ --database=example-db --table=Singers \ --data=SingerId=1,FirstName='Marc'詳情請參閱使用 gcloud 更新資料。
用戶端程式庫
詳情請參閱使用 DML 更新資料或使用變異更新資料。
(選用) 如要在寫回資料前對復原的資料進行分析,您可以在同一個資料庫中手動建立臨時資料表,先將復原的資料寫入這個臨時資料表,然後進行分析,再從這個臨時資料表讀取要復原的資料,並寫入需要復原的資料表。
復原整個資料庫
您可以使用「備份與還原」或「匯入與匯出」,並指定復原時間戳記,復原整個資料庫。
備份與還原
建立備份,並將
version_time設為所需的復原時間戳記。控制台
前往 Cloud 控制台的「資料庫詳細資料」頁面。
在「備份/還原」分頁中,按一下「建立」。
勾選「從較早的時間點建立備份」方塊。

gcloud
gcloud spanner backups create example-db-backup-1 \ --instance=test-instance \ --database=example-db \ --retention-period=1y \ --version-time=2021-01-22T01:10:35Z --async詳情請參閱「使用 gcloud 建立備份」。
用戶端程式庫
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
從備份還原至新資料庫。請注意,Spanner 會將備份的保留期限設定保留至還原的資料庫。
控制台
前往 Cloud 控制台的「執行個體詳細資料」頁面。
在「備份/還原」分頁中選取備份,然後按一下「還原」。
gcloud
gcloud spanner databases restore --async \ --destination-instance=destination-instance --destination-database=example-db-restored \ --source-instance=test-instance --source-backup=example-db-backup-1詳情請參閱「從備份還原資料庫」。
用戶端程式庫
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
匯入及匯出
- 匯出資料庫,並將
snapshotTime參數指定為所需的復原時間戳記。控制台
前往 Cloud 控制台的「執行個體詳細資料」頁面。
在「匯入/匯出」分頁中,按一下「匯出」。
勾選「匯出過去時間點的資料庫」方塊。

如需詳細操作說明,請參閱匯出資料庫。
gcloud
使用 Spanner to Avro Dataflow 範本匯出資料庫。
gcloud dataflow jobs run JOB_NAME \ --gcs-location='gs://cloud-spanner-point-in-time-recovery/Import Export Template/export/templates/Cloud_Spanner_to_GCS_Avro' --region=DATAFLOW_REGION \ --parameters='instanceId=test-instance,databaseId=example-db,outputDir=YOUR_GCS_DIRECTORY,snapshotTime=2020-09-01T23:59:40.125245Z'使用須知:
- 您可以在 Dataflow 主控台中追蹤匯入和匯出工作的進度。
- Spanner 保證匯出的資料在指定時間戳記具有外部和交易一致性。
- 請以 RFC 3339 格式指定時間戳記。例如:2020-09-01T23:59:30.234233Z。
- 請確認您指定的時間戳記比資料庫的
earliest_version_time新。如果指定時間戳記的資料已不存在,系統會顯示錯誤訊息。
匯入新資料庫。
控制台
前往 Cloud 控制台的「執行個體詳細資料」頁面。
在「匯入/匯出」分頁中,按一下「匯入」。
如需詳細的操作說明,請參閱「匯入 Spanner Avro 檔案」。
gcloud
使用 Cloud Storage Avro 到 Spanner Dataflow 範本匯入 Avro 檔案。
gcloud dataflow jobs run JOB_NAME \ --gcs-location='gs://cloud-spanner-point-in-time-recovery/Import Export Template/import/templates/GCS_Avro_to_Cloud_Spanner' \ --region=DATAFLOW_REGION \ --staging-location=YOUR_GCS_STAGING_LOCATION \ --parameters='instanceId=test-instance,databaseId=example-db,inputDir=YOUR_GCS_DIRECTORY'
預估儲存空間增加量
提高資料庫的版本保留期限前,您可以先加總所需時間範圍內的交易位元組,預估資料庫儲存空間使用率的預期增幅。舉例來說,下列查詢會從交易統計資料表讀取資料,計算過去 7 天 (168 小時) 寫入的 GiB 數量。
GoogleSQL
SELECT
SUM(bytes_per_hour) / (1024 * 1024 * 1024 ) as GiB
FROM (
SELECT
((commit_attempt_count - commit_failed_precondition_count - commit_abort_count) * avg_bytes)
AS bytes_per_hour, interval_end
FROM
spanner_sys.txn_stats_total_hour
ORDER BY
interval_end DESC
LIMIT
168);
PostgreSQL
SELECT
bph / (1024 * 1024 * 1024 ) as GiB
FROM (
SELECT
SUM(bytes_per_hour) as bph
FROM (
SELECT
((commit_attempt_count - commit_failed_precondition_count - commit_abort_count) * avg_bytes)
AS bytes_per_hour, interval_end
FROM
spanner_sys.txn_stats_total_hour
ORDER BY
interval_end DESC
LIMIT
168)
sub1) sub2;
請注意,這項查詢提供的是粗略估計值,可能因下列原因而有誤差:
- 查詢不會將每個舊版資料必須儲存的時間戳記納入考量。如果資料庫包含許多小型資料類型,查詢可能會低估儲存空間增加量。
- 查詢會包含所有寫入作業,但只有更新作業會建立資料的先前版本。如果工作負載包含大量插入作業,查詢可能會高估儲存空間增加量。