🚀 核心优化内容: - ljwx-boot: 添加user_type和admin_level冗余字段到sys_user表 - ljwx-boot: 重构管理员判断方法,从复杂多表JOIN优化为单字段查询 - ljwx-boot: 实现数据同步维护机制,确保数据一致性 - ljwx-bigscreen: 移除复杂admin_helper,直接在SQL中使用user_type过滤 - 性能提升: 查询复杂度从O(N*M)优化为O(1) 📊 技术改进: - 数据库: 新增UserType和AdminLevel枚举定义 - 迁移: 创建数据迁移脚本初始化现有用户类型 - 同步: 角色/组织变更时自动更新用户类型字段 - 查询: 消除多表JOIN,直接使用索引查询 🎯 预期效果: - 减少数据库负载,提升查询性能 - 简化代码逻辑,降低维护成本 - 实时准确,无需复杂缓存机制 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
623 lines
15 KiB
Markdown
623 lines
15 KiB
Markdown
# 智能穿戴系统数据库升级指南
|
||
|
||
## 概述
|
||
|
||
本指南提供了智能穿戴系统客户现场数据库升级的完整解决方案。该方案旨在为现有客户提供安全、可靠、可回滚的数据库升级体验。
|
||
|
||
## 核心特性
|
||
|
||
### 🔧 智能版本管理
|
||
- **自动版本检测**: 自动识别现网数据库版本
|
||
- **版本记录追踪**: 完整的升级历史记录
|
||
- **迁移脚本管理**: 按版本自动应用迁移脚本
|
||
|
||
### 🛡️ 安全保障机制
|
||
- **完整数据备份**: 升级前自动创建完整备份
|
||
- **原子事务执行**: 确保升级过程的一致性
|
||
- **健康检查验证**: 升级前后完整的健康检查
|
||
- **一键回滚功能**: 升级失败自动回滚
|
||
|
||
### 📊 可观测性
|
||
- **详细升级日志**: 完整的升级过程记录
|
||
- **升级状态报告**: 自动生成升级报告
|
||
- **性能监控**: 升级过程性能指标
|
||
|
||
## 目录结构
|
||
|
||
```
|
||
client-deployment/
|
||
├── database-upgrade-manager.sh # 主升级管理脚本
|
||
├── database/
|
||
│ ├── migrations/ # 迁移脚本目录
|
||
│ │ ├── 003_create_weight_cache_table.sql
|
||
│ │ ├── 004_optimize_health_baseline_for_userid.sql
|
||
│ │ ├── 005_create_message_v2_tables.sql
|
||
│ │ └── 006_alert_auto_process_enhancement_fixed.sql
|
||
│ └── upgrade_1.0.0_to_1.1.0.sql # 版本特定升级脚本
|
||
├── backup/
|
||
│ └── database-upgrade/ # 升级备份目录
|
||
└── logs/
|
||
└── database-upgrade/ # 升级日志目录
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
### 1. 检查当前数据库版本
|
||
|
||
```bash
|
||
# 查看当前数据库版本状态
|
||
./database-upgrade-manager.sh status
|
||
```
|
||
|
||
### 2. 执行数据库升级
|
||
|
||
```bash
|
||
# 从版本 1.0.0 升级到 1.1.0
|
||
./database-upgrade-manager.sh upgrade 1.0.0 1.1.0
|
||
```
|
||
|
||
### 3. 验证升级结果
|
||
|
||
升级完成后,脚本会自动生成升级报告和执行健康检查。
|
||
|
||
## 详细使用指南
|
||
|
||
### 命令行接口
|
||
|
||
```bash
|
||
# 显示帮助信息
|
||
./database-upgrade-manager.sh help
|
||
|
||
# 检查数据库版本和状态
|
||
./database-upgrade-manager.sh status
|
||
|
||
# 执行数据库升级
|
||
./database-upgrade-manager.sh upgrade [源版本] [目标版本]
|
||
|
||
# 回滚到升级前状态
|
||
./database-upgrade-manager.sh rollback
|
||
```
|
||
|
||
### 配置文件
|
||
|
||
脚本默认读取 `custom-config.env` 配置文件,包含以下关键配置:
|
||
|
||
```bash
|
||
# MySQL 配置
|
||
MYSQL_CONTAINER=ljwx-mysql
|
||
MYSQL_USER=root
|
||
MYSQL_PASSWORD=123456
|
||
MYSQL_DATABASE=lj-06
|
||
|
||
# 备份配置
|
||
BACKUP_DIR=backup/database-upgrade
|
||
LOG_DIR=logs/database-upgrade
|
||
```
|
||
|
||
### 升级前准备
|
||
|
||
#### 1. 环境检查
|
||
|
||
确保以下条件满足:
|
||
|
||
- [x] MySQL 容器正常运行
|
||
- [x] 数据库连接正常
|
||
- [x] 磁盘空间充足 (建议预留 > 15%)
|
||
- [x] 备份目录可写
|
||
- [x] 日志目录可写
|
||
|
||
#### 2. 停止应用服务(可选)
|
||
|
||
为避免升级过程中的数据冲突,建议停止应用服务:
|
||
|
||
```bash
|
||
docker stop ljwx-boot ljwx-admin ljwx-bigscreen
|
||
```
|
||
|
||
### 升级流程详解
|
||
|
||
#### 步骤 1: 健康检查
|
||
|
||
```bash
|
||
[10:30:15] 🔍 执行升级前健康检查...
|
||
[10:30:16] ✅ 健康检查通过
|
||
```
|
||
|
||
- 检查 MySQL 容器状态
|
||
- 验证数据库连接
|
||
- 检查磁盘空间使用率
|
||
- 评估数据库大小
|
||
|
||
#### 步骤 2: 数据备份
|
||
|
||
```bash
|
||
[10:30:16] 📦 创建数据库备份...
|
||
[10:30:25] ✅ 数据备份完成: pre_upgrade_20250911_103025.sql.gz (45MB)
|
||
```
|
||
|
||
- 创建完整的数据库备份
|
||
- 备份表结构文件
|
||
- 保存备份路径供回滚使用
|
||
|
||
#### 步骤 3: 执行迁移脚本
|
||
|
||
```bash
|
||
[10:30:25] 📝 执行数据库迁移脚本...
|
||
[10:30:26] 执行迁移脚本: 006_alert_auto_process_enhancement_fixed.sql
|
||
[10:30:27] ✅ 006_alert_auto_process_enhancement_fixed.sql 执行成功
|
||
[10:30:27] 执行迁移脚本: upgrade_1.0.0_to_1.1.0.sql
|
||
[10:30:30] ✅ upgrade_1.0.0_to_1.1.0.sql 执行成功
|
||
```
|
||
|
||
#### 步骤 4: 数据完整性验证
|
||
|
||
```bash
|
||
[10:30:30] 🔍 验证数据库完整性...
|
||
[10:30:31] 数据库包含 45 个表
|
||
[10:30:31] ✅ 表 sys_user: 125 条记录
|
||
[10:30:31] ✅ 表 sys_dict: 89 条记录
|
||
[10:30:31] ✅ 表 t_alert_rules: 23 条记录
|
||
```
|
||
|
||
#### 步骤 5: 性能优化
|
||
|
||
```bash
|
||
[10:30:32] ⚡ 执行数据库性能优化...
|
||
[10:30:35] ✅ 数据库优化完成
|
||
```
|
||
|
||
#### 步骤 6: 生成报告
|
||
|
||
```bash
|
||
[10:30:35] 📋 生成升级报告...
|
||
[10:30:36] ✅ 升级报告已生成: logs/database-upgrade/upgrade_report_20250911_103025.md
|
||
```
|
||
|
||
## 版本管理机制
|
||
|
||
### 版本表结构
|
||
|
||
系统自动创建 `database_version` 表记录升级历史:
|
||
|
||
```sql
|
||
CREATE TABLE database_version (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
version VARCHAR(20) NOT NULL,
|
||
description TEXT,
|
||
applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
applied_by VARCHAR(100) DEFAULT 'system',
|
||
migration_files TEXT COMMENT '应用的迁移文件列表'
|
||
);
|
||
```
|
||
|
||
### 版本检测逻辑
|
||
|
||
1. **首次安装**: 自动创建版本表,设置初始版本为 `1.0.0`
|
||
2. **版本检测**: 从版本表读取当前版本
|
||
3. **版本验证**: 确保源版本与当前版本一致
|
||
|
||
### 迁移脚本管理
|
||
|
||
#### 脚本命名规范
|
||
|
||
- **通用迁移脚本**: `database/migrations/XXX_description.sql`
|
||
- **版本特定脚本**: `database/upgrade_[源版本]_to_[目标版本].sql`
|
||
|
||
#### 脚本执行顺序
|
||
|
||
1. 按文件名排序执行 `migrations/` 目录中的脚本
|
||
2. 执行版本特定的升级脚本
|
||
3. 更新版本记录
|
||
|
||
## 备份与恢复
|
||
|
||
### 自动备份策略
|
||
|
||
每次升级前自动创建:
|
||
|
||
1. **完整数据备份**: `pre_upgrade_[时间戳].sql.gz`
|
||
2. **表结构备份**: `structure_[时间戳].sql`
|
||
3. **备份路径记录**: `latest_backup.path`
|
||
|
||
### 手动备份
|
||
|
||
```bash
|
||
# 使用现有的备份脚本
|
||
./auto-backup.sh
|
||
|
||
# 或使用 MySQL 原生备份
|
||
docker exec ljwx-mysql mysqldump -uroot -p123456 --single-transaction --routines --triggers --events lj-06 | gzip > manual_backup.sql.gz
|
||
```
|
||
|
||
### 回滚操作
|
||
|
||
#### 自动回滚
|
||
|
||
升级失败时会自动触发回滚:
|
||
|
||
```bash
|
||
[10:35:15] 🔄 开始数据库回滚操作...
|
||
[10:35:25] ✅ 数据库回滚成功
|
||
[10:35:30] ✅ 回滚操作完成
|
||
```
|
||
|
||
#### 手动回滚
|
||
|
||
```bash
|
||
# 回滚到升级前状态
|
||
./database-upgrade-manager.sh rollback
|
||
```
|
||
|
||
#### 回滚流程
|
||
|
||
1. 停止应用服务
|
||
2. 从备份文件恢复数据库
|
||
3. 重启应用服务
|
||
4. 验证回滚结果
|
||
|
||
## 支持的升级路径
|
||
|
||
### 当前版本升级矩阵
|
||
|
||
| 源版本 | 目标版本 | 升级脚本 | 状态 |
|
||
|--------|----------|----------|------|
|
||
| 1.0.0 | 1.1.0 | ✅ 可用 | 已测试 |
|
||
| 1.1.0 | 1.2.0 | 🚧 开发中 | 计划中 |
|
||
|
||
### 版本更新内容
|
||
|
||
#### v1.1.0 更新内容
|
||
|
||
**功能增强**:
|
||
- ✅ 告警自动处理功能
|
||
- ✅ 权重配置缓存系统
|
||
- ✅ 性能优化索引
|
||
|
||
**数据库变更**:
|
||
- 新增 `t_weight_cache` 表
|
||
- `t_alert_rules` 表增加自动处理字段
|
||
- `t_alert_info` 表增加处理跟踪字段
|
||
- 新增多个性能优化索引
|
||
|
||
**迁移脚本**:
|
||
- `006_alert_auto_process_enhancement_fixed.sql`
|
||
- `upgrade_1.0.0_to_1.1.0.sql`
|
||
|
||
## 故障排除
|
||
|
||
### 常见问题
|
||
|
||
#### 1. 升级失败:权限不足
|
||
|
||
**问题**:
|
||
```
|
||
[ERROR] 数据备份失败
|
||
```
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 检查备份目录权限
|
||
chmod 755 backup/database-upgrade/
|
||
chown $(whoami):$(whoami) backup/database-upgrade/
|
||
|
||
# 检查 MySQL 容器状态
|
||
docker ps | grep ljwx-mysql
|
||
```
|
||
|
||
#### 2. 升级失败:磁盘空间不足
|
||
|
||
**问题**:
|
||
```
|
||
[WARN] 磁盘使用率 88%,建议清理空间
|
||
```
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 清理 Docker 镜像
|
||
docker image prune -f
|
||
|
||
# 清理旧备份文件
|
||
find backup/ -name "*.sql.gz" -mtime +30 -delete
|
||
|
||
# 清理 Docker 日志
|
||
docker system prune -f
|
||
```
|
||
|
||
#### 3. 迁移脚本执行失败
|
||
|
||
**问题**:
|
||
```
|
||
[ERROR] 006_alert_auto_process_enhancement_fixed.sql 执行失败
|
||
```
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 手动检查脚本内容
|
||
cat database/migrations/006_alert_auto_process_enhancement_fixed.sql
|
||
|
||
# 手动执行脚本测试
|
||
docker exec -i ljwx-mysql mysql -uroot -p123456 lj-06 < database/migrations/006_alert_auto_process_enhancement_fixed.sql
|
||
|
||
# 检查表结构
|
||
docker exec ljwx-mysql mysql -uroot -p123456 lj-06 -e "DESCRIBE t_alert_rules;"
|
||
```
|
||
|
||
#### 4. 回滚失败
|
||
|
||
**问题**:
|
||
```
|
||
[ERROR] 备份文件不存在: backup/database-upgrade/pre_upgrade_xxx.sql.gz
|
||
```
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 检查备份文件
|
||
ls -la backup/database-upgrade/
|
||
|
||
# 使用最新可用备份
|
||
ls -t backup/database-upgrade/*.sql.gz | head -1
|
||
|
||
# 手动指定备份文件恢复
|
||
zcat backup/database-upgrade/[备份文件] | docker exec -i ljwx-mysql mysql -uroot -p123456
|
||
```
|
||
|
||
### 日志分析
|
||
|
||
#### 升级日志位置
|
||
|
||
```bash
|
||
# 查看最新升级日志
|
||
tail -f logs/database-upgrade/upgrade_*.log
|
||
|
||
# 查看升级报告
|
||
cat logs/database-upgrade/upgrade_report_*.md
|
||
```
|
||
|
||
#### 关键日志模式
|
||
|
||
```bash
|
||
# 查找错误信息
|
||
grep "ERROR" logs/database-upgrade/upgrade_*.log
|
||
|
||
# 查找警告信息
|
||
grep "WARN" logs/database-upgrade/upgrade_*.log
|
||
|
||
# 查看执行时间
|
||
grep "执行时间" logs/database-upgrade/upgrade_*.log
|
||
```
|
||
|
||
## 性能考虑
|
||
|
||
### 升级时间预估
|
||
|
||
| 数据库大小 | 预估升级时间 | 备份时间 | 迁移时间 |
|
||
|-----------|-------------|----------|----------|
|
||
| < 100MB | 1-2 分钟 | 10-20秒 | 30-60秒 |
|
||
| 100MB-1GB | 3-8 分钟 | 1-2分钟 | 2-5分钟 |
|
||
| 1GB-10GB | 10-30 分钟 | 3-8分钟 | 5-15分钟 |
|
||
| > 10GB | 30+ 分钟 | 10+分钟 | 15+分钟 |
|
||
|
||
### 性能优化建议
|
||
|
||
#### 升级前优化
|
||
|
||
```bash
|
||
# 清理无用数据
|
||
docker exec ljwx-mysql mysql -uroot -p123456 lj-06 -e "
|
||
DELETE FROM t_alert_info WHERE create_time < DATE_SUB(NOW(), INTERVAL 6 MONTH);
|
||
OPTIMIZE TABLE t_alert_info;
|
||
"
|
||
|
||
# 释放磁盘空间
|
||
docker exec ljwx-mysql mysql -uroot -p123456 -e "PURGE BINARY LOGS BEFORE NOW();"
|
||
```
|
||
|
||
#### 升级后优化
|
||
|
||
```bash
|
||
# 分析表统计信息
|
||
docker exec ljwx-mysql mysql -uroot -p123456 lj-06 -e "
|
||
ANALYZE TABLE t_alert_rules, t_alert_info, t_weight_cache;
|
||
"
|
||
|
||
# 检查索引使用情况
|
||
docker exec ljwx-mysql mysql -uroot -p123456 lj-06 -e "
|
||
SHOW INDEX FROM t_alert_info;
|
||
"
|
||
```
|
||
|
||
## 集成到现有部署流程
|
||
|
||
### 修改 deploy-client.sh
|
||
|
||
在现有部署脚本中集成数据库升级检查:
|
||
|
||
```bash
|
||
# 在 deploy-client.sh 中添加升级检查
|
||
if ! is_first_deployment; then
|
||
echo "🔄 检测到升级部署,执行数据库升级检查..."
|
||
|
||
# 检查是否需要数据库升级
|
||
CURRENT_DB_VERSION=$(./database-upgrade-manager.sh status | grep "当前数据库版本" | cut -d: -f2 | xargs)
|
||
TARGET_DB_VERSION="1.1.0" # 从配置文件或环境变量读取
|
||
|
||
if [ "$CURRENT_DB_VERSION" != "$TARGET_DB_VERSION" ]; then
|
||
echo "数据库需要从 $CURRENT_DB_VERSION 升级到 $TARGET_DB_VERSION"
|
||
|
||
if confirm "是否执行数据库升级?"; then
|
||
./database-upgrade-manager.sh upgrade "$CURRENT_DB_VERSION" "$TARGET_DB_VERSION"
|
||
else
|
||
echo "跳过数据库升级"
|
||
fi
|
||
else
|
||
echo "数据库版本已是最新: $CURRENT_DB_VERSION"
|
||
fi
|
||
fi
|
||
```
|
||
|
||
### 自动化升级流程
|
||
|
||
创建升级检查脚本 `check-upgrade.sh`:
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
# 自动检查和执行升级
|
||
|
||
# 读取配置中的目标版本
|
||
TARGET_VERSION=$(grep "DB_VERSION=" custom-config.env | cut -d= -f2)
|
||
CURRENT_VERSION=$(./database-upgrade-manager.sh status | grep "当前数据库版本" | cut -d: -f2 | xargs)
|
||
|
||
if [ "$CURRENT_VERSION" != "$TARGET_VERSION" ]; then
|
||
echo "检测到数据库版本差异,启动升级流程..."
|
||
./database-upgrade-manager.sh upgrade "$CURRENT_VERSION" "$TARGET_VERSION"
|
||
else
|
||
echo "数据库版本已是最新"
|
||
fi
|
||
```
|
||
|
||
## 最佳实践
|
||
|
||
### 1. 升级前准备清单
|
||
|
||
- [ ] 确认服务运行状态正常
|
||
- [ ] 验证数据库连接和权限
|
||
- [ ] 检查磁盘空间充足 (>20% 可用空间)
|
||
- [ ] 备份关键配置文件
|
||
- [ ] 通知相关人员升级计划
|
||
- [ ] 准备回滚计划
|
||
|
||
### 2. 升级执行
|
||
|
||
- [ ] 选择业务低峰期执行
|
||
- [ ] 停止非必要应用服务
|
||
- [ ] 监控升级过程日志
|
||
- [ ] 验证升级后功能正常
|
||
- [ ] 检查性能指标
|
||
|
||
### 3. 升级后验证
|
||
|
||
```bash
|
||
# 功能验证脚本
|
||
#!/bin/bash
|
||
echo "开始升级后验证..."
|
||
|
||
# 1. 数据库连接测试
|
||
if docker exec ljwx-mysql mysql -uroot -p123456 lj-06 -e "SELECT 1;" &>/dev/null; then
|
||
echo "✅ 数据库连接正常"
|
||
else
|
||
echo "❌ 数据库连接失败"
|
||
exit 1
|
||
fi
|
||
|
||
# 2. 关键表检查
|
||
TABLES=("sys_user" "t_alert_rules" "t_alert_info" "t_weight_cache")
|
||
for table in "${TABLES[@]}"; do
|
||
count=$(docker exec ljwx-mysql mysql -uroot -p123456 lj-06 -e "SELECT COUNT(*) FROM $table;" -s -N 2>/dev/null)
|
||
if [[ $count -ge 0 ]]; then
|
||
echo "✅ 表 $table: $count 条记录"
|
||
else
|
||
echo "❌ 表 $table 检查失败"
|
||
fi
|
||
done
|
||
|
||
# 3. 新功能测试
|
||
if docker exec ljwx-mysql mysql -uroot -p123456 lj-06 -e "DESCRIBE t_alert_rules auto_process_enabled;" &>/dev/null; then
|
||
echo "✅ 自动处理功能字段存在"
|
||
else
|
||
echo "❌ 自动处理功能字段缺失"
|
||
fi
|
||
|
||
# 4. 应用服务健康检查
|
||
sleep 10
|
||
curl -f http://localhost:9998/actuator/health &>/dev/null && echo "✅ ljwx-boot 服务正常" || echo "❌ ljwx-boot 服务异常"
|
||
curl -f http://localhost:8001/health &>/dev/null && echo "✅ ljwx-bigscreen 服务正常" || echo "❌ ljwx-bigscreen 服务异常"
|
||
curl -f http://localhost:8080/ &>/dev/null && echo "✅ ljwx-admin 服务正常" || echo "❌ ljwx-admin 服务异常"
|
||
|
||
echo "验证完成!"
|
||
```
|
||
|
||
### 4. 监控和告警
|
||
|
||
```bash
|
||
# 设置升级监控脚本
|
||
#!/bin/bash
|
||
# upgrade-monitor.sh
|
||
|
||
LOG_FILE="logs/database-upgrade/upgrade_$(date +%Y%m%d_*).log"
|
||
|
||
# 监控升级进度
|
||
tail -f $LOG_FILE | while read line; do
|
||
case "$line" in
|
||
*"ERROR"*)
|
||
# 发送告警通知
|
||
echo "数据库升级遇到错误: $line" | mail -s "升级告警" [email protected]
|
||
;;
|
||
*"✅ 数据库升级成功"*)
|
||
# 发送成功通知
|
||
echo "数据库升级成功完成" | mail -s "升级成功" [email protected]
|
||
break
|
||
;;
|
||
esac
|
||
done
|
||
```
|
||
|
||
## 技术架构
|
||
|
||
### 脚本架构设计
|
||
|
||
```
|
||
database-upgrade-manager.sh
|
||
├── 配置管理模块
|
||
│ ├── 环境变量加载
|
||
│ └── 参数验证
|
||
├── 版本管理模块
|
||
│ ├── 版本检测
|
||
│ ├── 版本表创建
|
||
│ └── 版本记录更新
|
||
├── 备份恢复模块
|
||
│ ├── 数据备份
|
||
│ ├── 结构备份
|
||
│ └── 自动回滚
|
||
├── 迁移执行模块
|
||
│ ├── 脚本扫描
|
||
│ ├── 事务执行
|
||
│ └── 错误处理
|
||
├── 验证模块
|
||
│ ├── 健康检查
|
||
│ ├── 完整性验证
|
||
│ └── 性能测试
|
||
└── 报告模块
|
||
├── 日志记录
|
||
├── 报告生成
|
||
└── 统计分析
|
||
```
|
||
|
||
### 数据流图
|
||
|
||
```
|
||
现网数据库 --> 版本检测 --> 健康检查 --> 数据备份
|
||
↓
|
||
升级报告 <-- 性能优化 <-- 完整性验证 <-- 迁移执行
|
||
↓ ↓
|
||
用户确认 错误处理
|
||
↓ ↓
|
||
升级完成 <-- 服务重启 <-- 清理临时文件 自动回滚
|
||
```
|
||
|
||
## 总结
|
||
|
||
本数据库升级解决方案提供了:
|
||
|
||
✅ **完整的版本管理**: 自动版本检测和升级路径管理
|
||
✅ **可靠的安全保障**: 完整备份和一键回滚机制
|
||
✅ **详细的可观测性**: 全程日志记录和升级报告
|
||
✅ **灵活的扩展性**: 支持自定义迁移脚本和配置
|
||
✅ **便捷的操作体验**: 一键命令完成复杂升级流程
|
||
|
||
通过这套解决方案,客户可以安全、便捷地完成数据库升级,确保业务连续性和数据安全性。
|
||
|
||
---
|
||
|
||
**技术支持**: 如有问题请联系技术支持团队
|
||
**文档版本**: v1.0
|
||
**更新时间**: 2025-09-11 |