cosmo/backend/scripts/UPGRADE_GUIDE.md

4.9 KiB
Raw Blame History

生产环境数据库升级指南

概述

此升级脚本包含以下变更:

  1. celestial_bodies 表增加 short_name 字段
  2. 完整导入 menusrole_menus
  3. 清空 celestial_events 表(将由定时任务重新生成)
  4. 完整导入 scheduled_jobs
  5. 导入/更新 system_settings
  6. 保留 user_follows 表的现有数据

升级前准备

1. 备份数据库

# 在生产服务器上执行
pg_dump -U postgres -d cosmo_db > backup_$(date +%Y%m%d_%H%M%S).sql

2. 测试升级脚本(推荐)

# 在测试环境先运行
psql -U postgres -d cosmo_db_test < upgrade_production.sql

执行升级

方式1直接执行SQL文件

psql -U postgres -d cosmo_db < upgrade_production.sql

方式2通过Docker容器执行

docker cp upgrade_production.sql <container_name>:/tmp/
docker exec -it <container_name> psql -U postgres -d cosmo_db -f /tmp/upgrade_production.sql

方式3交互式执行推荐便于观察

psql -U postgres -d cosmo_db
\i upgrade_production.sql

升级后验证

脚本会自动输出验证信息,检查以下内容:

  1. celestial_bodies.short_name 字段:应该存在
  2. menus 数量:应该是 14 条
  3. role_menus 数量:应该是 16 条
  4. scheduled_jobs 数量:应该是 2 条
  5. system_settings 数量:应该至少 3 条

手动验证命令

-- 检查 short_name 字段
\d celestial_bodies

-- 检查菜单数据
SELECT id, name, title, path FROM menus ORDER BY parent_id NULLS FIRST, sort_order;

-- 检查角色菜单关联
SELECT r.name as role, m.title as menu
FROM role_menus rm
JOIN roles r ON rm.role_id = r.id
JOIN menus m ON rm.menu_id = m.id
ORDER BY r.name, m.sort_order;

-- 检查定时任务
SELECT id, name, is_active, predefined_function FROM scheduled_jobs;

-- 检查系统设置
SELECT key, value, value_type FROM system_settings;

升级详情

1. celestial_bodies 表升级

  • 增加 short_name VARCHAR(50) 字段
  • 如果字段已存在,则跳过

2. menus 和 role_menus 导入

  • 重要:会清空现有菜单数据
  • 导入 14 条菜单记录
  • 导入 16 条角色-菜单关联记录
  • 管理员可访问所有菜单
  • 普通用户只能访问:个人资料、我的天体

3. celestial_events 清空

  • 清空所有现有天体事件
  • 数据会由定时任务 calculate_planetary_events 自动重新生成

4. scheduled_jobs 导入

导入2个定时任务

  • 每日更新天体位置数据(已禁用)

    • Cron: 0 2 * * *每天凌晨2点
    • 可通过后台管理界面手动执行
  • 获取主要天体事件(已启用)

    • Cron: 0 3 1 * *每月1日凌晨3点
    • 自动计算未来一年的天文事件

5. system_settings 导入

导入3个系统设置

  • view_mode: solar默认视图模式
  • nasa_api_timeout: 120NASA API超时时间
  • auto_download_positions: False自动下载位置数据开关

使用 ON CONFLICT 策略,如果键已存在则更新值。

6. user_follows 保留

  • 不会修改此表
  • 保留所有用户关注数据

回滚方案

如果升级失败,使用备份恢复:

# 方式1完整恢复
psql -U postgres -d cosmo_db < backup_YYYYMMDD_HHMMSS.sql

# 方式2选择性回滚
# 如果只是某些表有问题,可以只恢复特定表
pg_restore -U postgres -d cosmo_db -t menus -t role_menus backup.dump

注意事项

  1. 事务安全:整个脚本在一个事务中执行,失败会自动回滚
  2. 外键约束menus 表有自引用外键,脚本已处理
  3. 数据清空menus、role_menus、celestial_events、scheduled_jobs 会被清空
  4. 用户数据user_follows 不会被修改
  5. 定时任务:位置数据下载任务默认禁用,需要手动执行或启用

升级后操作

  1. 重启应用服务

    # 重启后端服务
    systemctl restart cosmo-backend
    # 或 docker restart cosmo-backend
    
  2. 手动执行位置数据下载(如需要)

    • 登录后台管理系统
    • 进入"定时任务设置"
    • 找到"每日更新天体位置数据"
    • 点击"立即执行"
  3. 验证前端功能

    • 登录系统
    • 检查菜单是否正确显示
    • 测试个人资料页面
    • 测试我的天体页面

常见问题

Q: 升级过程中断怎么办?

A: 由于使用了事务,中断会自动回滚。使用备份重新开始。

Q: 如何只导入某个表?

A: 从脚本中复制对应表的部分,单独执行。

Q: 线上已有自定义菜单怎么办?

A: 脚本会清空菜单,请在升级前导出自定义菜单,升级后手动添加。

Q: 定时任务什么时候开始执行?

A: 天体事件任务会在下个月1日凌晨3点执行。位置数据任务需手动启用或执行。

联系支持

如遇问题,请检查:

  1. 数据库日志
  2. 应用程序日志
  3. 脚本执行输出