我有流媒体复制,我需要监控。所以Zabbix有一个特殊的用户。我不想使用pg_mongz并决定将自己的查询设置为pg_catalog schema查看pg_stat_replication以获取复制状态。
当我使用查询时:
select *
from pg_stat_replication;
它返回admin的复制状态记录。但是当我以监控用户身份登录时,它只返回:
pid, usesysid, usename, application_name
所以像client_addr,client_hostname,client_port,backend_start,state,sent_location,write_location等参数都是空的。
首先,我在架构和表格上授予了我的用户权限:
grant usage on schema pg_catalog to usrmonitor;
grant select on all tables in schema pg_catalog to usrmonitor;
但它没有帮助。当我查看视图时,我发现查询使用函数并授予执行权:
grant execute on function pg_stat_get_wal_senders() to usrmonitor;
grant execute on function pg_stat_get_activity(integer) to usrmonitor;
但是select查询仍然返回空列。可能是什么问题?
答案 0 :(得分:3)
是的,访问这些字段的目的仅限于超级用户。
作为解决方法,您可以将函数用作具有SECURITY DEFINER属性的代理:
SECURITY DEFINER指定要执行的功能 创建它的用户的权限。
作为超级用户(通常是postgres
用户),请执行:
CREATE FUNCTION func_stat_replication() RETURNS SETOF pg_stat_replication as
$$ select * from pg_stat_replication; $$
LANGUAGE sql SECURITY DEFINER;
然后撤销/授予使用该功能的权限,以便只监视 允许用户执行它:
REVOKE EXECUTE ON FUNCTION func_stat_replication() FROM public;
GRANT EXECUTE ON FUNCTION func_stat_replication() to usrmonitor;
然后usrmonitor
应该执行:
SELECT * FROM func_stat_replication();
它将具有与超级用户相同的结果。
答案 1 :(得分:0)
从PostgreSQL 10开始,它非常简单:
GRANT pg_monitor TO monitoring_user;
(来源:https://pganalyze.com/blog/whats-new-in-postgres-10-monitoring-improvements)