批量并行升级Cloud SQL只读副本至主实例的脚本修改建议
Cloud SQL只读副本并行升级脚本修改建议
一、核心优化:将串行升级改为并行执行
原脚本用&&连接升级命令,会等待前一个副本完成才执行下一个。要实现并行,只需在每个gcloud promote-replica命令后加&让其后台运行,最后用wait命令等待所有后台任务结束。
二、其他关键改进点
- 简化副本输入:支持一次性输入多个副本ID(空格分隔),无需逐个手动输入,提升扩展性
- 清理冗余临时文件:原脚本创建的
replica1.json至replica5.json等文件未被实际使用,直接删除相关创建代码 - 修复确认提示问题:原提示中引用的
$primaryInstance、$primaryRegion变量未定义,且两次读取acceptance会覆盖前一次输入,统一确认逻辑 - 增加并行执行反馈:记录每个副本的升级状态,方便跟踪进度
修改后的完整脚本
#!/bin/bash # 配置项目信息 gcloud auth login read -p '请输入实例所在的项目ID:' project gcloud config set project "$project" # 创建临时目录(仅保留实际需要的文件) mkdir -p tempFiles touch tempFiles/instanceDetails-dr.json # 批量输入目标副本ID read -p '请输入所有要升级的副本ID(用空格分隔):' dr_instances # 拉取副本信息(示例拉取第一个副本的信息,若不需要可删除) if [ -n "$dr_instances" ]; then first_instance=$(echo "$dr_instances" | awk '{print $1}') echo "正在拉取SQL实例数据..." gcloud sql instances describe "$first_instance" --format="json" > tempFiles/instanceDetails-dr.json fi # 统一确认操作(不可逆) read -p '你即将并行升级所有指定的只读副本为主实例,此操作不可逆,请输入Yes确认执行:' acceptance if [ "$acceptance" != "Yes" ]; then echo "未确认执行,未做任何修改。" exit 0 fi # 并行升级所有副本 echo "开始并行升级副本..." for instance in $dr_instances; do echo "启动副本 $instance 的升级任务..." gcloud sql instances promote-replica "$instance" > "tempFiles/$instance-upgrade.log" 2>&1 & done # 等待所有后台任务完成 wait echo "所有副本升级任务已完成。" # 可选:查看每个副本的升级日志 echo "各副本升级日志如下:" for instance in $dr_instances; do echo "=== 副本 $instance 日志 ===" cat "tempFiles/$instance-upgrade.log" done
关键修改说明
- 并行执行逻辑:通过
&将每个升级命令放入后台,wait命令会阻塞脚本直到所有后台进程结束,确保所有副本完成升级后再继续后续步骤 - 批量输入处理:用
dr_instances变量接收多个副本ID,通过循环遍历实现批量操作,支持任意数量的副本 - 日志记录:每个副本的升级输出会写入单独的日志文件,方便后续排查问题
- 简化临时文件:只保留实际需要的文件,删除未使用的冗余创建代码
内容的提问来源于stack exchange,提问作者Dharmin Fadia
相关产品推荐
相关产品推荐

