4.4 KiB
4.4 KiB
生产数据库升级指南 (最终版)
重要改进
本方案使用 PostgreSQL 的 session_replication_role 特性,彻底解决外键约束问题:
优势
- ✅ 无需关心插入顺序 - 可以任意顺序导入数据
- ✅ 大幅提升速度 - 跳过外键检查,导入速度提升数倍
- ✅ 事务安全 - 失败自动回滚,数据一致性有保障
- ✅ 自动验证 - 完成后自动检查数据完整性
原理
-- 1. 开启"上帝模式":暂时忽略外键和触发器
SET session_replication_role = 'replica';
-- 2. 执行所有数据操作(不受外键限制)
BEGIN;
-- 随意导入数据
COMMIT;
-- 3. 恢复正常模式
SET session_replication_role = 'origin';
-- 4. 验证数据一致性
快速开始
方式1:一键自动升级(推荐)
cd /Users/jiliu/WorkSpace/cosmo/backend/scripts
./upgrade_final.sh
方式2:手动执行
# 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 字段。如果你的生产环境没有这个字段,请:
- 打开
upgrade_production_final.sql - 找到第 20-27 行(带 display_name 的版本)
- 注释掉它们
- 取消注释第 29-36 行(不带 display_name 的版本)
权限要求
需要 superuser 权限才能使用 session_replication_role。
如果你的数据库用户不是 superuser:
-- 由 superuser 执行
ALTER USER your_user WITH SUPERUSER;
-- 升级完成后可以撤销
ALTER USER your_user WITH NOSUPERUSER;
升级内容
- ✅ 创建/更新 roles(admin、user)
- ✅ 添加 celestial_bodies.short_name 字段
- ✅ 完整导入 14 条 menus 记录
- ✅ 完整导入 16 条 role_menus 记录
- ✅ 清空 celestial_events(由定时任务重新生成)
- ✅ 导入 2 条 scheduled_jobs
- ✅ 导入/更新 3 条 system_settings
- ✅ 为现有用户分配角色
- ✅ 自动验证数据完整性
数据完整性保障
脚本在恢复约束后会自动执行以下验证:
- ✅ 检查 role_menus 的 role_id 引用
- ✅ 检查 role_menus 的 menu_id 引用
- ✅ 检查 menus 的 parent_id 引用
如果发现无效引用,会输出 WARNING 信息。
回滚方案
# 如果升级失败,使用备份恢复
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:
- 联系 DBA 临时授予权限
- 或者使用之前的
upgrade_production_smart.sql(会慢一些)
Q: 数据一致性如何保证?
A: 脚本在恢复约束后会自动验证所有外键引用。如果有问题会立即报告。
性能对比
| 方案 | 导入速度 | 复杂度 | 推荐度 |
|---|---|---|---|
| 传统方案(严格顺序) | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
| DISABLE TRIGGER | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ |
| session_replication_role | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ |
升级后操作
# 1. 重启后端服务
docker restart cosmo-backend
# 2. 验证前端功能
# - 登录系统
# - 检查菜单显示
# - 测试用户功能
# 3. 手动执行定时任务(可选)
# 在后台管理 -> 定时任务设置 -> 立即执行
联系支持
如有问题,请检查:
- PostgreSQL 日志:
docker logs cosmo_postgres --tail 100 - 用户权限:
SELECT current_user, usesuper FROM pg_user WHERE usename = current_user; - 数据一致性验证输出