qiangdanxitong/database/README_DATABASE_SYNC.md

171 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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