本页面介绍了如何使用时间点恢复 (PITR) 来保留和恢复 Spanner 中的数据。
如需了解详情,请参阅时间点恢复。
前提条件
本指南使用 Spanner 快速入门中定义的数据库和架构。您可以浏览快速入门以创建数据库和架构,也可以修改命令以配合您自己的数据库使用。
设置保留期限
如需设置数据库的保留期限,请执行以下操作:
控制台
前往 Google Cloud 控制台中的“Spanner 实例”页面。
点击包含数据库的实例,打开其概览页面。
点击数据库打开其概览页面。
选择备份/恢复标签页。
点击版本保留期限字段中的铅笔图标。
输入保留期限的数量和时间单位,然后点击更新。
gcloud
使用 ALTER DATABASE 语句更新数据库的架构。例如:
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER DATABASE `example-db` SET OPTIONS (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 小时的默认保留期限,您可以将
将“
version_retention_period
”数据库选项设为NULL
for GoogleSQL 数据库或DEFAULT
(对于 PostgreSQL 数据库)。 - 如果您延长保留期限,系统就不会回填先前的数据版本。例如,如果您将保留期限从 1 小时延长到 24 小时,则必须等待 23 小时,以便系统累积较早的数据,然后才可以恢复过去 24 小时内的数据。
获取保留期限和最早版本时间
数据库资源包含两个字段:
version_retention_period
:Spanner 为数据库保留所有版本数据的时间段。earliest_version_time
:可读取数据库中旧版数据的最早时间戳。该值会由 Spanner 不断更新,并且会在查询时过时。如果您使用该值恢复数据,请确保计算从发出查询到查询恢复那一刻这段时间。
控制台
转到 Google Cloud 控制台中的 Spanner 实例页面。
点击包含数据库的实例,打开其概览页面。
点击数据库打开其概览页面。
选择备份/恢复标签页以打开备份/恢复页面并显示保留期限。
点击创建以打开创建备份页面并显示最早版本时间。
gcloud
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 控制台中的数据库详细信息页面。
在备份/恢复标签页中,点击创建。
勾选从较早的时间点创建备份 (Create backup from an earlier point in time) 复选框。
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/docs/guides/templates/provided-batch#cloud_spanner_to_gcs_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 to Spanner](/dataflow/docs/guides/templates/provided-batch#gcs_avro_to_cloud_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 天 (168h) 中写入的 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;
请注意,该查询提供了粗略的估计,可能因为以下原因而不准确:
- 该查询不考虑必须为每个版本的旧数据存储的时间戳。如果您的数据库包含许多小型数据类型,则查询可能会低估存储空间的增长。
- 该查询包括所有写入操作,但只有更新操作会创建旧版数据。如果您的工作负载包含很多插入操作,则查询可能会高估存储空间增长。