异常诊断功能为用户的数据库实例提供实时的性能监控、健康巡检、故障诊断和优化,让用户既可以直观地感知数据库实例实时的运行状况,也可以定位实时出现的性能异常,并根据优化建议进行系统优化。异常诊断支持查看实例或分片的实时和历史异常诊断信息。
整体概览
查看诊断信息
1. 登录 DBbrain 控制台。
2. 在左侧导航栏,选择诊断优化。
3. 在上方选择对应的实例 ID 或分片 ID,选择异常诊断页签。
4. 在页面右侧选择查看实时或历史诊断信息。
5. 查看时间轴范围内的健康得分趋势图和诊断的异常事件、 3D 拓扑视图或平面视图。
查看健康得分趋势图
单击趋势图中的任意时间点,显示该时间点的健康得分,同时下方联动展示以下信息:
健康得分、CPU、内存、总请求数、慢查询数、SQL 语句类型每秒执行的次数将联动展示该时间点的数据信息。
在健康得分下单击详情,可跳转至健康报告页面,查看健康发得分、得分详情和健康报告。
查看诊断事件条形图
查看视图
选择3D 或平面,查看视图。视图中将展示磁盘层(包括数据空间、日志空间、各参数值)、引擎层(回滚次数、锁等待次数、各参数值)、server 层(连接数、各参数值)等相关信息,并可单击查看配置信息,鼠标悬停至连接处序号,可显示相关数据信息。
6. 查看已选时间范围的诊断提示。
实时:选择实时,展示近三小时的风险分布和诊断详情。
历史:选择历史,展示已选时间段的风险分布和诊断详情。
查看诊断提示
1. 登录 DBbrain 控制台。
2. 在左侧导航栏,选择诊断优化。
3. 在上方选择对应的实例 ID 或分片 ID,选择异常诊断页签。
4. 在页面右侧选择查看实时或历史诊断信息。
5. 查看已选时间范围的诊断提示。
实时:选择实时,展示近三小时的风险分布和诊断详情。
历史:选择历史,展示已选时间段的风险分布和诊断详情。
查看诊断事件详情
在诊断提示中,单击具体的事件告警所在行,或者鼠标悬停至事件告警上,单击查看,进入事件详情页面,查看事件详情。
事件详情主要包括事件详情、现场描述、智能分析、优化建议等信息。诊断类型不同展示的事件详情不同,请以实际展示为准。
事件详情:包括诊断项、起止时间、风险等级、概要等信息。
现场描述:异常事件(或健康巡检事件)的外在表现现象的快照和性能趋势。
智能分析:分析导致性能异常的根本原因,定位具体操作。
优化建议:提供优化指导建议,包括但不限于 SQL 优化(索引建议、重写建议)、资源配置优化和参数调优。
诊断项说明
诊断项为智能诊断的项目,其类别包括性能、可用性、可靠性、可维护性四类,每个诊断项仅属于一个类别。
诊断项名称 | 诊断项类别 | 说明 | 风险等级划分 |
连接性检查 | 可用性 | 无法与数据库建立连接 | 致命 |
插入、更新、删除慢 | 性能 | 执行插入、更新或删除操作时,需要花费较长的时间才能完成 | 严重:锁等待导致 告警:非锁等待导致 |
慢 SQL | 性能 | 存在需要优化的慢查询语句 | 提示 |
等待行锁 | 性能 | 存在等待锁时间过长的事务 | 严重 |
事务未提交 | 性能 | 存在过长时间的未提交的事务 | 致命 |
长事务 | 性能 | 事务持续时间长 | 致命:事务持续时间 > 60 严重:60 ≥ 事务持续时间 > 30 告警:事务持续时间 ≤ 30 |
SQL 执行间隔过大事务 | 性能 | 事务中存在执行间隔过大 SQL | 致命:事务中 SQL 执行间隔 > 10 严重:10 ≥ 事务中 SQL 执行间隔 > 5 告警:事务中 SQL 执行间隔 ≤ 5 |
事务中 SQL 过多 | 性能 | 事务中 SQL 过多 | 告警:事务中SQL数量 > 1000 提示:1000 > 事务中SQL数量 ≥ 3 |
大事务影响行数 | 性能 | 该事务对过多的数据行有插入、删除或修改 | 告警:大事务影响行数 > 1000 提示:1000 > 大事务影响行数 ≥ 100 |
SQL 响应时间过长事务 | 性能 | 事务中存在响应时长过大的 SQL | 致命:事务响应时长 > 30 严重:30 ≥ 事务响应时长 > 15 告警:15 ≥ 事务响应时长 > 5 提示:事务响应时长 ≤ 5 |
存在报错 SQL 事务 | 性能 | 事务中存在报错 SQL | 致命 |
非预期提交事务 | 性能 | 事务非预期的隐式提交 | 致命 |
未恢复自动提交事务 | 性能 | 未恢复自动提交事务模式 | 致命 |
DDL 语句等待 Metadata Lock | 性能 | 存在等待 Metadata Lock 的线程,且其在执行 DDL 语句 | 严重 |
insert, update, delete 语句等待 Metadata Lock | 性能 | 存在等待 Metadata Lock 的线程,且其在执行 IUD 语句 | 严重 |
select 语句等待 Metadata Lock | 性能 | 存在等待 Metadata Lock 的线程,且其在执行 SELECT 语句 | 严重 |
死锁 | 可靠性 | 数据库发生死锁 | 致命 |
只读锁 | 性能 | 存在等待全局只读锁的线程 | 致命 |
SQL 语句等待 Metadata Lock | 性能 | 存在等待 Metadata Lock 的线程,且其在执行非 DDL、IUD、SELECT 语句 | 告警 |
Waiting for flush tables | 性能 | 存在等待 flush table 状态的线程 | 致命:活跃会话数 > 30 严重:30 > 活跃会话数 > 20 告警:活跃会话数 < 20 |
活跃会话高 | 性能 | 活跃会话数大于三倍的数据库实例 CPU 规格 | 提示 |
高并发/压力请求 | 性能 | 产生高并发或者压力请求 | 致命:CPU 利用率 > 80 严重:80 > CPU 利用率 > 60 告警:60 > CPU 利用率 > 40 |
预编译语句过多 | 性能 | 出现未关闭预编译语句个数过多(16382是 MySQL 默认允许的最大值) | 致命:预编译语句个数 > 16382 严重:16382 > 预编译语句个数 > 14695 告警:14695 > 预编译语句个数 > 11505 提示:预编译语句个数< 11505 |
磁盘空间利用率 | 可靠性 | 磁盘利用率过高 | 致命:磁盘利用率 > 95 严重:95 > 磁盘利用率 > 90 告警:90 > 预编译语句个数 > 85 提示:85 > 预编译语句个数 > 80 |
CPU 利用率 | 性能 | CPU 利用率过高 | 致命:CPU 利用率 > 80 严重:80 > CPU 利用率 > 60 告警:60 > CPU 利用率 > 40 |
Table open cache 命中率低 | 性能 | Table open cache 命中率低 | 告警 |
高危账号 | 可维护性 | 存在匿名账户、无密码账户等情况 | 提示 |
大表 | 可维护性 | 单表大于10%的实例磁盘规格 | 致命:单表所占空间 > 磁盘容量的40% 严重:磁盘容量的40% > 单表所占空间 > 磁盘容量的30% 告警:磁盘容量的30% > 单表所占空间 > 磁盘容量的20% 提示:磁盘容量的20% > 单表所占空间 > 磁盘容量的10% |
复制 IO 线程中断 | 可靠性 | 主从中断,复制 IO 线程中断 | 致命:非重启导致中断 提示:重启导致中断 |
复制 SQL 线程中断 | 可靠性 | 主从中断,复制 SQL 线程中断 | 致命:非重启导致中断 |
DDL 导致复制延迟 | 可靠性 | DDL 导致的主从复制延迟(包括主-只读,主-备库延迟)
| 致命:只读延迟 > 10min 严重:只读延迟<10min 或备库延迟 > 10 min 告警:备库<10min |
事务导致复制延迟 | 可靠性 | 事务导致的主从复制延迟(包括主-只读,主-备库延迟) | 致命:只读延迟 > 10min 严重:只读延迟<10min 或备库延迟 > 10 min 告警:备库<10min |
全局只读锁导致复制延迟 | 可靠性 | 全局只读锁导致的主从复制延迟(包括主-只读,主-备库延迟) | 致命:只读延迟 > 10min 严重:只读延迟<10min 或备库延迟 > 10 min 告警:备库<10min |
自增键耗尽 | 可用性 | 自增值超过自增主键最大值80% | 致命:自增值超过最大值80% |
复制延迟 | 可用性 | 主从复制延迟(包括主-只读,主-备库延迟) | 致命:只读延迟 > 10min 严重:只读延迟<10min 或备库延迟 > 10 min 告警:备库<10min |
主从切换 | 可用性 | 主实例和从实例发生切换 | 致命 |
全表扫描 | 可用性 | 在查询中没有使用索引,而是扫描整张表的操作。 | 致命:全表扫描行数 > 10 * N(N 表示全表扫描行数设定值,默认值 500) 严重:10 * N > 全表扫描行数 > 5 * N(N 表示全表扫描行数设定值,默认值 500) 告警:5 * N > 全表扫描行数 ≥ N(N 表示全表扫描行数设定值,默认值 500) |
执行计划变化 | 可用性 | 用于发现同 SQL 模板语句的执行计划变化。这种变化可能会导致突发性的性能劣化。 | 致命:当前 sql 的 query_cost /上一次 sql 的query_cost > 10 严重:10 > 当前 sql 的 query_cost /上一次sql的query_cost > 5 告警:5 > 当前 sql 的 query_cost /上一次 sql的 query_cost > 1 提示:当前 sql 的 query_cost /上一次 sql 的query_cost<1 |