使用Azure Database for PostgreSQL灵活服务器中的故障排除指南

本文介绍适用于这六篇指南的通用操作:启用这些指南所读取的遥测数据、打开指南、按步骤完成指南中的操作,以及解决因数据缺失而出现的空图表问题。 关于各指南分别适用于什么情况,请参阅 什么是故障排除指南?。如需逐一了解各图表的解读,请参阅各篇指南文章。

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

先决条件

在需要使用遥测功能 之前 启用遥测。 数据仅从启用源的那一刻开始累积,因此在事件期间启用数据不会帮助你调查已发生的情况。 将此条件视为服务器初始配置。

进行配置的两个位置:

  1. 诊断设置,用于将日志类别路由到Log Analytics工作区。 请按照配置和访问日志中的说明操作。
  2. 服务器参数,用于启用查询存储、增强的指标和单个参数。 请参阅 服务器参数。

各指南的要求

指南 诊断日志类别 查询存储库 增强式指标 服务器参数
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

如果只执行一项操作,请在每个生产服务器上启用上表中 的所有 类别。 这些指南在数据不完整时仍能正常发挥作用,但对于你现在正在调查的事故期间未采集到的数据,事后是无法补采的。

打开指南

  1. 在 Azure 门户中,转到 Azure Database for PostgreSQL 灵活服务器实例。

  2. 在左侧菜单中的 “监视 ”下,选择 “故障排除指南”。

  3. 选择要调查的问题的选项卡。

  4. 设置要分析的时间范围。

    注释

    一小时是最小值。 如果你选择的时间段较短,系统将回退为以你所选结束时间为终点的一小时捕获窗口,因此实际时间范围会比你要求的更大。

按照指南操作

每篇指南都遵循相同的结构。 一旦完成其中一个,其余的也就都熟悉了。

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 文本。 若要解决此问题,请执行下列操作:

  1. 连接到azure_sys数据库,其中查询存储保留其数据。

    psql -h <server_name>.postgres.database.chinacloudapi.cn -U <admin_user_name> -d azure_sys
    
  2. 查找指南中所示的标识符。

    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解析文本:

  1. 在副本上设置 pg_qs.emit_query_text = on 。
  2. 在 诊断设置中,启用 allLogs 或 审核 类别组。
  3. 使用该指南生成的 KQL,在 PGSQLQueryStoreQueryText 表中查找该标识符。

启用后最多等待 30 分钟,并确保您至少对工作区具有 读者 访问权限。

检索用户名或角色

门户显示来自 pg_catalog 的数字角色 ID,而不是用户名。 将其转换为 regrole 以解决此问题:

SELECT <role_id>::regrole;

例如,角色 ID 24776:

SELECT 24776::regrole;

还可以直接查询 pg_roles 。