如何在不覆盖生产实例的前提下,将备份恢复到新实例并校验数据?

解读

面试官想确认三件事:

  1. 你是否理解Cloud SQL 备份与恢复模型(自动备份、按需备份、时间点恢复 PITR)
  2. 你是否能在零停机、零覆盖的前提下完成“克隆式恢复”
  3. 你是否具备数据一致性校验的闭环思路,而不仅仅是“恢复成功”就结束

国内面试场景里,这道题常作为“高可用/灾备”环节的追问,答得太浅会被继续追问“如果表 500 G、源库持续写入怎么办”;答得太深又容易超时,因此要把关键路径、命令、校验方法一次说清,并主动给出回退方案

知识点

  • Cloud SQL 自动备份保留期(默认 7 天,可设 30 天)与事务日志保留期(与自动备份相同)
  • 恢复只能“新建实例”,不支持就地覆盖,这是天然防呆机制
  • 恢复时可用最早时间点 = 最早一次自动备份时间;PITR 粒度 = 5 分钟
  • 恢复过程会新建一个与源库版本、旗舰级或企业级版相同的实例,IP 段、磁盘、CPU 可自定义,但字符集、排序规则、flag 必须一致
  • 数据校验三板斧:行数比对、校验和、业务黄金 SQL
  • 国内网络合规:若源库开Private IP,新实例必须落在相同 VPC 与子网;若用Cloud SQL Auth Proxy,需保证PSC 或 VPC-SC 通道已打通
  • 费用控制:恢复出来的实例按量计费验证完立即删除是标准动作,否则过夜会产生SSD 费用 + 高可用费用

答案

  1. 选备份
    在控制台 gcloud sql backups list --instance=prod-instance --project=proj-id 找到自动备份 ID按需备份 ID;若要做 PITR,则记录目标时间点(北京时间需转成 UTC,例如 2024-05-28 03:00:00 UTC)。

  2. 预检
    a) 确认源实例没有悬挂长事务,避免恢复出来的库出现未提交脏数据
    b) 确认项目配额足够(IP、CPU、SSD);
    c) 若源库开二进制日志,建议临时关闭隔离测试账号,防止校验阶段误写。

  3. 恢复新实例
    使用 CLI 一次性带齐标签,方便后续清理:

    gcloud sql instances restore-backup restore-instance \
      --project=proj-id \
      --target-instance=restore-verify-$(date +%m%d%H%M) \
      --source-instance=prod-instance \
      --backup-instance=prod-instance \
      --backup-id=<backup-id> \
      --restore-time=2024-05-28T03:00:00Z \
      --tier=db-custom-4-15360 \
      --region=asia-east1 \
      --network=vpc-prod \
      --no-assign-ip \
      --storage-type=SSD \
      --availability-type=REGIONAL \
      --maintenance-window-day=SUN \
      --maintenance-window-hour=04 \
      --database-flags=cloudsql.iam_authentication=on \
      --labels=env=verify,ttl=8h,owner=dba
    

    说明:

    • restore-time 留空即走“最新备份”;若指定则走 PITR
    • no-assign-ip 先不给公网,等校验时再开Private Service Connect
    • 标签 ttl=8h 是给自己埋“定时炸弹”,提醒8 小时内必须删除
  4. 网络接入
    国内合规场景下,不开公网 IP,通过现有 VPC 的 Private IP 接入;若开发机不在 GCP,可临时开 Cloud SQL Auth Proxy + IAP 隧道,用完即关。

  5. 数据校验
    行数比对

    SELECT table_name, table_rows, data_length, index_length
    FROM information_schema.tables
    WHERE table_schema NOT IN ('mysql','sys','information_schema','performance_schema');
    

    把结果与源库同一时间点的快照做 diff,误差允许 0 行。

    校验和
    对核心表做MD5 聚合(MySQL 用 MD5(GROUP_CONCAT(CAST(col AS CHAR) ORDER BY pk)),PostgreSQL 用 md5(string_agg(col::text, '' ORDER BY pk))),500 G 大表可采样分桶校验MOD(pk, 100)=?)。

    业务黄金 SQL
    三条最常被报表依赖的 SUM/ COUNT,确认金额、订单数、用户数一致。

  6. 结果记录
    把校验 SQL、结果、耗时、误差写入云审计日志内部飞书多维表格,方便审计。

  7. 清理

    gcloud sql instances delete restore-verify-xxxx --project=proj-id --quiet
    

    删除后检查磁盘快照是否自动清除(Cloud SQL 不会留快照,但自定义脚本可能误打快照)。

  8. 异常回退
    若校验失败,立即:
    a) 保留实例,但关闭网络入口,防止污染;
    b) 重新发起一次恢复,换更早备份或更早 PITR 时间点
    c) 把失败原因、备份 ID、时间点写入故障单,后续提工单给Google Cloud 国内支持(售前可拉TPC 技术支持)。

拓展思考

  1. 大库加速:500 G 以上库,恢复时间≈数据量/150 MB/s,可提前把目标实例磁盘大小设成源库 1.3 倍,避免自动扩容带来的 3 分钟卡顿。
  2. 持续校验:把上述校验脚本封装成Cloud Run Job每周定时恢复最近备份,结果推Prometheus + Grafana,实现备份可观测性
  3. 跨项目恢复:国内金融客户常要求备份项目与生产项目隔离,此时需IAM 授权 roles/cloudsql.admin恢复服务账号,并开启 VPC-SC 边界,防止数据出境
  4. 加密校验:若源库开启CMEK,恢复时必须指定相同 key;校验脚本里把key rotation 时间也打印出来,证明密钥版本一致
  5. 法律合规个人信息保护法要求测试库脱敏,可在恢复完成后跑一轮脱敏脚本(手机号打码、身份证哈希),再交给开发使用,避免明文泄露