本页面介绍了如何使用时间点恢复 (PITR) 来恢复 Cloud SQL 主实例。
如需详细了解 PITR, 请参阅时间点恢复 (PITR)。
如果您创建 Cloud SQL 企业 Plus 版实例,则 PITR 在默认情况下处于启用状态,无论创建时所用的方法如何。如果您想停用此功能,则必须手动操作。
如果您创建 Cloud SQL 企业版实例,则 PITR 在默认情况下处于停用状态,无论创建时所用的方法如何。在这种情况下,如果您想启用该功能,则必须手动执行此操作。
用于 PITR 的日志存储
我们于 2024 年 5 月 31 日发布了在 Cloud Storage 中存储 PITR 事务日志的功能。自从此功能发布以来,以下条件适用:在此日期之前创建的启用了 PITR 的 Cloud SQL 实例之前会将 PITR 事务日志存储在磁盘上。自那时起,大多数此类实例的 PITR 事务日志已迁移到 Cloud Storage。如需验证特定实例的日志位置,请参阅检查用于 PITR 的事务日志的存储位置。
在此日期当天或之后创建且启用了 PITR 的所有 Cloud SQL 实例都会将这些日志存储在 Cloud Storage 中。
交易日志会定期更新,并且会占用一定的存储空间。Cloud SQL 会自动删除事务日志及其关联的自动备份。此操作在满足为 transactionLogRetentionDays
参数设置的值之后发生。如需详细了解此参数,请参阅日志和磁盘用量。
对于仅在磁盘上存储事务日志的实例,您可以先停用 PITR,然后再重新启用 PITR,从而将日志配置为存储在 Cloud Storage 中。您无法将日志从 Cloud Storage 移回磁盘。
如需确保实例的日志存储在 Cloud Storage 中(而不是存储在磁盘上),请完成以下操作:
- 检查实例是否将日志存储在磁盘或 Cloud Storage 上。
- 检查实例的网络架构。如果实例在旧网络架构上运行,请将实例升级到新网络架构。
- 如果磁盘上的日志的大小导致实例出现性能问题,请先停用 PITR,然后再重新启用。
日志和磁盘使用量
对于在 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。
如果未设置此参数的值,则 Cloud SQL 企业 Plus 版实例的默认事务日志保留期限为 14 天,而 Cloud SQL 企业版实例的默认事务日志保留期限为 7 天。如需详细了解如何应用此设置,请参阅设置事务日志保留。
如需了解事务日志使用了多少磁盘,请检查实例的 bytes_used_by_data_type
指标。该数据类型的值会返回磁盘上事务日志的大小。对于在磁盘上存储用于 PITR 的事务日志的实例,Cloud SQL 每天都会从磁盘中完全清除数据,以满足 transactionLogRetentionDays
PITR 设置。如需了解详情,请参阅自动备份保留。
限制
以下限制与实例启用了 PITR 且磁盘上事务日志的大小导致实例出现问题有关:
- 您可以停用然后重新启用 PITR,以确保 Cloud SQL 将日志存储在与实例位于同一区域的 Cloud Storage 中。但是,Cloud SQL 会删除所有现有日志,因此您执行 PITR 操作的时间不能早于您重新启用 PITR 的时间。
- 您可以增加实例存储空间大小,但磁盘用量中的事务日志大小的增加可能是临时的。
- 为避免意外的存储问题,我们建议启用存储空间自动扩容功能。仅当实例启用了 PITR 且日志存储在磁盘上时,此建议才适用。
- 如果要删除日志并恢复存储空间,您可以停用 PITR,而不重新启用它。但是,减小所占用的存储空间不会缩小为实例预配的磁盘大小。
日志每天完全清除一次,不会持续清除。将日志保留设置为两天意味着系统会保留至少两天、最多三天的日志。我们建议将备份数量设置为日志保留天数加 1。
例如,如果您为
transactionLogRetentionDays
参数的值指定7
,则对于backupRetentionSettings
参数,请将retainedBackups
的数量设置为8
。
如需详细了解 PITR,请参阅时间点恢复 (PITR)。
用于 PITR 的数据库恢复模型
如果您在实例上启用 PITR,Cloud SQL 会自动将现有数据库和后续数据库的恢复模型设置为完整恢复模型。
如需详细了解 SQL Server 恢复模型,请参阅 Microsoft 文档。
启用 PITR
当您在 Google Cloud 控制台中创建新实例时,系统会自动启用自动备份设置。以下过程会在现有主实例上启用 PITR。
控制台
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 打开要启用 PITR 的实例对应的“更多操作”菜单
,然后点击修改。
- 在自定义实例下,展开数据保护部分。
- 选中启用时间点恢复复选框。
- 在日志保留天数字段中,输入保留日志的天数(对于 Cloud SQL 企业 Plus 版为 1-35,对于 Cloud SQL 企业版为 1-7)。
- 点击保存。
gcloud
- 显示实例概览:
gcloud sql instances describe INSTANCE_NAME
- 如果您在
backupConfiguration
部分中看到enabled: false
,请启用计划备份:gcloud sql instances patch INSTANCE_NAME \ --backup-start-time=HH:MM
使用 UTC±00 时区的 24 小时制时间指定
backup-start-time
参数。 - 启用 PITR:
gcloud sql instances patch INSTANCE_NAME \ --enable-point-in-time-recovery
如果您要在主实例上启用 PITR,还可以通过添加以下参数来配置要保留事务日志的天数:
--retained-transaction-log-days=RETAINED_TRANSACTION_LOG_DAYS
- 确认更改:
gcloud sql instances describe INSTANCE_NAME
在
backupConfiguration
部分中,如果更改成功,您会看到pointInTimeRecoveryEnabled: true
。
Terraform
如需启用 PITR,请使用 Terraform 资源。
为 Cloud SQL 企业 Plus 版启用 PITR
使用以下 Terraform 代码示例创建启用了 PITR 的 Cloud SQL 企业 Plus 版实例:为 Cloud SQL 企业版启用 PITR
使用以下 Terraform 代码示例创建启用了 PITR 的 Cloud SQL 企业版实例:应用更改
如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。
准备 Cloud Shell
- 启动 Cloud Shell。
-
设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。
您只需为每个项目运行一次以下命令,即可在任何目录中运行它。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。
准备目录
每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。
-
在 Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有
.tf
扩展名,例如main.tf
。在本教程中,该文件称为main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。
将示例代码复制到新创建的
main.tf
中。(可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。
- 查看和修改要应用到您的环境的示例参数。
- 保存更改。
-
初始化 Terraform。您只需为每个目录执行一次此操作。
terraform init
(可选)如需使用最新的 Google 提供程序版本,请添加
-upgrade
选项:terraform init -upgrade
应用更改
-
查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
terraform plan
根据需要更正配置。
-
通过运行以下命令并在提示符处输入
yes
来应用 Terraform 配置:terraform apply
等待 Terraform 显示“应用完成!”消息。
- 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。
删除更改
如需删除更改,请执行以下操作:
- 如需停用删除防护,请在 Terraform 配置文件中将
deletion_protection
参数设置为false
。deletion_protection = "false"
- 运行以下命令并在提示符处输入
yes
,以应用更新后的 Terraform 配置:terraform apply
-
运行以下命令并在提示符处输入
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
控制台
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 打开要恢复的实例对应的“更多操作”菜单
,然后点击创建克隆。
- (可选)在创建克隆页面上,更新新克隆的 ID。
- 选择从较早的时间点克隆。
- 输入 PITR 时间。
- 选择所有数据库,或指定数据库名称。
如果您指定数据库名称,则只能选择一个名称。默认情况下,PITR 会用于所有数据库。 - 点击创建克隆。
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
控制台
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 打开要停用的实例对应的“更多操作”菜单
,然后选择修改。
- 在自定义实例下,展开数据保护部分。
- 清除启用时间点恢复。
- 点击保存。
gcloud
- 停用时间点恢复:
gcloud sql instances patch INSTANCE_NAME \ --no-enable-point-in-time-recovery
- 确认更改:
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 中。
设置事务日志保留
如需设置保留事务日志的天数,请执行以下操作:
控制台
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 打开要为其设置事务日志的实例对应的“更多操作”菜单
,然后选择修改。
- 在自定义实例下,展开数据保护部分。
- 在启用时间点恢复部分中,展开高级选项。
- 输入保留日志的天数(对于 Cloud SQL 企业 Plus 版为 1-35,对于 Cloud SQL 企业版为 1-7)。
- 点击保存。
gcloud
修改实例以设置事务日志的保留天数。
替换以下内容:
- INSTANCE_NAME:要为其设置事务日志的实例的名称。
DAYS_TO_RETAIN:要保留的事务日志的天数。对于 Cloud SQL 企业 Plus 版,有效范围介于 1 到 35 天之间,默认值为 14 天。对于 Cloud SQL 企业版,有效范围介于 1 到 7 天之间,默认值为 7 天。
如果您未指定值,则 Cloud SQL 会使用默认值。 仅在启用 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 响应:
问题排查
问题 | 问题排查 |
---|---|
或
|
您提供的时间戳无效。 |
或
|
您提供的时间戳是找不到备份或二进制日志坐标的时间。 |
后续步骤
- 在克隆上配置标志