执行时间点恢复 (PITR)

无论 Cloud SQL 主实例处于有效状态还是已删除,您都可以使用时间点恢复 (PITR) 来恢复该实例。借助 PITR,您可以将实例恢复到特定的时间点。对于已删除的实例,您可以将该实例恢复到特定时间点的新实例或现有实例。

Cloud SQL 提供以下选项来使用 PITR 恢复实例:

如需对不可用或已删除的实例执行 PITR,您需要找到最近和最早恢复时间。

执行 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

如果您的 Cloud SQL 实例已启用增强型备份,则可以使用备份保险柜对该实例执行时间点恢复。

控制台

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

    转到“Cloud SQL 实例”

  2. 打开要恢复的实例对应的“更多操作”菜单 “更多操作”图标。,然后点击创建克隆。

  3. 选择从较早的时间点克隆。

  4. 输入 PITR 时间。

  5. 点击创建克隆。

gcloud

如需对备份保险柜中的实例执行 PITR,您需要找到最接近要执行 PITR 的时间的备份的 data-source。如需查找备份,请参阅列出备份保险柜中实例的所有备份。确定备份后,运行以下命令以执行 PITR:

gcloud sql instances point-in-time-restore DATA_SOURCE
PITR_TIMESTAMP
--project=TARGET_PROJECT

替换以下内容:

  • DATA_SOURCE:最接近您要恢复到的 PITR 时间戳的备份的 data-source 路径。
  • PITR_TIMESTAMP:您要将实例恢复到的源实例 PITR 日志的 UTC 时间戳,采用 RFC 3339 格式。例如 2012-11-15T16:19:00.094Z。
  • TARGET_PROJECT:Cloud SQL 实例的项目 ID。

REST v1

REST v1beta4

对不可用实例执行 PITR

控制台

由于以下原因,您可能需要将不可用的实例恢复到其他可用区:

  • 配置了实例的可用区无法访问。此实例处于 FAILED 状态。
  • 实例正在进行维护。此实例处于 MAINTENANCE 状态。

如需恢复不可用的实例,请完成以下步骤:

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

    转到“Cloud SQL 实例”

  2. 找到要克隆的实例的行。
  3. 在操作列中,点击 更多操作菜单。
  4. 点击创建克隆。
  5. 在创建克隆页面上,完成以下操作:
    1. 在实例 ID 字段中,根据需要更新实例 ID。
    2. 点击从较早的时间点克隆。
    3. 在时间点字段中,选择要克隆数据的日期和时间。这将恢复该时间点的实例状态。
    4. 点击创建克隆。
  6. 克隆初始化时,您将返回到实例列表页面。

gcloud

由于配置了实例的可用区无法访问,您可能需要将不可用的实例恢复到其他可用区。

gcloud sql instances clone SOURCE_INSTANCE_NAME TARGET_INSTANCE_NAME \
--point-in-time DATE_AND_TIME_STAMP \
--preferred-zone ZONE_NAME \
--preferred-secondary-zone SECONDARY_ZONE_NAME

运行 gcloud sql instances clone 命令的用户或服务账号必须拥有 cloudsql.instances.clone 权限。如需详细了解运行 gcloud CLI 命令所需的权限,请参阅 Cloud SQL 权限。

REST v1

由于配置了实例的可用区无法访问,您可能需要将不可用的实例恢复到其他可用区。

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

  • PROJECT_ID:项目 ID。
  • SOURCE_INSTANCE_NAME:源实例的名称。
  • TARGET_INSTANCE_NAME:目标(克隆)实例的名称。
  • DATE_AND_TIME_STAMP:源实例的日期和时间戳,采用世界协调时间 (UTC) 时区和 RFC 3339 格式(例如
    2012-11-15T16:19:00.094Z)。
  • ZONE_NAME:可选。目标实例的主可用区的名称。这用于指定与您要克隆的 Cloud SQL 实例不同的主要可用区。对于区域实例,此可用区会替换主要可用区,但次要可用区与该实例相同。
  • SECONDARY_ZONE_NAME:可选。目标实例的次要可用区的名称。这用于指定与您要克隆的 Cloud SQL 实例不同的次要可用区。

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/SOURCE_INSTANCE_NAME/clone

请求 JSON 正文:

{
  "cloneContext":
  {
    "destinationInstanceName": "TARGET_INSTANCE_NAME",
    "pointInTime": "DATE_AND_TIME_STAMP",
    "preferredZone": "ZONE_NAME",
    "preferredSecondaryZone": "SECONDARY_ZONE_NAME"
  }
}

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

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

