使用时间点恢复 (PITR)

本页面介绍了如何使用时间点恢复 (PITR) 来恢复 Cloud SQL 主实例。

如需详细了解 PITR,请参阅 PITR

默认情况下,在您创建 Cloud SQL 企业 Plus 版实例时,系统会启用 PITR,无论您使用 Google Cloud 控制台、gcloud CLI、Terraform 还是 Cloud SQL Admin API。

如果您在 Google Cloud 控制台中创建 Cloud SQL 企业版实例,则 PITR 在默认情况下处于启用状态。否则,如果您使用 gcloud CLI、Terraform 或 Cloud SQL Admin API 创建实例,则必须手动启用 PITR。

用于 PITR 的日志存储

Cloud SQL 对 PITR 使用预写式日志记录 (WAL) 归档。

我们于 2023 年 1 月 9 日发布了在 Cloud Storage 中存储 PITR 的预写式日志的功能。自从此功能发布以来,以下条件适用:

  • 所有 Cloud SQL 企业 Plus 版实例都将其预写式日志存储在 Cloud Storage 中。只有您从 Cloud SQL 企业版升级且在 2023 年 1 月 9 日之前启用了 PITR 的 Cloud SQL 企业 Plus 版实例才会继续将其日志存储在磁盘上。
  • 您所创建并在 2023 年 1 月 9 日之前启用了 PITR 的 Cloud SQL 企业版实例会继续将其日志存储在磁盘上。
  • 您所创建并在 2023 年 1 月 9 日之后启用 PITR 的所有 Cloud SQL 企业版实例都将其日志存储在 Cloud Storage 中。

对于仅在磁盘上存储预写式日志的实例,您可以先停用 PITR,然后再重新启用 PITR,从而将日志从磁盘移动到 Cloud Storage。

日志保留期限

如需查看实例是否将用于 PITR 的日志存储在 Cloud Storage 中,请按照检查用于 PITR 的事务日志的存储位置操作。

使用 PostgreSQL 客户端(例如 psqlpgAdmin)连接到实例的数据库后,请运行以下命令:show archive_command。如果有任何预写式日志归档在 Cloud Storage 中,您会看到 -async_archive -remote_storage

所有其他启用了 PITR 的现有实例都会继续将其日志存储在磁盘上。在 Cloud Storage 中存储日志的更改会在之后生效。

如果日志存储在 Cloud Storage 中,则 Cloud SQL 每 5 分钟或更短时间上传一次日志。因此,如果 Cloud SQL 实例可用,则该实例可以恢复到最近时间。但是,如果实例不可用,则恢复点目标通常不超过 5 分钟。使用 gcloud CLI 或 Admin API 检查实例可恢复到的最近时间,并执行到该时间的恢复。

PITR 中使用的预写式日志会连同其关联的自动备份自动删除,通常是在满足为 transactionLogRetentionDays 设置的值后删除。这是 Cloud SQL 为进行 PITR 而保留的事务日志的天数。对于 Cloud SQL 企业 Plus 版,可以将保留事务日志的天数设置为 1 到 35 天;对于 Cloud SQL 企业版,可以将值设置为 1 到 7。

在启用 PITR 之前,在 Cloud SQL 实例上恢复备份时,您会丢失可用于实现 PITR 的预写式日志。

对于启用了客户管理的加密密钥 (CMEK) 的实例,系统会使用最新版本的 CMEK 加密预写式日志。如需执行恢复操作,应提供所有在为 retained-transaction-log-days 参数配置的天数内保持最新的密钥版本。

对于在 Cloud Storage 中存储预写式日志的实例,日志存储在主实例所在的区域中。此日志存储(对于 PITR 的最大时长,Cloud SQL 企业 Plus 版最多为 35 天,Cloud SQL 企业版最多为 7 天)不会为每个实例产生额外费用。

日志和磁盘使用量

如果实例启用了 PITR,并且磁盘上的预写式日志的大小导致实例出现问题:

  • 您可以停用然后重新启用 PITR,以确保新日志存储在 Cloud Storage 中与实例相同的区域处。但是,所有现有预写式日志都会被删除,因此您执行时间点恢复的时间不能早于您重新启用 PITR 的时间。

  • 您可以增加实例存储空间大小,但磁盘用量中的预写式日志大小的增加可能是临时的。

  • 我们建议启用存储空间自动扩容功能,以避免意外的存储问题。 仅当实例启用了 PITR 且日志存储在磁盘上时,此建议才适用。

  • 如果要删除日志并恢复存储空间,您可以停用 PITR。减少所使用的预写式日志不会缩小为实例预配的磁盘大小。

  • 日志每天完全清除一次,不会持续清除。将日志保留设置为两天意味着系统会保留至少两天、最多三天的日志。我们建议将备份数量设置为日志保留天数加 1,以保证日志至少保留指定的最少天数。

启用 PITR

