Files
BrunoGaoandClaude dfee47d3a2 feat: 完成管理员用户查询优化 - 实施admin_user_query_optimization_proposal
🚀 核心优化内容:
- 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]>
2025-09-12 14:53:34 +08:00

623 lines
15 KiB
Markdown
Raw Permalink 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.
# 智能穿戴系统数据库升级指南
## 概述
本指南提供了智能穿戴系统客户现场数据库升级的完整解决方案。该方案旨在为现有客户提供安全、可靠、可回滚的数据库升级体验。
## 核心特性
### 🔧 智能版本管理
- **自动版本检测**: 自动识别现网数据库版本
- **版本记录追踪**: 完整的升级历史记录
- **迁移脚本管理**: 按版本自动应用迁移脚本
### 🛡️ 安全保障机制
- **完整数据备份**: 升级前自动创建完整备份
- **原子事务执行**: 确保升级过程的一致性
- **健康检查验证**: 升级前后完整的健康检查
- **一键回滚功能**: 升级失败自动回滚
### 📊 可观测性
- **详细升级日志**: 完整的升级过程记录
- **升级状态报告**: 自动生成升级报告
- **性能监控**: 升级过程性能指标
## 目录结构
```
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