使用时间点恢复 (PITR)

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

如需详细了解 PITR, 请参阅时间点恢复 (PITR)

用于 PITR 的日志存储

我们于 2024 年 5 月 31 日发布了在 Cloud Storage 中存储 PITR 事务日志的功能。自从此功能发布以来,以下条件适用:

  • 您在此日期之前创建的所有 Cloud SQL 实例都会将用于 PITR 的事务日志存储在磁盘上,前提是这些实例在创建时启用了 PITR。

  • 在此日期当天或之后创建且启用了 PITR 的所有 Cloud SQL 实例都会将这些日志存储在 Cloud Storage 中。

事务日志会定期更新,并且会占用一定的存储空间。Cloud SQL 会自动删除事务日志及其关联的自动备份。此操作在满足为 transactionLogRetentionDays 参数设置的值之后发生。如需详细了解此参数,请参阅日志和磁盘用量

对于仅在磁盘上存储事务日志的实例,您可以先停用 PITR,然后再重新启用 PITR,从而将 Cloud SQL 配置为在 Cloud Storage 上存储日志。您无法将日志从 Cloud Storage 移回磁盘。

如需确保实例的日志存储在 Cloud Storage 中(而不是存储在磁盘上),请完成以下操作:

日志和磁盘使用量

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

Cloud SQL 会定期生成事务日志,这些日志会占用存储空间。Cloud SQL 会自动删除事务日志及其关联的自动备份。此操作在满足为 transactionLogRetentionDays 参数设置的值之后发生。此参数指定 Cloud SQL 保留事务日志的天数。对于 Cloud SQL 企业 Plus 版,您可以将保留事务日志的天数设置为 1 到 35 天;对于 Cloud SQL 企业版,您可以将此值设置为 1 到 7。

如需了解事务日志使用了多少磁盘,请检查实例的 bytes_used_by_data_type 指标。该数据类型的值会返回磁盘上事务日志的大小。对于在磁盘上存储用于 PITR 的事务日志的实例,Cloud SQL 每天都会从磁盘中完全清除数据,以满足 transactionLogRetentionDays PITR 设置,如自动备份保留中所述。

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

  • 您可以停用然后重新启用 PITR,以确保日志存储在与实例位于同一区域的 Cloud Storage 中。但是,所有现有日志都会被删除,因此您执行时间点恢复的时间不能早于您重新启用 PITR 的时间。
  • 您可以增加实例存储空间大小,但磁盘用量中的事务日志大小的增加可能是临时的。
  • 我们建议启用存储空间自动扩容功能,以避免意外的存储问题。仅当实例启用了 PITR 且日志存储在磁盘上时,此建议才适用。
  • 如果要删除日志并恢复存储空间,您可以停用 PITR,而不重新启用它。但是,减小所占用的存储空间不会缩小为实例预配的磁盘大小。
  • 日志每天完全清除一次,不会持续清除。将日志保留设置为两天意味着系统会保留至少两天、最多三天的日志。我们建议将备份数量设置为日志保留天数加 1。

    例如,如果您为 transactionLogRetentionDays 参数的值指定 7,则对于 backupRetentionSettings 参数,请将 retainedBackups 的数量设置为 8

如需详细了解 PITR,请参阅时间点恢复 (PITR)

用于 PITR 的数据库恢复模型

当您在实例上启用 PITR 时,Cloud SQL 会自动将现有数据库和后续数据库的恢复模型设置为完整恢复模型。

如需详细了解 SQL Server 恢复模型,请参阅 Microsoft 文档

启用 PITR

当您在 Google Cloud 控制台中创建新实例时,系统会自动启用自动备份设置。

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

控制台

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

    转到“Cloud SQL 实例”

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

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

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

控制台

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

    转到“Cloud SQL 实例”

  2. 打开要恢复的实例对应的“更多操作”菜单 “更多操作”图标。,然后点击创建克隆
  3. (可选)在创建克隆页面上,更新新克隆的 ID。
  4. 选择从较早的时间点克隆
  5. 输入 PITR 时间。
  6. 选择所有数据库,或指定数据库名称。
    如果您指定数据库名称,则只能选择一个名称。默认情况下,PITR 会用于所有数据库。
  7. 点击创建克隆

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:在恢复之前所处的时间点

在 JSON 请求中,您可以选择按如下所示最多指定一个特定数据库名称:"databaseNames": "my-database"

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:在恢复之前所处的时间点

在 JSON 请求中,您可以选择按如下所示最多指定一个特定数据库名称:"databaseNames": "my-database"

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. 点击保存

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 替换为实例名称。

您还可以查看同一项目中多个实例的交易日志的存储位置。 如需确定多个实例的位置,请使用以下命令:

   gcloud sql instances list --show-transactional-log-storage-state
   

示例响应:

NAME  DATABASE_VERSION         LOCATION       TRANSACTIONAL_LOG_STORAGE_STATE
my_01 SQLSERVER_2019_STANDARD  us-central-1   DISK
my_02 SQLSERVER_2019_STANDARD  us-central-1   CLOUD_STORAGE
...
   

在命令的输出中,transactionalLogStorageState 字段或 TRANSACTIONAL_LOG_STORAGE_STATE 列提供有关为实例存储 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

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

  • PROJECT_ID:项目 ID。
  • INSTANCE_ID:实例 ID。
  • DAYS_TO_RETAIN:要保留事务日志的天数。对于 Cloud SQL 企业 Plus 版,有效范围介于 1 到 35 天之间,默认值为 14 天。对于 Cloud SQL 企业版,有效范围介于 1 到 7 天之间,默认值为 7 天。

    如果未指定任何值,则使用默认值。仅在启用 PITR 时有效。保留更多天数的事务日志需要更大的存储空间。

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "settings":
  {
    "backupConfiguration":
    {
      "transactionLogRetentionDays": "DAYS_TO_RETAIN"
    }
  }
}

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

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

REST v1beta4

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

  • PROJECT_ID:项目 ID。
  • INSTANCE_ID:实例 ID。
  • DAYS_TO_RETAIN:要保留事务日志的天数。对于 Cloud SQL 企业 Plus 版,有效范围介于 1 到 35 天之间,默认值为 14 天。对于 Cloud SQL 企业版,有效范围介于 1 到 7 天之间,默认值为 7 天。

    如果未指定任何值,则使用默认值。仅在启用 PITR 时有效。保留更多天数的事务日志需要更大的存储空间。

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "settings":
  {
    "backupConfiguration":
    {
      "transactionLogRetentionDays": "DAYS_TO_RETAIN"
    }
  }
}

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

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

问题排查

问题 问题排查

argument --point-in-time: Failed to parse date/time:
Unknown string format: 2021-0928T30:54:03.094;
received: 2021-0928T30:54:03.094Z

Invalid value at 'body.clone_context.point_in_time'
(type.googleapis.com/google.protobuf.Timestamp), Field 'pointInTime',
Invalid time format: Failed to parse input,

您提供的时间戳无效。

HTTP Error 400: Successful backup required for carrying out the operation was not found.

Successful backup required for carrying out the operation was not found. or Time where no backups can be found.

您提供的时间戳是找不到备份或二进制日志坐标的时间。

后续步骤