cosmo/backend/scripts/UPGRADE_GUIDE_FINAL.md

4.4 KiB
Raw Blame History

生产数据库升级指南 (最终版)

重要改进

本方案使用 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 字段。如果你的生产环境没有这个字段,请:

  1. 打开 upgrade_production_final.sql
  2. 找到第 20-27 行(带 display_name 的版本)
  3. 注释掉它们
  4. 取消注释第 29-36 行(不带 display_name 的版本)

权限要求

需要 superuser 权限才能使用 session_replication_role

如果你的数据库用户不是 superuser

-- 由 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 信息。

回滚方案

# 如果升级失败,使用备份恢复
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

升级后操作

# 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. 数据一致性验证输出