跳到主要内容

数据库问题排查

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本指南面向 yudao-cloud 项目的数据库问题排查,聚焦以下方面:

  • MySQL 连接问题诊断与解决:连接池配置、慢查询分析、锁等待与阻塞排查。
  • TDengine 时序数据库性能优化与问题排查:写入顺序、乱序导致的压缩比异常、归档与重写策略。
  • 多数据源配置问题排查:数据源切换、事务管理与一致性。
  • 备份与恢复最佳实践:MySQL 与 TDengine 的备份脚本与归档作业。
  • SQL 优化与索引设计原则:结合 Druid 监控与仓库 SQL 分析。

项目结构

yudao-cloud 项目包含多模块与多数据源配置,生产环境通过 YAML 配置文件集中管理数据源与监控开关。TDengine 通过 Restful JDBC 连接,MySQL 通过 JDBC 连接池(Druid)接入。

Mermaid Diagram Code:

graph TB
subgraph "应用配置"
A["datasource.yaml<br/>本地/开发环境"]
B["deploy/yml/prod/datasource.yaml<br/>生产多数据源"]
C["deploy/yml/prod/application-common.yaml<br/>通用配置/Kafka/Redis"]
end
subgraph "MySQL 数据源"
D["系统库 system"]
E["基础设施库 infra"]
F["工作流 BPM"]
G["报表库 report/report_prod"]
H["启动器 launcher/device/app_install/task/uota/thirdparty"]
end
subgraph "TDengine 数据源"
I["TDengine Restful JDBC"]
J["TD 表: launcher_ad_play / app_activity_* / device_activity_* / device_runtime_* / app_runtime / blacklisted / monitor"]
end
A --> D
A --> E
A --> F
A --> G
A --> H
B --> D
B --> E
B --> F
B --> G
B --> H
C --> I
I --> J

图表来源

章节来源

核心组件

  • 多数据源与连接池:通过动态数据源与 Druid 连接池统一管理 MySQL 多库连接,支持监控、慢 SQL 记录与连接生命周期参数。
  • TDengine 连接:通过 Restful JDBC 驱动连接 TDengine,支持多张时序表的读写。
  • Druid 监控与 SQL 分析:内置 SQL 分析脚本,支持慢 SQL、并发度、错误率、资源消耗等维度分析。
  • 归档与恢复:基于 XXL-Job 调度,Shell/Python 脚本实现 TDengine 热数据导出、压缩与有序重写入归档库。

章节来源

架构总览

MySQL 与 TDengine 的数据流在 yudao-cloud 中呈现“采集-传输-写入-归档”的闭环:

Mermaid Diagram Code:

sequenceDiagram
participant Dev as "终端设备"
participant App as "业务服务"
participant MQ as "Kafka"
participant TD as "TDengine(热/归档)"
participant Job as "归档作业(XXL-Job)"
participant Py as "Python恢复脚本"
Dev->>App : 上报 APP/设备运行记录
App->>MQ : 写入 Kafka 主题
MQ-->>App : 消费确认
App->>TD : 写入热表(按天分片)
Job->>TD : 导出指定日期 CSV(按天)
TD-->>Job : 输出 CSV 文件
Job->>Py : 批量有序插入归档库
Py-->>Job : 恢复统计
Job-->>App : 更新归档状态

图表来源

详细组件分析

MySQL 连接池与慢查询分析

  • 连接池参数要点
    • 初始连接数、最小空闲、最大活跃、最大等待、空闲回收周期、空闲最短/最长存活时间、空闲检测开关。
    • 慢 SQL 记录阈值与合并 SQL 开关,便于定位慢查询。
  • 慢查询与并发分析
    • 通过 Druid 监控表字段统计平均/最大执行时间、错误率、最大并发、事务中数量、读取字节数、获取行数等。
    • 建议优先优化“慢 SQL”“高并发 SQL”“高错误率 SQL”“大数据传输 SQL”。

Mermaid Diagram Code:

