Files
orbit/docs/reports/phase-6-backup-restore.md

32 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P6:隔离备份恢复演练
验证日期:2026-09-20。新增 `scripts/test-backup-restore.sh`,在两个一次性 MySQL 容器之间执行逻辑备份和恢复,恢复后用只读结构核验和核心记录计数确认结果。演练不连接已有数据库,也不修改生产数据。
## 实际命令与环境
本轮使用 Docker `golang:1.27.1` 交叉构建 macOS arm64 的当前 Orbit 二进制,再在宿主机执行脚本:
```sh
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 客户端导入恢复库。退出清理两个容器和临时凭据文件。
## 实际结果
```json
{"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 或业务流量,避免把恢复演练误当成恢复后的生产接管证明。