2.5 KiB
P6:隔离备份恢复演练
验证日期:2026-09-20。新增 scripts/test-backup-restore.sh,在两个一次性 MySQL 容器之间执行逻辑备份和恢复,恢复后用只读结构核验和核心记录计数确认结果。演练不连接已有数据库,也不修改生产数据。
实际命令与环境
本轮使用 Docker golang:1.27.1 交叉构建 macOS arm64 的当前 Orbit 二进制,再在宿主机执行脚本:
docker run --rm -e GOOS=darwin -e GOARCH=arm64 -e CGO_ENABLED=0 -e GOWORK=off \
-v "$PWD:/workspace" -v /tmp/orbit-go127-darwin:/out \
golang:1.27.1 sh -c 'cd /workspace && go build -o /out/orbit ./cmd/orbit && go build -o /out/orbit-migrate ./cmd/orbit-migrate && go build -o /out/orbit-admin ./cmd/orbit-admin'
ORBIT_BIN=/tmp/orbit-go127-darwin/orbit ORBIT_MIGRATE_BIN=/tmp/orbit-go127-darwin/orbit-migrate ORBIT_ADMIN_BIN=/tmp/orbit-go127-darwin/orbit-admin \
ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 sh scripts/test-backup-restore.sh
实际运行的构建使用 Go 1.27.1 的共享缓存目录,输出为当前提交对应的 Darwin arm64 二进制;脚本自身仍只创建一次性容器和临时文件。
源库和恢复库分别使用随机 root 密码、随机映射端口和独立数据库名。源库运行当前 bin/orbit-migrate,再通过 bin/orbit-admin bootstrap 写入一个通用应用、命名空间、凭据和队列;mysqldump --single-transaction --routines --triggers --events --hex-blob --no-tablespaces 导出后,通过容器内 MySQL 客户端导入恢复库。退出清理两个容器和临时凭据文件。
实际结果
{"source_core_counts":"1,1,1,1,28","restore_core_counts":"1,1,1,1,28","restore_foreign_key_count":0,"verify":{"schema_version":28,"migration_count":28,"foreign_key_count":0,"required_index_count":6,"complete":true}}
源库和恢复库的应用、命名空间、凭据、队列、迁移账本计数一致;恢复库通过迁移校验、6 个固定观测索引和零外键检查。备份文件中没有凭据原文,临时私密操作文件由脚本退出处理。
验收边界
本次证明 Go 1.27.1 构建的当前二进制可以读取同版本 MySQL 的逻辑恢复库,并保持无外键结构。它没有证明备份介质持久性、备份窗口内的大库锁/IO影响、跨版本升级恢复、复制切换、跨故障域部署、生产密钥托管、外部业务副作用核对或 RPO/RTO;这些仍需目标生产拓扑中的独立演练。恢复库也没有被接入 Worker 或业务流量,避免把恢复演练误当成恢复后的生产接管证明。