flowchart TD
Start(["开始排查"]) --> Pool["检查连接池参数<br/>初始/最小/最大/等待/空闲检测"]
Pool --> Slow["开启慢 SQL 记录<br/>阈值与合并开关"]
Slow --> Monitor["使用 Druid SQL 分析脚本<br/>慢SQL/并发/错误/资源"]
Monitor --> Optimize["定位热点 SQL<br/>优化索引/分页/批处理"]
Optimize --> Verify["回归验证<br/>QPS/平均响应/错误率"]
Verify --> End(["结束"])

图表来源

章节来源

TDengine 时序数据库性能与乱序写入

  • 乱序写入导致的问题
    • 压缩比飙升、磁盘占用暴涨、索引与元数据膨胀、碎片增多。
    • 有序写入与乱序写入在磁盘占用与压缩比上差距显著。
  • 归档与重写策略
    • 热数据乱序写入 → 定期 ETL 导出 → 压缩 → 有序批量重写入归档库。
    • 通过 Shell 脚本按天导出 CSV 并压缩,Python 脚本多线程批量插入,恢复时重获时间有序性。

Mermaid Diagram Code:

flowchart TD
A["热表(按天分片)"] --> B["按天导出CSV(Shell)"]
B --> C["压缩ZIP"]
C --> D["Python多线程批量插入"]
D --> E["归档库(有序重写)"]

图表来源

章节来源

多数据源配置与事务管理

  • 多数据源配置
    • 生产环境集中配置多个 MySQL 库与 TDengine Restful JDBC,区分系统、基础设施、工作流、报表、启动器、设备、第三方等库。
  • 事务管理
    • 建议在跨库事务中明确声明与回滚策略,避免分布式事务未提交导致的数据不一致。
    • 对 TDengine 写入与 MySQL 写入采用“最终一致性”或“补偿机制”。

Mermaid Diagram Code:

graph TB
DS["动态数据源"] --> SYS["system"]
DS --> INFRA["infra"]
DS --> BPM["bpm"]
DS --> REPORT["report/report_prod"]
DS --> OTHERS["launcher/device/app_install/task/uota/thirdparty"]
DS --> TD["TDengine Restful JDBC"]

图表来源

章节来源

备份与恢复最佳实践

  • MySQL 备份
    • 使用 mysqldump 备份指定库,按日期命名,备份完成后准备文件。
  • TDengine 归档
    • Shell 脚本按天导出 CSV 并压缩,Python 脚本多线程批量插入归档库。
    • XXL-Job 调度归档任务,支持自动重试与并发控制。

Mermaid Diagram Code:

sequenceDiagram
participant Cron as "XXL-Job"
participant Job as "归档作业"
participant Shell as "app_runtime_backup.sh"
participant Py as "app_runtime_restore.py"
Cron->>Job : 下发归档任务
Job->>Shell : 上传脚本并执行
Shell-->>Job : 返回CSV压缩结果
Job->>Py : 执行恢复脚本
Py-->>Job : 返回恢复统计
Job-->>Cron : 更新归档状态

图表来源

章节来源

依赖关系分析

  • 配置依赖
    • 生产环境数据源配置集中于 deploy/yml/prod/datasource.yaml,包含 MySQL 多库与 TDengine Restful JDBC。
    • 通用配置 application-common.yaml 提供 Kafka、Redis、Actuator 等监控与消息队列参数。
  • 监控依赖
    • Druid 连接池监控与 SQL 分析脚本,支撑慢 SQL、并发、错误、资源消耗分析。
  • 作业依赖
    • XXL-Job 调度归档作业,依赖 Shell/Python 脚本与 TDengine 节点。

Mermaid Diagram Code:

graph TB
Conf["生产数据源配置"] --> MySQL["MySQL 多库"]
Conf --> TD["TDengine Restful JDBC"]
AppConf["通用配置"] --> MQ["Kafka"]
AppConf --> Mon["Actuator/监控"]
Job["归档作业"] --> Shell["app_runtime_backup.sh"]
Job --> Py["app_runtime_restore.py"]

图表来源

章节来源