当您在 Google Cloud 控制台中创建新实例时,自动备份启用时间点恢复都会自动启用。

以下过程会在现有主实例上启用 PITR。

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 打开要启用 PITR 的实例对应的“更多操作”菜单 “更多操作”图标。,然后点击修改
  3. 自定义实例下,展开数据保护部分。
  4. 选中启用时间点恢复复选框。
  5. 展开高级选项
  6. 输入保留日志的天数(对于 Cloud SQL 企业 Plus 版为 1-35,对于 Cloud SQL 企业版为 1-7)。
  7. 点击保存

gcloud

  1. 显示实例概览:
    gcloud sql instances describe INSTANCE_NAME
    
  2. 如果您在 backupConfiguration 部分中看到 enabled: false,请启用计划备份:
    gcloud sql instances patch INSTANCE_NAME \
    --backup-start-time=HH:MM
    

    使用 UTC±00 时区的 24 小时制时间指定 backup-start-time 参数。

  3. 启用 PITR:
    gcloud sql instances patch INSTANCE_NAME \
    --enable-point-in-time-recovery
    

    如果您要在主实例上启用 PITR,还可以通过添加以下参数来配置要保留事务日志的天数:

    --retained-transaction-log-days=RETAINED_TRANSACTION_LOG_DAYS
    
  4. 确认更改:
    gcloud sql instances describe INSTANCE_NAME

    backupConfiguration 部分,如果更改成功,您会看到 pointInTimeRecoveryEnabled: true

Terraform

如需启用 PITR,请使用 Terraform 资源

