qiangdanxitong/database/README_DATABASE_SYNC.md

4.8 KiB
Raw Blame History

数据库结构同步方案

问题说明

每次部署数据库时,经常会遇到字段缺失的问题,导致应用报错。这是因为:

  1. 数据库脚本分散在多个文件中
  2. 没有统一的数据库初始化流程
  3. 缺少自动化的数据库同步机制

解决方案

我们提供了两种数据库同步方案:

方案一:使用同步脚本(推荐)

适用场景:已有数据库,需要添加缺失的字段

使用方法:

# 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应用启动时添加数据库检查逻辑,但这会增加启动时间,不推荐。

维护说明

添加新字段时

  1. 修改实体类:在对应的Entity类中添加字段
  2. 更新同步脚本:在 sync_database.sh 中添加对应的 sync_column 调用
  3. 更新SQL脚本(可选):在 schema.sql 中添加字段定义
  4. 测试:在测试环境执行同步脚本,验证无误后再部署到生产环境

示例:添加新字段到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 - 需求类型ID
  • actual_start_time - 实际开始时间
  • submit_time - 提交审核时间
  • actual_end_time - 实际结束时间
  • priority - 优先级
  • remark - 备注信息
  • is_pipeline - 是否流水线任务
  • pipeline_mode - 流水线模式
  • approval_status - 审核状态
  • current_approver_id - 当前审核人ID
  • current_approver_role - 当前审核人角色
  • demand_approval_time - 需求部门审核时间
  • receiving_approval_time - 接单部门审核时间

task_type 表

  • allowed_dept_ids - 可接单部门ID列表

category 表

  • description - 描述

team_score_pool 表

  • dept_id - 部门ID
  • total_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;

问题:字段添加失败,提示字段已存在

解决:这是正常情况,脚本会跳过已存在的字段

问题:需要添加的字段不在列表中

解决:

  1. 在 sync_database.sh 中添加对应的 sync_column 调用
  2. 或者在MySQL中手动执行ALTER TABLE语句

最佳实践

  1. 定期同步:每次部署前执行同步脚本
  2. 版本控制:将同步脚本纳入版本控制
  3. 测试先行:在测试环境验证后再部署到生产环境
  4. 备份数据:在生产环境执行前先备份数据库
  5. 文档同步:添加新字段时及时更新本文档