Postgresql

pg_exporter 角色上的 pg_stat_get_progress_info(‘VACUUM’) 列上的空值

  • October 7, 2020

我正在嘗試導出查詢的結果select * from pg_stat_progress_vacuum;。問題是我可以從創建的使用者那裡看到的唯一列值是:

  • PID
  • 過去式
  • 日期名稱

其他列始終為空。當從超級使用者帳戶執行查詢時,當然會有值。

根據pg_stat_progress_vacuum視圖定義,我注意到有問題的部分是使用pg_stat_get_progress_infoVACUUM參數的函式(此函式返回的視圖名稱參數)。

使用者已pg_monitor分配角色。

我錯過了什麼?

select * from pg_stat_progress_vacuum;來自監控使用者的結果

[
 {
   "pid": 33079,
   "datid": 16410,
   "datname": "<database name>",
   "relid": null,
   "phase": null,
   "heap_blks_total": null,
   "heap_blks_scanned": null,
   "heap_blks_vacuumed": null,
   "index_vacuum_count": null,
   "max_dead_tuples": null,
   "num_dead_tuples": null
 },
 {
   "pid": 38625,
   "datid": 121786502,
   "datname": "<database name>",
   "relid": null,
   "phase": null,
   "heap_blks_total": null,
   "heap_blks_scanned": null,
   "heap_blks_vacuumed": null,
   "index_vacuum_count": null,
   "max_dead_tuples": null,
   "num_dead_tuples": null
 }
]

超級使用者對同一查詢的結果

postgres=# select * from pg_stat_progress_vacuum;
 pid  |   datid   |     datname      |   relid   |       phase       | heap_blks_total | heap_blks_scanned | heap_blks_vacuumed | index_vacuum_count | max_dead_tuples | num_dead_tuples
-------+-----------+------------------+-----------+-------------------+-----------------+-------------------+--------------------+--------------------+-----------------+-----------------
38625 | 121786502 | <database name> | 121786624 | vacuuming indexes |         7091104 |           7091104 |                  0 |                  0 |       178956970 |        73659774
(1 row)

從一個查詢執行到另一個查詢執行經過了幾秒鐘,所以我假設只是 autovacuum 已經完成,因此行數的差異。

Postgres 版本是 12.2

您缺少所需的權限。

要查看一行中的所有值,pg_stat_progress_vacuum必須滿足以下條件之一:

  • 你是超級使用者
  • VACUUM與目前連接相同的使用者執行
  • 你是系統角色的成員pg_read_all_stats

我在 Postgres 11.3 上遇到了完全相同的問題,並完成了以下解決方案:

  1. 從超級使用者定義包裝函式:
CREATE OR REPLACE FUNCTION public.my_stat_progress_vacuum()
RETURNS SETOF pg_stat_progress_vacuum
LANGUAGE sql
SECURITY DEFINER
AS $function$ 
select * from pg_stat_progress_vacuum;
$function$;
  1. 從監視使用者中使用它作為:
select * from my_stat_progress_vacuum();
  1. 同樣的技巧對於訪問 pg_stat_* 系列的其他視圖很有用

引用自:https://dba.stackexchange.com/questions/275497