如何在不覆盖生产实例的前提下,将备份恢复到新实例并校验数据?
解读
面试官想确认三件事:
- 你是否理解Cloud SQL 备份与恢复模型(自动备份、按需备份、时间点恢复 PITR)
- 你是否能在零停机、零覆盖的前提下完成“克隆式恢复”
- 你是否具备数据一致性校验的闭环思路,而不仅仅是“恢复成功”就结束
国内面试场景里,这道题常作为“高可用/灾备”环节的追问,答得太浅会被继续追问“如果表 500 G、源库持续写入怎么办”;答得太深又容易超时,因此要把关键路径、命令、校验方法一次说清,并主动给出回退方案。
知识点
- Cloud SQL 自动备份保留期(默认 7 天,可设 30 天)与事务日志保留期(与自动备份相同)
- 恢复只能“新建实例”,不支持就地覆盖,这是天然防呆机制
- 恢复时可用最早时间点 = 最早一次自动备份时间;PITR 粒度 = 5 分钟
- 恢复过程会新建一个与源库版本、旗舰级或企业级版相同的实例,IP 段、磁盘、CPU 可自定义,但字符集、排序规则、flag 必须一致
- 数据校验三板斧:行数比对、校验和、业务黄金 SQL
- 国内网络合规:若源库开Private IP,新实例必须落在相同 VPC 与子网;若用Cloud SQL Auth Proxy,需保证PSC 或 VPC-SC 通道已打通
- 费用控制:恢复出来的实例按量计费,验证完立即删除是标准动作,否则过夜会产生SSD 费用 + 高可用费用
答案
-
选备份
在控制台gcloud sql backups list --instance=prod-instance --project=proj-id找到自动备份 ID 或按需备份 ID;若要做 PITR,则记录目标时间点(北京时间需转成 UTC,例如2024-05-28 03:00:00 UTC)。 -
预检
a) 确认源实例没有悬挂长事务,避免恢复出来的库出现未提交脏数据;
b) 确认项目配额足够(IP、CPU、SSD);
c) 若源库开二进制日志,建议临时关闭或隔离测试账号,防止校验阶段误写。 -
恢复新实例
使用 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 小时内必须删除
-
网络接入
国内合规场景下,不开公网 IP,通过现有 VPC 的 Private IP 接入;若开发机不在 GCP,可临时开 Cloud SQL Auth Proxy + IAP 隧道,用完即关。 -
数据校验
① 行数比对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,确认金额、订单数、用户数一致。 -
结果记录
把校验 SQL、结果、耗时、误差写入云审计日志或内部飞书多维表格,方便审计。 -
清理
gcloud sql instances delete restore-verify-xxxx --project=proj-id --quiet删除后检查磁盘快照是否自动清除(Cloud SQL 不会留快照,但自定义脚本可能误打快照)。
-
异常回退
若校验失败,立即:
a) 保留实例,但关闭网络入口,防止污染;
b) 重新发起一次恢复,换更早备份或更早 PITR 时间点;
c) 把失败原因、备份 ID、时间点写入故障单,后续提工单给Google Cloud 国内支持(售前可拉TPC 技术支持)。
拓展思考
- 大库加速:500 G 以上库,恢复时间≈数据量/150 MB/s,可提前把目标实例磁盘大小设成源库 1.3 倍,避免自动扩容带来的 3 分钟卡顿。
- 持续校验:把上述校验脚本封装成Cloud Run Job,每周定时恢复最近备份,结果推Prometheus + Grafana,实现备份可观测性。
- 跨项目恢复:国内金融客户常要求备份项目与生产项目隔离,此时需IAM 授权
roles/cloudsql.admin给恢复服务账号,并开启 VPC-SC 边界,防止数据出境。 - 加密校验:若源库开启CMEK,恢复时必须指定相同 key;校验脚本里把key rotation 时间也打印出来,证明密钥版本一致。
- 法律合规:个人信息保护法要求测试库脱敏,可在恢复完成后跑一轮脱敏脚本(手机号打码、身份证哈希),再交给开发使用,避免明文泄露。