resource "google_sql_database_instance" "postgres_instance_pitr" {
  name             = ""
  region           = "us-central1"
  database_version = "POSTGRES_14"
  settings {
    tier = "db-custom-2-7680"
    backup_configuration {
      enabled                        = true
      point_in_time_recovery_enabled = true
      start_time                     = "20:55"
      transaction_log_retention_days = "3"
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

应用更改

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

删除更改

如需删除更改,请执行以下操作:

  1. 如需停用删除防护,请在 Terraform 配置文件中将 deletion_protection 参数设置为 false
    deletion_protection =  "false"
  2. 运行以下命令并在提示符处输入 yes,以应用更新后的 Terraform 配置:
    terraform apply
  1. 运行以下命令并在提示符处输入 yes,以移除之前使用 Terraform 配置应用的资源:

    terraform destroy

REST v1

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
  • INSTANCE_NAME:您为实现高可用性而配置的主实例或读取副本实例的名称
  • START_TIME:时间(以小时和分钟为单位)

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

请求 JSON 正文:

{
  "settings":
  {
    "backupConfiguration":
    {
      "startTime": "START_TIME",
      "enabled": true,
      "pointInTimeRecoveryEnabled": true
    }
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
  • INSTANCE_NAME:您为实现高可用性而配置的主实例或读取副本实例的名称
  • START_TIME:时间(以小时和分钟为单位)

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_NAME

请求 JSON 正文:

{
  "settings":
  {
    "backupConfiguration":
    {
      "startTime": "START_TIME",
      "enabled": true,
      "pointInTimeRecoveryEnabled": true
    }
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

获取最近的恢复时间

对于可用实例,您可以执行恢复到最近时间的 PITR。如果实例不可用,并且实例日志存储在 Cloud Storage 中,您可以检索最近的恢复时间并执行到该时间的 PITR。在这两种情况下,您都可以通过提供首选可用区的值来将实例恢复到其他可用区

gcloud

获取不可用的 Cloud SQL 实例可以恢复到的最近时间。

INSTANCE_NAME 替换为您要查询的实例的名称。

gcloud sql instances get-latest-recovery-time INSTANCE_NAME

REST v1

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:项目 ID
  • INSTANCE_NAME:您要查询最近恢复时间的实例的名称

HTTP 方法和网址:

GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME/getLatestRecoveryTime

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "kind": "sql#getLatestRecoveryTime",
  "latestRecoveryTime": "2023-06-20T17:23:59.648821586Z"
}

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:项目 ID
  • INSTANCE_NAME:您要查询最近恢复时间的实例的名称

HTTP 方法和网址:

GET https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_NAME/getLatestRecoveryTime

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "kind": "sql#getLatestRecoveryTime",
  "latestRecoveryTime": "2023-06-20T17:23:59.648821586Z"
}

执行 PITR

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 打开要恢复的实例对应的“更多操作”菜单 “更多操作”图标。,然后点击创建克隆
  3. (可选)在创建克隆页面上,更新新克隆的 ID。
  4. 选择从较早的时间点克隆
  5. 输入 PITR 时间。
  6. 点击创建克隆

gcloud

使用 PITR 创建克隆。

替换以下内容:

  • SOURCE_INSTANCE_NAME - 您要从中恢复的实例的名称。
  • NEW_INSTANCE_NAME - 克隆的名称。
  • TIMESTAMP - 源实例的 UTC 时区(采用 RFC 3339 格式)。例如 2012-11-15T16:19:00.094Z。
gcloud sql instances clone SOURCE_INSTANCE_NAME \
NEW_INSTANCE_NAME \
--point-in-time 'TIMESTAMP'

REST v1

在使用任何请求数据之前,请先进行以下替换:

  • project-id:项目 ID
  • target-instance-id:目标实例 ID
  • source-instance-id:源实例 ID
  • restore-timestamp:在恢复之前所处的时间点

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/source-instance-id/clone

请求 JSON 正文:

{
  "cloneContext":
  {
    "kind": "sql#cloneContext",
    "destinationInstanceName": "target-instance-id",
    "pointInTime": "restore-timestamp"
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • project-id:项目 ID
  • target-instance-id:目标实例 ID
  • source-instance-id:源实例 ID
  • restore-timestamp:在恢复之前所处的时间点

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/source-instance-id/clone

请求 JSON 正文:

{
  "cloneContext":
  {
    "kind": "sql#cloneContext",
    "destinationInstanceName": "target-instance-id",
    "pointInTime": "restore-timestamp"
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

停用 PITR

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 打开要停用的实例对应的“更多操作”菜单 “更多操作”图标。,然后选择修改
  3. 自定义实例下,展开数据保护部分。
  4. 清除启用时间点恢复
  5. 点击保存
  6. 在实例的概览页面中的配置下,PITR 设置被列为已停用。

gcloud

  1. 停用时间点恢复:
    gcloud sql instances patch INSTANCE_NAME \
    --no-enable-point-in-time-recovery
  2. 确认更改:
    gcloud sql instances describe INSTANCE_NAME
    

    backupConfiguration 部分,如果更改成功,您会看到 pointInTimeRecoveryEnabled: false

REST v1

在使用任何请求数据之前,请先进行以下替换:

  • project-id:项目 ID
  • instance-id:实例 ID

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id

请求 JSON 正文:

{
  "settings":
  {
    "backupConfiguration":
    {
      "enabled": false,
      "pointInTimeRecoveryEnabled": false
    }
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • project-id:项目 ID
  • instance-id:实例 ID

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

请求 JSON 正文:

{
  "settings":
  {
    "backupConfiguration":
    {
      "enabled": false,
      "pointInTimeRecoveryEnabled": false
    }
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

检查用于 PITR 的事务日志的存储位置

您可以检查 Cloud SQL 实例存储用于 PITR 的事务日志的位置。

gcloud

如需确定您的实例是将 PITR 的日志存储在磁盘还是 Cloud Storage 上,请使用以下命令:

   gcloud sql instances describe INSTANCE_NAME
   

INSTANCE_NAME 替换为实例名称。

在命令的输出中,transactionalLogStorageState 字段提供有关为实例存储 PITR 事务日志的位置的信息。可能的事务日志存储状态如下:

  • DISK:实例将用于 PITR 的事务日志存储在磁盘上。
  • CLOUD_STORAGE:实例将用于 PITR 的事务日志存储在 Cloud Storage 中。

设置事务日志保留

如需设置保留预写式日志的天数,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 打开要为其设置事务日志的实例对应的“更多操作”菜单 “更多操作”图标。,然后选择修改
  3. 自定义实例下,展开数据保护部分。
  4. 启用时间点恢复部分中,展开高级选项
  5. 输入保留日志的天数(对于 Cloud SQL 企业 Plus 版为 1-35,对于 Cloud SQL 企业版为 1-7)。
  6. 点击保存

gcloud

修改实例以设置保留预写日志的天数。

替换以下内容:

  • INSTANCE-NAME - 要为其设置事务日志的实例的名称。
  • DAYS-TO-RETAIN - 要保留的事务日志的天数。对于 Cloud SQL 企业 Plus 版,有效范围介于 1 到 35 天之间,默认值为 14 天。对于 Cloud SQL 企业版,有效范围介于 1 到 7 天之间,默认值为 7 天。如果未指定任何值,则使用默认值。仅在启用 PITR 时有效。保留更多天数的事务日志需要更大的存储空间。

  gcloud sql instances patch INSTANCE-NAME \
    --retained-transaction-log-days=DAYS-TO-RETAIN
  

REST v1

在使用任何请求数据之前,请先进行以下替换:

  • days-to-retain:保留事务日志的天数(1 到 7 天)
  • project-id:项目 ID
  • instance-id:实例 ID

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id

请求 JSON 正文:

{
  "settings":
  {
    "backupConfiguration":
    {
      "transactionLogRetentionDays": "days-to-retain"
    }
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • days-to-retain:保留事务日志的天数(1 到 7 天)
  • project-id:项目 ID
  • instance-id:实例 ID

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

请求 JSON 正文:

{
  "settings":
  {
    "backupConfiguration":
    {
      "transactionLogRetentionDays": "days-to-retain"
    }
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

后续步骤