回收站中的实例能否直接导出数据到 Cloud Storage?

解读

在国内的 Google Cloud 面试中,这道题考察的是候选人对 Cloud SQL 生命周期管理数据可恢复性边界 的理解。
面试官往往先给出一个“看似可行”的场景:实例被误删但还在回收站,业务方想紧急把数据导出到 Cloud Storage 做本地验证。
如果候选人直接回答“可以”或“不可以”而不解释底层机制,会被追问“为什么”,甚至要求给出替代方案。
因此,必须明确:回收站(即“已删除但仍在保留期内的实例”)在 Cloud SQL 内部处于 STOPPED 且资源已释放状态,其数据卷被标记为待擦除,不再挂载到任何运行态节点,因此 无法直接执行 EXPORT 操作
同时,国内客户常把“回收站”与“快照”概念混淆,需要主动澄清差异,体现严谨性。

知识点

  1. Cloud SQL 回收站机制
    • 删除实例时,若未勾选“彻底删除”,实例进入 4 天保留期(国内项目默认策略,不可自定义)。
    • 保留期内实例名称被锁定,计费停止,但 磁盘空间仍占用项目配额,Google 后台异步清除数据。
  2. 导出(EXPORT)前置条件
    • 实例状态必须为 RUNNABLE
    • 需要存在有效的用户账号与数据库连接;
    • 导出任务由 Cloud SQL 托管的临时副本完成,源实例必须能被挂载
  3. 回收站实例状态
    • API 描述为 SQL_INSTANCE_STATE_UNSPECIFIED,实际为 STOPPED;
    • 底层 Persistent Disk 已 detach,无法发起挂载,因此 EXPORT 作业会返回 400 INVALID_STATE
  4. 国内合规与网络边界
    • 即使使用 Cloud SQL Auth Proxy,也无法穿透到已释放的磁盘;
    • Private IP 已随实例释放,无法通过 VPC 内网重新连接。
  5. 可行恢复路径
    • 在回收站保留期内,先“恢复”实例到 RUNNABLE 状态,再执行导出;
    • 若已超期,则只能依赖 事前自动备份或手动快照 重建新实例后导出。

答案

不能
回收站中的 Cloud SQL 实例处于 STOPPED 状态,底层磁盘已卸载,Cloud SQL 服务无法挂载其数据卷,因此 EXPORT 到 Cloud Storage 的 API 会直接返回 INVALID_STATE 错误
正确做法是:

  1. 4 天保留期内 通过控制台、gcloud 或 Terraform 恢复实例
  2. 待实例重新变为 RUNNABLE 后,授予 Cloud SQL 服务账号存储权限(roles/storage.objectAdmin 或自定义角色);
  3. 执行 gcloud sql export sql 或控制台导出,指定目标 Cloud Storage 路径(gs://bucket/backup.sql)。
    若保留期已过,实例被彻底删除,则只能依赖 事前开启的自动备份或手动快照 重建新实例,再执行导出。

拓展思考

  1. 如何设计零数据误删的治理流程?
    • 在组织级政策 constraints/sql.restrictPublicIpconstraints/sql.requireBackup 基础上,增加 Terraform 流水线强制快照标签:任何生产实例销毁前必须生成 on-demand snapshot,并通过 Cloud Function 触发发送飞书/钉钉审批卡片,实现“双人复核”。
  2. 大实例恢复耗时过长,如何加速导出?
    • 利用 并行导出(MySQL 使用 mysqldump --single-transaction --quick 分表并行、PostgreSQL 使用 pg_dump -j),将导出任务拆成 ≤200 GB 的分片,写入 Cloud Storage 多区域桶
    • 结合 gcloud storage rsync-m(多线程) 参数,降低跨境带宽抖动对国内上传的影响。
  3. 回收站与快照的计费差异
    • 回收站实例 不计 vCPU/内存费,但 磁盘配额仍占用,若项目配额紧张可能导致新实例无法创建;
    • 快照按 实际数据量 计费,无 4 天限制,长期保留更划算,但需注意 快照链过长会导致恢复时间线性增长
  4. 国内客户常问:能否把回收站实例“只读挂载”到 BigQuery?
    • 答案同样是否定的,BigQuery Federated Query 要求源实例为 RUNNABLE
    • 替代方案是 先恢复到临时实例,用 DatastreamDataflow Template 将数据实时同步到 BigQuery,完成后立即删除临时实例,实现“即席分析”且按量计费