使用 gcloud CLI 备份和恢复数据库

本页面介绍如何将 Spanner 备份和恢复与 Google Cloud CLI 搭配使用。

前提条件

本页中的示例进行如下假设:

  • 您已经设置 gcloud CLI 以便与 Spanner 搭配使用。如果您刚开始将 Google Cloud CLI 与 Spanner 搭配使用,请参阅通过 Google Cloud CLI 开始使用 Spanner

  • 您已使用默认项目配置 Google Cloud CLI。例如:

    gcloud config set core/project my-project
    
  • 您有一个名为 test-instance 的实例和一个名为 example-db 的数据库。

创建备份

如需创建名为 example-db-backup-6 的备份并让其在 1 年后过期,请使用 gcloud spanner backups create

   gcloud spanner backups create example-db-backup-6 --instance=test-instance \
      --database=example-db --retention-period=1y --async

以下是一些使用说明:

  • 如需设置备份的到期日期,请指定 --retention-period--expiration-date 标志。如需了解日期语法,请参阅 gcloud topic DateTimes
  • 备份的名称在实例中必须是唯一的。
  • 由于 --async 标志,该命令会立即返回。如果没有此标记,该命令将等待备份操作完成。
  • 请指定 --help 标志以获取有关任何命令的帮助。

    输出类似于以下内容:

    Create request issued for: [example-db-backup-6]
    Check operation [projects/my-project/instances/test-instance/backups/example-db-backup-6/operations/_auto_op_234567] for status.
    

    如需检查备份操作的进度,请参阅检查操作进度

复制备份

如需将备份复制到同一项目中的其他实例,请执行以下操作:

gcloud spanner backups copy \
    --source-instance=test-instance \
    --source-backup=example-db \
    --destination-instance=backup-instance \
    --destination-backup=copied-backup \
    --expiration-date=2022-03-30T10:49:41Z

如需将备份复制到其他项目中的其他实例,请执行以下操作:

gcloud spanner backups copy \
  --source-backup=projects/my-project/instances/test-instance/backups/example-db \
  --destination-backup=projects/backup-project/instances/backup-instance-eu/backups/copied-backup \
  --expiration-date=2022-03-30T10:49:41Z

使用说明:

  • 如果您选择将备份复制到同一项目中的其他实例,则必须为复制的备份创建一个新实例(或准备一个实例)。在前面的示例中,使用了 backup-instance。您无法在备份复制操作过程中创建新实例。
  • 如果您选择将备份复制到其他项目,则必须将另一个项目拥有自己的实例,以便用于复制的备份。在前面的示例中使用的是 backup-project。您无法在备份复制操作中创建新项目。
  • 备份的到期时间必须至少为处理当前复制请求后的六个小时,最迟为源备份 create_time 后的 366 天。

输出类似于以下内容:

createTime: '2022-03-29T22:06:05.905823Z'
database: projects/my-project/instances/test-instance/databases/example-db
databaseDialect: GOOGLE_STANDARD_SQL
encryptionInfo:
  encryptionType: GOOGLE_DEFAULT_ENCRYPTION
expireTime: '2022-03-30T10:49:41Z'
maxExpireTime: '2023-03-17T20:46:33.479336Z'
name: projects/backup-project/instances/backup-instance-eu/backups/copied-backup
sizeBytes: '7957667'
state: READY
versionTime: '2022-03-16T20:46:33.479336Z'

如需检查复制操作的进度,请参阅检查操作进度

从备份中恢复数据库

如需恢复数据库,请使用 gcloud spanner databases restore

gcloud spanner databases restore --async \
    --destination-instance=test-instance --destination-database=example-db-restored \
    --source-instance=test-instance --source-backup=example-db-backup-6

使用说明:

  • 由于 --async 标志,该命令会立即返回。如果没有此标志,该命令将等待恢复操作完成。
  • 如果来源实例和目标实例不同,则它们必须具有相同的实例配置
  • 如果目标数据库已存在,则操作将失败。

输出类似于以下内容:

Restore database in progress. Operation name=projects/my-project/instances/test-instance/databases/example-db-restored-1/operations/_auto_op_bb8e360b256b04bf

如需跟踪恢复操作的进度,请参阅检查操作进度

查看操作进度

