122 lines
3.8 KiB
Markdown
122 lines
3.8 KiB
Markdown
# 60分钟自动同步数据问题诊断报告
|
||
|
||
## 问题描述
|
||
|
||
用户反馈:60分钟自动同步数据功能没有正常工作,`xq_client_log` 表中仍然是空数据。
|
||
|
||
## 问题分析
|
||
|
||
### 1. 当前状态
|
||
- ✅ 应用正在运行(PID 17008)
|
||
- ✅ 定时任务配置正确(60分钟间隔)
|
||
- ❌ 数据同步失败:`Data truncation: Data too long for column 'latitude'`
|
||
- ❌ `xq_client_log` 表查询结果为0条记录
|
||
|
||
### 2. 根本原因
|
||
**数据库字段长度限制**:`latitude` 字段长度不够,导致数据截断错误,批量插入失败。
|
||
|
||
## 解决方案
|
||
|
||
### 第一步:修复数据库字段长度
|
||
```sql
|
||
-- 执行 emergency_fix_field_length.sql
|
||
ALTER TABLE xq_client_log MODIFY COLUMN latitude VARCHAR(500) DEFAULT NULL COMMENT '纬度';
|
||
ALTER TABLE xq_client_log MODIFY COLUMN longitude VARCHAR(500) DEFAULT NULL COMMENT '经度';
|
||
ALTER TABLE xq_client_log MODIFY COLUMN device_voltage VARCHAR(500) DEFAULT NULL COMMENT '设备电量';
|
||
ALTER TABLE xq_client_log MODIFY COLUMN device_temp VARCHAR(500) DEFAULT NULL COMMENT '设备温度';
|
||
ALTER TABLE xq_client_log MODIFY COLUMN server_device_id VARCHAR(500) DEFAULT NULL COMMENT '主机设备ID';
|
||
```
|
||
|
||
### 第二步:清空表并重新同步
|
||
```sql
|
||
-- 清空现有数据
|
||
TRUNCATE TABLE xq_client_log;
|
||
```
|
||
|
||
### 第三步:手动触发同步
|
||
```bash
|
||
# 手动触发数据同步
|
||
Invoke-WebRequest -Uri "http://localhost:8080/api/deliveryDevice/manualSyncDeviceLogs" -Method POST
|
||
```
|
||
|
||
## 技术细节
|
||
|
||
### 1. 定时任务配置
|
||
```java
|
||
@Scheduled(fixedRate = 60 * 60 * 1000) // 60分钟
|
||
public void syncDeviceDataToLogs() {
|
||
try {
|
||
logger.info("开始执行设备日志同步定时任务");
|
||
iotDeviceLogSyncService.syncDeviceDataToLogs();
|
||
logger.info("设备日志同步定时任务执行完成");
|
||
iotDeviceLogSyncService.logSyncStatistics();
|
||
} catch (Exception e) {
|
||
logger.error("设备日志同步定时任务执行失败", e);
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. 数据同步逻辑
|
||
- 查询 `iot_device_data` 表的所有设备
|
||
- 按设备类型分组(1=主机,2=耳标,4=项圈)
|
||
- 转换为对应的日志实体
|
||
- 批量插入到日志表
|
||
|
||
### 3. 字段映射关系
|
||
| iot_device_data | xq_client_log | 说明 |
|
||
|----------------|---------------|------|
|
||
| `voltage` | `device_voltage` | 设备电压 |
|
||
| `temperature` | `device_temp` | 设备温度 |
|
||
| `steps` | `walk_steps` | 总步数 |
|
||
| `same_day_steps` | `y_walk_steps` | 昨日步数 |
|
||
| `latitude` | `latitude` | 纬度 |
|
||
| `longitude` | `longitude` | 经度 |
|
||
|
||
## 测试验证
|
||
|
||
### 1. 数据库字段长度测试
|
||
```sql
|
||
-- 执行 test_data_sync_functionality.sql
|
||
-- 验证字段长度是否足够
|
||
```
|
||
|
||
### 2. 手动插入测试
|
||
```sql
|
||
-- 手动插入一条测试记录
|
||
INSERT INTO xq_client_log (...) VALUES (...);
|
||
```
|
||
|
||
### 3. 批量同步测试
|
||
```bash
|
||
# 手动触发同步
|
||
POST /api/deliveryDevice/manualSyncDeviceLogs
|
||
```
|
||
|
||
## 预期结果
|
||
|
||
修复后,应该看到:
|
||
1. **数据库字段长度**:所有字段长度 >= 500字符
|
||
2. **数据同步成功**:不再有 `Data truncation` 错误
|
||
3. **日志表有数据**:`xq_client_log` 表包含设备数据
|
||
4. **定时任务正常**:每60分钟自动同步数据
|
||
|
||
## 故障排除
|
||
|
||
如果问题仍然存在,请检查:
|
||
1. **数据库权限**:确认应用有ALTER TABLE权限
|
||
2. **字段类型**:确认字段类型支持VARCHAR(500)
|
||
3. **数据格式**:确认经纬度数据格式正确
|
||
4. **日志输出**:查看应用日志中的详细错误信息
|
||
|
||
## 下一步行动
|
||
|
||
1. ✅ 执行数据库字段长度修复脚本
|
||
2. ✅ 清空 `xq_client_log` 表
|
||
3. 📋 手动触发数据同步
|
||
4. 📋 验证同步结果
|
||
5. 📋 确认60分钟定时任务正常工作
|
||
|
||
## 结论
|
||
|
||
**问题已定位**:数据库字段长度限制导致数据同步失败。修复字段长度后,60分钟自动同步功能应该能正常工作。
|