使用 instances.clone API 方法的用户或服务账号必须拥有 cloudsql.instances.clone 权限。如需详细了解使用 API 方法所需的权限,请参阅 Cloud SQL 权限。

REST v1beta4

由于配置了实例的可用区无法访问,您可能需要将不可用的实例恢复到其他可用区。

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

  • PROJECT_ID:项目 ID。
  • SOURCE_INSTANCE_NAME:源实例的名称。
  • TARGET_INSTANCE_NAME:目标(克隆)实例的名称。
  • DATE_AND_TIME_STAMP:源实例的日期和时间戳,采用世界协调时间 (UTC) 时区和 RFC 3339 格式(例如
    2012-11-15T16:19:00.094Z)。
  • ZONE_NAME:可选。目标实例的主可用区的名称。这用于指定与您要克隆的 Cloud SQL 实例不同的主要可用区。对于区域实例,此可用区会替换主要可用区,但次要可用区与该实例相同。
  • SECONDARY_ZONE_NAME:可选。目标实例的次要可用区的名称。这用于指定与您要克隆的 Cloud SQL 实例不同的次要可用区。

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/SOURCE_INSTANCE_NAME/clone

请求 JSON 正文:

{
  "cloneContext":
  {
    "destinationInstanceName": "TARGET_INSTANCE_NAME",
    "pointInTime": "DATE_AND_TIME_STAMP",
    "preferredZone": "ZONE_NAME",
    "preferredSecondaryZone": "SECONDARY_ZONE_NAME"
  }
}

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

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

使用 instances.clone API 方法的用户或服务账号必须拥有 cloudsql.instances.clone 权限。如需详细了解使用 API 方法所需的权限,请参阅 Cloud SQL 权限。

如果您尝试在最新可恢复时间之后创建 PITR 克隆,系统会显示以下错误消息:

The timestamp for point-in-time recovery is after the latest recovery time of
Timestamp of latest recovery time. Clone the instance with a time
that's earlier than this recovery time.

对已删除的实例执行 PITR

如需使用 PITR 恢复已删除的实例,您需要:

  • 您要将实例恢复到的 PITR 时间戳 (timestamp)
  • 目标实例名称
  • 源实例的删除时间 (source-instance-deletion-time)

您只能使用 gcloud CLI 或 Cloud SQL API 对已删除的实例使用 PITR。如需了解详情,请参阅使用 PITR 恢复已删除的实例。

gcloud

标准备份

查找 PITR 窗口

如需查找已删除实例的 PITR 窗口,请获取该实例的最早和最近恢复时间。您可以在此窗口中选择任意时间戳来执行 PITR。

查找源实例删除

实例删除后,系统会将已删除实例的 source-instance-deletion-time 和 log-retention-days 与为您的实例保留的备份一起存储。如需查找已删除实例的所有可用备份的列表,请参阅列出保留的备份。

确定要使用的备份后,请使用 gcloud sql backups describe 命令获取 source-instance-deletion-time。

使用 PITR 进行恢复

如需使用 PITR 恢复已删除的实例,请运行以下命令:

gcloud sql instances clone SOURCE_INSTANCE_NAME \
NEW_INSTANCE_NAME \
--point-in-time='PITR_TIMESTAMP' \
--source-instance-deletion-time=SOURCE_INSTANCE_DELETION_TIMESTAMP

替换以下内容:

  • SOURCE_INSTANCE_NAME:您要恢复的源实例的名称。
  • NEW_INSTANCE_NAME:新实例的名称。
  • PITR_TIMESTAMP:您要将实例恢复到的源实例 PITR 日志的 UTC 时间戳,采用 RFC 3339 格式。例如,2012-11-15T16:19:00.094Z。
  • SOURCE_INSTANCE_DELETION_TIMESTAMP:源实例的删除时间(采用 RFC 3339 格式)的 UTC 时间戳。 例如 2012-11-15T16:19:00.094Z。

增强型备份

查找 PITR 窗口

如需查找已删除实例的 PITR 窗口,请获取该实例的最早和最近恢复时间。您可以在此窗口中选择任意时间戳来执行 PITR。

查找数据源

实例删除后,系统会将已删除实例的数据源与为您的实例保留的备份一起存储。如需为已删除的实例查找这些值,请参阅列出备份保险柜中实例的所有备份。

使用 PITR 进行恢复

