4.8 KiB
4.8 KiB
数据库结构同步方案
问题说明
每次部署数据库时,经常会遇到字段缺失的问题,导致应用报错。这是因为:
- 数据库脚本分散在多个文件中
- 没有统一的数据库初始化流程
- 缺少自动化的数据库同步机制
解决方案
我们提供了两种数据库同步方案:
方案一:使用同步脚本(推荐)
适用场景:已有数据库,需要添加缺失的字段
使用方法:
# 1. 设置数据库连接信息(可选,默认使用配置的默认值)
export DB_HOST=localhost
export DB_USER=root
export DB_PASS=DesignHub@2025_Root
export DB_NAME=designhub
# 2. 执行同步脚本
cd database
./sync_database.sh
脚本功能:
- ✅ 自动检测每个字段是否存在
- ✅ 只添加缺失的字段,不影响已有数据
- ✅ 可以安全地重复执行
- ✅ 提供详细的执行日志
方案二:使用SQL脚本
适用场景:全新安装或需要完整重建数据库
使用方法:
# 1. 执行完整的schema脚本
mysql -uroot -p designhub < database/schema.sql
# 2. 执行初始化数据脚本
mysql -uroot -p designhub < database/init-data.sql
# 3. 执行同步脚本(添加缺失字段)
mysql -uroot -p designhub < database/sync_database_structure.sql
注意:sync_database_structure.sql 使用了存储过程,适用于MySQL 5.7+版本。
部署集成
在部署脚本中自动执行
修改部署脚本(如 deploy_to_public_server.sh),在部署后端之前执行数据库同步:
# 在部署脚本中添加
echo "同步数据库结构..."
sshpass -p 'PASSWORD' ssh root@SERVER_IP "cd /opt/designhub/database && bash sync_database.sh"
在应用启动时检查(可选)
可以在Spring Boot应用启动时添加数据库检查逻辑,但这会增加启动时间,不推荐。
维护说明
添加新字段时
- 修改实体类:在对应的Entity类中添加字段
- 更新同步脚本:在
sync_database.sh中添加对应的sync_column调用 - 更新SQL脚本(可选):在
schema.sql中添加字段定义 - 测试:在测试环境执行同步脚本,验证无误后再部署到生产环境
示例:添加新字段到task表
# 在 sync_database.sh 中添加
sync_column "task" "new_field" "VARCHAR(255) NULL COMMENT '新字段说明'" "existing_field"
字段列表
当前同步脚本会检查并添加以下字段:
sys_user 表
dept_name- 部门名称score- 用户积分
task 表
third_party_task_no- 第三方平台任务编号task_type_ids- 任务类型ID列表score_reward- 实际积分奖励estimated_duration- 预估时长demand_type_id- 需求类型IDactual_start_time- 实际开始时间submit_time- 提交审核时间actual_end_time- 实际结束时间priority- 优先级remark- 备注信息is_pipeline- 是否流水线任务pipeline_mode- 流水线模式approval_status- 审核状态current_approver_id- 当前审核人IDcurrent_approver_role- 当前审核人角色demand_approval_time- 需求部门审核时间receiving_approval_time- 接单部门审核时间
task_type 表
allowed_dept_ids- 可接单部门ID列表
category 表
description- 描述
team_score_pool 表
dept_id- 部门IDtotal_recharge- 累计充值积分total_consume- 累计消耗积分total_earn- 累计获得积分period_limit- 周期限额period_used- 当前周期已消耗period_start_time- 当前周期开始时间alert_threshold- 预警阈值limit_enabled- 是否启用限制limit_period- 限制周期
achievement 表
achievement_code- 成就代码achievement_name- 成就名称
user_achievement 表
progress_value- 当前进度值reward_claimed- 奖励是否已领取claim_time- 领取时间
故障排查
问题:脚本执行失败,提示权限错误
解决:确保MySQL用户有ALTER TABLE权限
GRANT ALTER ON designhub.* TO 'your_user'@'localhost';
FLUSH PRIVILEGES;
问题:字段添加失败,提示字段已存在
解决:这是正常情况,脚本会跳过已存在的字段
问题:需要添加的字段不在列表中
解决:
- 在
sync_database.sh中添加对应的sync_column调用 - 或者在MySQL中手动执行ALTER TABLE语句
最佳实践
- 定期同步:每次部署前执行同步脚本
- 版本控制:将同步脚本纳入版本控制
- 测试先行:在测试环境验证后再部署到生产环境
- 备份数据:在生产环境执行前先备份数据库
- 文档同步:添加新字段时及时更新本文档