cosmo/backend/scripts/UPGRADE_GUIDE_FINAL.md

155 lines
4.4 KiB
Markdown
Raw Normal View History

2025-12-27 10:28:15 +00:00
# 生产数据库升级指南 (最终版)
## 重要改进
本方案使用 PostgreSQL 的 `session_replication_role` 特性,**彻底解决外键约束问题**
### 优势
-**无需关心插入顺序** - 可以任意顺序导入数据
-**大幅提升速度** - 跳过外键检查,导入速度提升数倍
-**事务安全** - 失败自动回滚,数据一致性有保障
-**自动验证** - 完成后自动检查数据完整性
### 原理
```sql
-- 1. 开启"上帝模式":暂时忽略外键和触发器
SET session_replication_role = 'replica';
-- 2. 执行所有数据操作(不受外键限制)
BEGIN;
-- 随意导入数据
COMMIT;
-- 3. 恢复正常模式
SET session_replication_role = 'origin';
-- 4. 验证数据一致性
```
## 快速开始
### 方式1一键自动升级推荐
```bash
cd /Users/jiliu/WorkSpace/cosmo/backend/scripts
./upgrade_final.sh
```
### 方式2手动执行
```bash
# 1. 备份数据库
docker exec cosmo_postgres pg_dump -U postgres -d cosmo_db > backup_$(date +%Y%m%d_%H%M%S).sql
# 2. 执行升级Navicat 或命令行均可)
cat upgrade_production_final.sql | docker exec -i cosmo_postgres psql -U postgres -d cosmo_db
```
## 关于 display_name 字段
脚本已适配 `roles` 表的 `display_name` 字段。如果你的生产环境没有这个字段,请:
1. 打开 `upgrade_production_final.sql`
2. 找到第 20-27 行(带 display_name 的版本)
3. 注释掉它们
4. 取消注释第 29-36 行(不带 display_name 的版本)
## 权限要求
**需要 superuser 权限**才能使用 `session_replication_role`
如果你的数据库用户不是 superuser
```sql
-- 由 superuser 执行
ALTER USER your_user WITH SUPERUSER;
-- 升级完成后可以撤销
ALTER USER your_user WITH NOSUPERUSER;
```
## 升级内容
1. ✅ 创建/更新 rolesadmin、user
2. ✅ 添加 celestial_bodies.short_name 字段
3. ✅ 完整导入 14 条 menus 记录
4. ✅ 完整导入 16 条 role_menus 记录
5. ✅ 清空 celestial_events由定时任务重新生成
6. ✅ 导入 2 条 scheduled_jobs
7. ✅ 导入/更新 3 条 system_settings
8. ✅ 为现有用户分配角色
9. ✅ 自动验证数据完整性
## 数据完整性保障
脚本在恢复约束后会自动执行以下验证:
- ✅ 检查 role_menus 的 role_id 引用
- ✅ 检查 role_menus 的 menu_id 引用
- ✅ 检查 menus 的 parent_id 引用
如果发现无效引用,会输出 WARNING 信息。
## 回滚方案
```bash
# 如果升级失败,使用备份恢复
cat backup_YYYYMMDD_HHMMSS.sql | docker exec -i cosmo_postgres psql -U postgres -d cosmo_db
```
## 为什么不迁移到 MySQL
PostgreSQL 的优势:
- 更强的 JSON 支持(你的系统用到 JSONB
- 更好的 GIS 扩展PostGIS适合天文坐标
- 更完善的窗口函数和 CTE
- 更严格的数据完整性保障
使用 `session_replication_role` 后,外键约束不再是问题!
## 常见问题
### Q: 为什么需要 superuser 权限?
A: `session_replication_role` 是为数据库复制设计的特性PostgreSQL 限制只有 superuser 可以修改它,以防止普通用户破坏数据一致性。
### Q: 会影响生产环境吗?
A: 不会。这个设置只影响当前会话,不影响其他连接。而且在事务中执行,失败自动回滚。
### Q: 如果我没有 superuser 权限怎么办?
A:
1. 联系 DBA 临时授予权限
2. 或者使用之前的 `upgrade_production_smart.sql`(会慢一些)
### Q: 数据一致性如何保证?
A: 脚本在恢复约束后会自动验证所有外键引用。如果有问题会立即报告。
## 性能对比
| 方案 | 导入速度 | 复杂度 | 推荐度 |
|------|---------|--------|--------|
| 传统方案(严格顺序) | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
| DISABLE TRIGGER | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ |
| **session_replication_role** | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ |
## 升级后操作
```bash
# 1. 重启后端服务
docker restart cosmo-backend
# 2. 验证前端功能
# - 登录系统
# - 检查菜单显示
# - 测试用户功能
# 3. 手动执行定时任务(可选)
# 在后台管理 -> 定时任务设置 -> 立即执行
```
## 联系支持
如有问题,请检查:
1. PostgreSQL 日志: `docker logs cosmo_postgres --tail 100`
2. 用户权限: `SELECT current_user, usesuper FROM pg_user WHERE usename = current_user;`
3. 数据一致性验证输出