171 lines
4.8 KiB
Markdown
171 lines
4.8 KiB
Markdown
# 数据库结构同步方案
|
||
|
||
## 问题说明
|
||
|
||
每次部署数据库时,经常会遇到字段缺失的问题,导致应用报错。这是因为:
|
||
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. **文档同步**:添加新字段时及时更新本文档
|