性能考量

  • MySQL
    • 合理设置连接池参数,避免连接不足或过度空闲。
    • 通过慢 SQL 分析脚本识别热点 SQL,结合索引与分页优化。
    • 控制批处理大小与并发度,避免数据库过载。
  • TDengine
    • 保持写入时间有序,避免乱序导致的压缩比异常与磁盘膨胀。
    • 使用归档与重写策略,将热数据清洗后有序写入归档库。

[本节为通用指导,无需列出章节来源]

故障排查指南

MySQL 连接问题

  • 现象
    • 获取连接超时、连接池耗尽、慢 SQL 增多、错误率上升。
  • 排查步骤
    • 检查连接池参数:初始连接数、最小空闲、最大活跃、最大等待、空闲检测周期。
    • 开启慢 SQL 记录,使用 Druid SQL 分析脚本定位慢 SQL 与高并发 SQL。
    • 检查事务中数量与最大并发,避免长事务与锁竞争。
  • 处理建议
    • 调整连接池参数,适当增大最大活跃与等待时间。
    • 优化慢 SQL,添加必要索引,避免全表扫描。
    • 控制批处理与并发,避免瞬时高负载。

章节来源

慢查询与锁等待

  • 现象
    • 平均/最大执行时间异常升高,偶发超慢 SQL,锁等待时间长。
  • 排查步骤
    • 使用慢 SQL 分析脚本识别“平均执行时间 > 1000ms 或 最大执行时间 > 5000ms”的 SQL。
    • 检查事务中数量与并发度,定位长事务与热点表。
  • 处理建议
    • 优化 SQL 与索引,避免隐式转换与函数运算。
    • 将大事务拆分为小事务,缩短锁持有时间。
    • 对热点表进行分表或分区,降低锁竞争。

章节来源

多数据源与事务问题

  • 现象
    • 跨库事务未提交、数据不一致、事务超时。
  • 排查步骤
    • 明确事务边界与传播行为,确保跨库事务一致性。
    • 检查数据源切换是否正确,避免写入到错误库。
  • 处理建议
    • 使用编程式事务管理,显式提交/回滚。
    • 对跨库写入采用“最终一致性”或补偿机制。

章节来源

TDengine 写入延迟与压缩异常

  • 现象
    • 磁盘占用异常升高、压缩比异常、查询性能下降。
  • 排查步骤
    • 检查写入顺序是否乱序,是否存在大量历史回填与时间漂移。
    • 评估归档策略执行频率与恢复脚本批量大小。
  • 处理建议
    • 保持写入时间有序,或通过归档与重写策略恢复有序性。
    • 调整 Python 恢复脚本批量大小与并发度,平衡吞吐与稳定性。

章节来源

备份与恢复故障

  • 现象
    • 备份失败、恢复脚本执行异常、归档状态异常。
  • 排查步骤
    • 检查 Shell/Python 脚本参数与 TDengine 节点连通性。
    • 查看归档作业日志与恢复统计,确认批量大小与并发配置。
  • 处理建议
    • 修复脚本参数与权限,确保按天导出与压缩成功。
    • 调整批量大小与并发度,避免 TDengine 节点过载。

章节来源

结论

  • MySQL 排查应围绕连接池参数、慢 SQL、并发与事务展开,结合 Druid 监控进行定向优化。
  • TDengine 的存储效率与写入顺序密切相关,建议通过归档与重写策略恢复有序性,降低压缩比与磁盘占用。
  • 多数据源与事务需明确边界与一致性策略,避免跨库不一致。
  • 备份与恢复应标准化流程,配合脚本参数与并发控制,确保稳定性与可追溯性。

[本节为总结,无需列出章节来源]

附录

SQL 优化与索引设计原则

  • 避免全表扫描:为过滤条件与连接字段建立合适索引。
  • 减少隐式转换:确保 SQL 中类型与表结构一致,避免函数运算导致索引失效。
  • 控制返回列:仅选择必要字段,减少网络与解析开销。
  • 分页与批处理:合理使用 LIMIT 与分页,避免一次性加载过多数据。
  • 事务拆分:将大事务拆分为小事务,缩短锁持有时间。

[本节为通用指导,无需列出章节来源]

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答