执行时间点恢复 (PITR)

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

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

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

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

如果您的 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

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

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

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

gcloud

查找 PITR 窗口

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

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

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

使用 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。

REST v1

查找 PITR 窗口

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

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

实例删除后,系统会将已删除实例的 source-instance-deletion-timelog-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-timelog-retention-days 与为您的实例保留的备份一起存储。如需查找已删除实例的这些值,请参阅列出保留的备份

使用 PITR 进行恢复

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

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

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

后续步骤