如何将外部SQL Server的.bak备份恢复至Google Cloud SQL并合并现有数据
Cloud SQL for SQL Server 导入外部全量+差异bak备份实现数据同步方案
可行性结论
该需求完全可实现,Cloud SQL原生支持外部生成的SQL Server全量/差异bak文件的导入恢复,只需要遵循SQL Server备份链规则和对应操作流程即可完成数据合并同步。
前置要求
- 客户侧SQL Server版本 ≤ 你所使用的Cloud SQL for SQL Server实例版本,不可将高版本数据库备份恢复到低版本实例
- 所有备份属于同一备份链:后续所有差异备份必须基于首次获取的全量备份生成,不可中途切换全量备份基准
- 备份文件未使用密码加密、未开启TDE透明数据加密,若已加密需先在本地SQL Server实例解密后重新导出无加密bak文件
- 全量备份生成时需使用
WITH CHECKSUM参数,确保备份文件完整性符合Cloud SQL导入要求
操作流程
1. 初始全量备份导入
- 把首次获取的全量.bak文件上传到GCP Cloud Storage存储桶中
- 为Cloud SQL实例的服务账号授予存储桶的「存储对象查看者」权限
- 执行全量备份导入,保持数据库处于待恢复状态以支持后续差异备份导入,gcloud命令示例:
gcloud sql import bak 你的Cloud SQL实例名 gs://你的存储桶路径/全量备份文件名.bak --database=目标数据库名 --bak-type=FULL --no-recovery
--no-recovery为必填参数,操作完成后目标数据库会处于RESTORING状态,暂时不可读写,属于正常情况
2. 后续差异备份导入
每次拿到客户提供的差异.bak文件后,执行以下操作:
- 把差异备份文件上传到同一Cloud Storage存储桶
- 执行差异备份导入命令,仍保持待恢复状态:
gcloud sql import bak 你的Cloud SQL实例名 gs://你的存储桶路径/差异备份文件名.bak --database=目标数据库名 --bak-type=DIFFERENTIAL --no-recovery
- 重复该步骤直到所有需要导入的差异备份都完成恢复
3. 完成恢复启用数据库
所有备份恢复完成后,连接到Cloud SQL实例,执行T-SQL命令结束恢复流程,使数据库进入可读写状态:
RESTORE DATABASE [目标数据库名] WITH RECOVERY
可选优化方案(实现数据库持续可用)
如果需要避免恢复过程中数据库无法对外提供服务,可以采用双实例轮转方案:
- 维护两个Cloud SQL实例,一个为对外提供服务的生产实例,另一个为临时恢复实例
- 每次拿到新的差异备份后,在临时恢复实例上完成全量备份+所有累计差异备份的全流程恢复
- 恢复完成后,使用Cloud SQL的数据库克隆功能,将临时实例上恢复完成的数据库直接克隆到生产实例覆盖旧库,整个过程停机时间不超过1分钟
内容的提问来源于stack exchange,提问作者Kuba Czajkowski
相关产品推荐
相关产品推荐

