4.9 KiB
4.9 KiB
生产环境数据库升级指南
概述
此升级脚本包含以下变更:
- 在
celestial_bodies表增加short_name字段 - 完整导入
menus和role_menus表 - 清空
celestial_events表(将由定时任务重新生成) - 完整导入
scheduled_jobs表 - 导入/更新
system_settings表 - 保留
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
升级后验证
脚本会自动输出验证信息,检查以下内容:
- celestial_bodies.short_name 字段:应该存在
- menus 数量:应该是 14 条
- role_menus 数量:应该是 16 条
- scheduled_jobs 数量:应该是 2 条
- 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:
-
获取主要天体事件(已启用)
- Cron:
0 3 1 * *(每月1日凌晨3点) - 自动计算未来一年的天文事件
- Cron:
5. system_settings 导入
导入3个系统设置:
view_mode: solar(默认视图模式)nasa_api_timeout: 120(NASA 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
注意事项
- 事务安全:整个脚本在一个事务中执行,失败会自动回滚
- 外键约束:menus 表有自引用外键,脚本已处理
- 数据清空:menus、role_menus、celestial_events、scheduled_jobs 会被清空
- 用户数据:user_follows 不会被修改
- 定时任务:位置数据下载任务默认禁用,需要手动执行或启用
升级后操作
-
重启应用服务
# 重启后端服务 systemctl restart cosmo-backend # 或 docker restart cosmo-backend -
手动执行位置数据下载(如需要)
- 登录后台管理系统
- 进入"定时任务设置"
- 找到"每日更新天体位置数据"
- 点击"立即执行"
-
验证前端功能
- 登录系统
- 检查菜单是否正确显示
- 测试个人资料页面
- 测试我的天体页面
常见问题
Q: 升级过程中断怎么办?
A: 由于使用了事务,中断会自动回滚。使用备份重新开始。
Q: 如何只导入某个表?
A: 从脚本中复制对应表的部分,单独执行。
Q: 线上已有自定义菜单怎么办?
A: 脚本会清空菜单,请在升级前导出自定义菜单,升级后手动添加。
Q: 定时任务什么时候开始执行?
A: 天体事件任务会在下个月1日凌晨3点执行。位置数据任务需手动启用或执行。
联系支持
如遇问题,请检查:
- 数据库日志
- 应用程序日志
- 脚本执行输出