本文介绍适用于这六篇指南的通用操作:启用这些指南所读取的遥测数据、打开指南、按步骤完成指南中的操作,以及解决因数据缺失而出现的空图表问题。 关于各指南分别适用于什么情况,请参阅 什么是故障排除指南?。如需逐一了解各图表的解读,请参阅各篇指南文章。
flowchart LR
A[1 Enable telemetry] --> B[2 Open the guide]
B --> C[3 Set the time range]
C --> D[4 Clear the banners]
D --> E[5 Work the tabs in order]
E --> F[6 Apply a fix]
F --> G[7 Re-check]
G -->|Still unresolved| E
先决条件
在需要使用遥测功能 之前 启用遥测。 数据仅从启用源的那一刻开始累积,因此在事件期间启用数据不会帮助你调查已发生的情况。 将此条件视为服务器初始配置。
进行配置的两个位置:
各指南的要求
| 指南 | 诊断日志类别 | 查询存储库 | 增强式指标 | 服务器参数 |
|---|---|---|---|---|
| CPU | 服务器日志、会话数据、查询存储运行时、AllMetrics |
pg_qs.query_capture_mode
=
TOP 或 ALL |
metrics.collector_database_activity |
log_lock_waits 用于锁定和阻止 |
| Memory | 服务器日志、会话数据、查询存储运行时 |
pg_qs.query_capture_mode
=
TOP 或 ALL |
metrics.collector_database_activity |
None |
| IOPS | 查询存储运行时、服务器日志、会话数据、查询存储等待统计信息 |
pg_qs.query_capture_mode
=
TOP 或 ALL; pgms_wait_sampling.query_capture_mode = ALL |
metrics.collector_database_activity |
track_io_timing = ON |
| 临时文件 | 会话数据、查询存储运行时、查询存储等待统计信息 |
pg_qs.query_capture_mode
=
TOP 或 ALL; pgms_wait_sampling.query_capture_mode = ALL |
metrics.collector_database_activity |
None |
| 自动清理监视 | 服务器日志、Autovacuum 和架构统计信息、剩余事务 | 不是必需 |
metrics.collector_database_activity 用于增强指标选项卡 |
log_autovacuum_min_duration、非负数 |
| 自动清理阻止程序 | 会话数据、剩余事务 | 不是必需 | 不是必需 | None |
有关每个源包含的内容以及可信任的量的信息,请参阅 遥测参考。
通过本机日志记录查看查询
查询存储 是主副本和只读副本上的查询数据的主要来源。 本机日志记录是同一查询的替代视图。 如果你想使用它来替代 查询存储,或者与 查询存储 一起使用,就使用它。 它需要两个参数:
- 将
log_line_prefix精确设置为time=%t, session=%c, pid=%p, user=%u, db=%d, client=%h, app=%a,包括末尾的空格,因为该指南会从您的日志行中解析出这些命名字段。 不同的前缀,即使某个前缀只是以另一种顺序承载了相同的信息,也会导致基于日志的图表显示为空。 -
log_min_duration_statement设置为阈值(以毫秒为单位)。 不使用0。
Tip
如果只执行一项操作,请在每个生产服务器上启用上表中 的所有 类别。 这些指南在数据不完整时仍能正常发挥作用,但对于你现在正在调查的事故期间未采集到的数据,事后是无法补采的。
打开指南
在 Azure 门户中,转到 Azure Database for PostgreSQL 灵活服务器实例。
在左侧菜单中的 “监视 ”下,选择 “故障排除指南”。
选择要调查的问题的选项卡。
设置要分析的时间范围。
注释
一小时是最小值。 如果你选择的时间段较短,系统将回退为以你所选结束时间为终点的一小时捕获窗口,因此实际时间范围会比你要求的更大。
按照指南操作
每篇指南都遵循相同的结构。 一旦完成其中一个,其余的也就都熟悉了。
1. 首先清除横幅
指南顶部的横幅分为两种,你需要将它们分开:
- 缺少数据警告,例如“当前禁用增强的指标”或“未启用查询存储。”在阅读其他任何内容之前解决这些警告。 由已禁用源提供数据的图表会显示为空白,这看起来与服务器正常时完全一样。
- 检测到的问题,例如工作线程饱和、长时间运行的事务或过度日志记录。 这些问题是调查结果。 它们通常直接指向应首先打开的选项卡。
2.确认症状和窗口
第一个选项卡始终显示定义问题的指标。 验证你关心的窗口中是否存在真正的峰值,并准确记下它开始和结束的时间。 之后的每个选项卡都会相对于该窗口进行读取。 如果峰值只持续了 15 分钟,而你却深入分析四小时范围内的查询,那么排名结果将主要由正常流量主导。
3. 将“更多工作”与“效率较低的工作”分开
“工作负荷”选项卡存在以回答一个问题:工作量是否增加? 如果元组活动与资源指标同步上升,说明服务器正在执行更多正常的工作负载,而你的选择是优化最重要的查询或进行扩容。 如果资源消耗上升而工作负载保持不变,说明某些方面的效率下降了:膨胀问题、执行计划变更、锁争用,或者配置变更。
4. 缩小到具体原因
按由外向内的顺序依次切换其余选项卡:先是“会话”,然后是“查询”,再是“等待”“检查点”或“配置”。 网格是交互式的。 选择一行即可展开每个查询的历史记录,或了解等待事件的含义及其成因。
5.应用修补程序,然后重新检查
大多数选项卡以建议结尾,建议拆分为即时缓解和持久修复。 一次应用一个更改,然后刷新指南并确认指标已移动。 一次性更改多个参数使得无法将改进或回归归化。
当图表为空或数据看起来错误时
图表为空几乎总是意味着遥测数据缺失,而不是服务器运行正常。 按顺序完成这些步骤。 它们的大致排列顺序是按其最终被证明是答案的频率来定的。
| 你看到的内容 | 可能的原因 | 怎么办 |
|---|---|---|
| 选项卡上的每个图表都是空白的 | 该选项卡的数据源尚未启用 | 检查横幅,然后检查 要求表。 |
| “CPU 查询 ”选项卡为空 | 查询存储未启用,或者你使用的是本机日志记录,并且log_line_prefix与预期的格式不匹配 |
将 pg_qs.query_capture_mode 设置为 TOP 或 ALL。 如果依赖于本机日志记录,请参阅 通过本机日志记录查看查询。 前缀不匹配时会静默失败,且不会显示横幅提示。 |
| 数据最多存在一个点,然后停止 | 摄取延迟 | 最多允许 30 分钟。 扩大范围并重试。 |
| 你刚刚启用了某项功能,但什么都没有改变 | 尚未应用或尚未收集 | 确认该参数已应用。 静态参数需要重启,动态参数不需要重启。 然后最多等待 30 分钟。 |
| 某些图表工作,其他图表不起作用 | 指南独立读取多个源 | 填充的图表会告诉你哪个源正在流动。 与要求表进行比较,找出差距。 |
| 查询 ID,但没有 SQL 文本 | 有意保留 | 请参阅检索查询文本。 |
| 所需的用户名的数字 ID | 有意保留 | 请参阅 “检索用户名或角色”。 |
| 数字与数据库不匹配 | 指南:筛选、采样和上限 | 符合预期。 请参阅 准确读取数字。 |
| 明明发生过的短暂尖峰却不存在 | 采样间隔 | 对会话和等待数据进行采样。 持续时间短于该间隔的事件可能不会留下任何痕迹。 |
| 窗口中确实什么都没有 | 无活动 | 扩大范围,或使用 “概述 ”页查找服务器实际繁忙时间。 |
Important
缺少数据源的指南不会在每个受影响的图表上出错。 有些会显示为空。 如果你还没确认该源已启用,那么空图表根本说明不了任何问题。
检索查询的文本
为了隐私,门户会显示数字查询 ID,而不是 SQL 文本。 若要解决此问题,请执行下列操作:
连接到
azure_sys数据库,其中查询存储保留其数据。psql -h <server_name>.postgres.database.chinacloudapi.cn -U <admin_user_name> -d azure_sys查找指南中所示的标识符。
SELECT query_sql_text FROM query_store.query_texts_view WHERE query_text_id = <query_id>;
注释
数据库中的文本受pg_qs.retention_period_in_days限制,通常短于你的 Log Analytics 保留期。 您可以在指南中看到一个查询 ID,其对应的文本已从 azure_sys 中过期移出。 若要使文本的保留时长与统计信息一样长,请启用 pg_qs.emit_query_text,并将“查询文本”类别路由到 Log Analytics。
在只读副本上
只读副本也支持 查询存储,因此上述步骤同样适用。 像在主副本上一样,在副本上连接到 azure_sys 并查询 query_store.query_texts_view。
如果这种方法不可行,还有一种后备方案,例如当你无法直接连接到副本时,或者你需要某个时间窗口的文本,而该时间窗口已经超出了副本的 查询存储 保留期限。 在这些情况下,请改为通过Log Analytics解析文本:
- 在副本上设置
pg_qs.emit_query_text=on。 - 在 诊断设置中,启用 allLogs 或 审核 类别组。
- 使用该指南生成的 KQL,在
PGSQLQueryStoreQueryText表中查找该标识符。
启用后最多等待 30 分钟,并确保您至少对工作区具有 读者 访问权限。
检索用户名或角色
门户显示来自 pg_catalog 的数字角色 ID,而不是用户名。 将其转换为 regrole 以解决此问题:
SELECT <role_id>::regrole;
例如,角色 ID 24776:
SELECT 24776::regrole;
还可以直接查询 pg_roles 。