# 数据库结构同步方案 ## 问题说明 每次部署数据库时,经常会遇到字段缺失的问题,导致应用报错。这是因为: 1. 数据库脚本分散在多个文件中 2. 没有统一的数据库初始化流程 3. 缺少自动化的数据库同步机制 ## 解决方案 我们提供了两种数据库同步方案: ### 方案一:使用同步脚本(推荐) **适用场景**:已有数据库,需要添加缺失的字段 **使用方法**: ```bash # 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脚本 **适用场景**:全新安装或需要完整重建数据库 **使用方法**: ```bash # 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`),在部署后端之前执行数据库同步: ```bash # 在部署脚本中添加 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表 ```bash # 在 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权限 ```sql 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. **文档同步**:添加新字段时及时更新本文档