Postgresql
pg_exporter 角色上的 pg_stat_get_progress_info(‘VACUUM’) 列上的空值
我正在嘗試導出查詢的結果
select * from pg_stat_progress_vacuum;
。問題是我可以從創建的使用者那裡看到的唯一列值是:
- PID
- 過去式
- 日期名稱
其他列始終為空。當從超級使用者帳戶執行查詢時,當然會有值。
根據
pg_stat_progress_vacuum
視圖定義,我注意到有問題的部分是使用pg_stat_get_progress_info
帶VACUUM
參數的函式(此函式返回的視圖名稱參數)。使用者已
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 上遇到了完全相同的問題,並完成了以下解決方案:
- 從超級使用者定義包裝函式:
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$;
- 從監視使用者中使用它作為:
select * from my_stat_progress_vacuum();
- 同樣的技巧對於訪問 pg_stat_* 系列的其他視圖很有用