使用 gcloud spanner operations describe 检查操作的进度。

  1. 获取操作 ID:

    gcloud spanner operations list --instance=INSTANCE-NAME \
    --database=DATABASE-NAME --type=BACKUP
    

    替换以下内容:

    • INSTANCE-NAME 替换为 Spanner 实例名称。
    • DATABASE-NAME 替换为数据库的名称。

    使用说明:

    • 要限制列表,请指定 --filter 标志。例如:

      • --filter="metadata.name:example-db" 仅列出对特定数据库的操作。
      • --filter="error:*" 仅列出失败的备份操作。

      如需了解过滤条件语法,请参阅 gcloud topic filters。如需了解如何过滤备份操作,请参阅 ListBackupOperationsRequest 中的 filter 字段。

    • --type 标志不区分大小写。

    输出类似于以下内容:

    OPERATION_ID               DONE  @TYPE                 BACKUP               SOURCE_DATABASE  START_TIME                   END_TIME
    _auto_op_123456  True  CreateBackupMetadata  example-db-backup-7  example-db       2020-02-04T02:12:38.075515Z  2020-02-04T02:22:40.581170Z
    _auto_op_234567  True  CreateBackupMetadata  example-db-backup-6  example-db       2020-02-04T02:05:43.920377Z  2020-02-04T02:07:59.089820Z
      ```
    
  2. 运行 gcloud spanner operations describe

    gcloud spanner operations describe OPERATION-ID \
    --instance=INSTANCE-NAME \
    --backup=BACKUP-NAME \
    

    替换以下内容:

    • OPERATION-ID:您要检查的操作的操作 ID。
    • INSTANCE-NAME:Spanner 实例名称。
    • BACKUP-NAME:Spanner 备份名称。

    输出中的 progress 部分显示操作完成百分比。输出类似于以下内容:

    done: true
    metadata:
    ...
    progress:
    - endTime: '2022-03-01T00:28:06.691403Z'
      progressPercent: 100
      startTime: '2022-03-01T00:28:04.221401Z'
    - endTime: '2022-03-01T00:28:17.624588Z'
      startTime: '2022-03-01T00:28:06.691403Z'
      progressPercent: 100
    ...
    

如果操作花费的时间过长,您可以取消操作。如需了解详情,请参阅取消长时间运行的备份操作

获取备份信息

要获取备份的相关信息,请使用:

gcloud spanner backups describe example-db-backup-6 --instance=test-instance

输出类似于以下内容:

createTime: '2020-02-04T02:05:43.920377Z'
database: projects/my-project/instances/test-instance/databases/example-db
expireTime: '2021-02-04T02:05:43.268327Z'
name: projects/my-project/instances/test-instance/backups/example-db-backup-6
sizeBytes: '1000000000'
state: READY

如需详细了解此命令,请参阅 gcloud spanner backups describe

列出备份

要列出实例中的所有备份,请使用:

gcloud spanner backups list --instance=test-instance

输出类似于以下内容:

BACKUP               SOURCE_DATABASE  CREATION_TIME                EXPIRATION_TIME              STATE  BACKUP_SIZE_IN_BYTES  IN_USE_BY
example-db-backup-6  example-db       2020-02-04T02:05:43.920377Z  2021-02-04T02:05:43.268327Z  CREATING
example-db-backup-4  example-db       2020-02-04T01:21:20.873839Z  2021-02-04T01:21:20.530151Z  READY  32
example-db-backup-3  example-db       2020-02-03T23:59:18.936433Z  2021-02-03T23:59:18.203083Z  READY  32
example-db-backup-5  example-db       2020-02-03T23:48:06.259296Z  2021-02-03T23:48:05.830937Z  READY  32
example-db-backup-2  example-db       2020-01-30T19:49:00.616338Z  2021-01-30T19:49:00.283917Z  READY  32
example-db-backup-1  example-db       2020-01-30T19:47:09.492551Z  2021-01-30T19:47:09.097804Z  READY  32

要限制列表,请指定 --filter 标志。例如,--filter="state:creating" 仅列出仍在创建中的备份。 如需了解过滤条件语法,请参阅 gcloud topic filters。如需了解如何过滤备份,请参阅 ListBackupsRequest 中的 filter 字段。

如需详细了解此命令,请参阅 gcloud spanner backups list

更新备份元数据

要更新备份的到期日期,请执行以下操作:

gcloud spanner backups update-metadata example-db-backup-6 \
    --instance=test-instance --expiration-date=2020-05-05T00:00:00Z

输出类似于以下内容:

createTime: '2020-02-04T02:05:43.920377Z'
database: projects/my-project/instances/test-instance/databases/example-db
expireTime: '2020-05-05T00:00:00Z'
name: projects/my-project/instances/test-instance/backups/example-db-backup-6
sizeBytes: '1000000000'
state: READY

如需详细了解此命令,请参阅 gcloud spanner backups update-metadata

删除备份

要删除备份,请使用:

gcloud spanner backups delete example-db-backup-1 --instance=test-instance

您必须确认操作:

You are about to delete backup [example-db-backup-1]

Do you want to continue (Y/n)?  Y

Deleted backup [example-db-backup-1].

如需详细了解此命令,请参阅 gcloud spanner backups delete