如需使用 PITR 恢复已删除的实例,请运行以下命令:

gcloud sql instances point-in-time-restore DATA_SOURCE \
--point-in-time='PITR_TIMESTAMP' \
--project='TARGET_PROJECT' \

替换以下内容:

  • DATA_SOURCE:最接近您要恢复到的 PITR 时间戳的备份的 data-source 路径。
  • PITR_TIMESTAMP:您要将实例恢复到的源实例 PITR 日志的 UTC 时间戳,采用 RFC 3339 格式。例如,2012-11-15T16:19:00.094Z。
  • TARGET_PROJECT:Cloud SQL 实例的项目 ID。

REST v1

查找 PITR 窗口

如需查找已删除实例的 PITR 窗口,请获取该实例的最早和最近恢复时间。您可以在此窗口中选择任意时间戳来执行 PITR。

查找源实例删除时间和日志保留天数

实例删除后,系统会将已删除实例的 source-instance-deletion-time 和 log-retention-days 与为您的实例保留的备份一起存储。如需查找已删除实例的这些值,请参阅列出保留的备份。

使用 PITR 进行恢复

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

  • project-id:项目 ID
  • target-instance-id:目标实例 ID
  • source-instance-id:源实例 ID
  • source-instance-deletion-time:源实例的删除时间
  • 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",
    "sourceInstanceDeletionTime: "source-instance-deletion-time",
    "pointInTime": "restore-timestamp"
  }
}

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

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

REST v1beta4

查找 PITR 窗口

如需查找已删除实例的 PITR 窗口,请获取该实例的最早和最近恢复时间。您可以在此窗口中选择任意时间戳来执行 PITR。

查找源实例删除时间和日志保留天数

实例删除后,系统会将已删除实例的 source-instance-deletion-time 和 log-retention-days 与为您的实例保留的备份一起存储。如需查找已删除实例的这些值,请参阅列出保留的备份。

使用 PITR 进行恢复

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

  • project-id:项目 ID
  • target-instance-id:目标实例 ID
  • source-instance-id:源实例 ID
  • source-instance-deletion-time:源实例的删除时间
  • 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",
    "sourceInstanceDeletionTime: "source-instance-deletion-time",
    "pointInTime": "restore-timestamp"
  }
}

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

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

获取最早和最晚的恢复时间

对于可用实例,您可以执行 PITR 以恢复到实例 PITR 窗口中的任何时间戳。PITR 窗口从最早恢复时间开始,到最近恢复时间结束。如果实例不可用,并且实例日志存储在 Cloud Storage 中,或者实例已删除且启用了 PITR 保留,您可以检索最早和最近恢复时间,并执行到该窗口内的任何时间戳的 PITR。 在所有情况下,您都可以通过为主可用区提供值来将实例恢复到其他主可用区或次要可用区。

gcloud

不可用实例

如需获取不可用的 Cloud SQL 实例可以恢复到的最早和最近时间,请运行以下命令:

gcloud sql instances get-latest-recovery-time INSTANCE_NAME

替换以下内容:

  • INSTANCE_NAME:您要查找最近恢复时间的实例的名称。

实例已删除

如需获取 Cloud SQL 已删除实例可以恢复到的最早和最近时间,请运行以下命令:

gcloud sql instances get-latest-recovery-time INSTANCE_NAME
--source-instance-deletion-time='SOURCE_INSTANCE_DELETION_TIMESTAMP'

替换以下内容:

  • INSTANCE_NAME:您要查找最近恢复时间的实例的名称。
  • SOURCE_INSTANCE_DELETION_TIMESTAMP:源实例的删除时间(采用 RFC 3339 格式)的 UTC 时间戳。 例如 2012-11-15T16:19:00.094Z。

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",
  "earliestRecoveryTime": "2023-06-10T17:23:59.648821586Z",
  "latestRecoveryTime": "2023-06-20T17:23:59.648821586Z"
}

实例已删除

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

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

HTTP 方法和网址:

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

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

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

{
  "kind": "sql#getLatestRecoveryTime",
  "earliestRecoveryTime": "2023-06-10T17:23:59.648821586Z",
  "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",
  "earliestRecoveryTime": "2023-06-10T17:23:59.648821586Z",
  "latestRecoveryTime": "2023-06-20T17:23:59.648821586Z"
}

实例已删除

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

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

HTTP 方法和网址:

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

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

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

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

问题排查

问题 问题排查

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.

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

后续步骤