无法访问PostgreSQL中的流式复制统计信息
我有需要监视的流式复制。因此,Zabbix有一个特殊的用户。我不想使用pg_mongz,决定将自己的查询设置为pg_目录模式的view pg_stat_replication以获取复制状态 使用查询时:无法访问PostgreSQL中的流式复制统计信息,postgresql,replication,monitoring,Postgresql,Replication,Monitoring,我有需要监视的流式复制。因此,Zabbix有一个特殊的用户。我不想使用pg_mongz,决定将自己的查询设置为pg_目录模式的view pg_stat_replication以获取复制状态 使用查询时: select * from pg_stat_replication; 它返回管理员的复制状态记录。但当我以监视用户身份登录时,它只返回: pid, usesysid, usename, application_name 因此,客户机地址、客户机主机名、客户机端口、后端启动、状态、发送位置、
select *
from pg_stat_replication;
它返回管理员的复制状态记录。但当我以监视用户身份登录时,它只返回:
pid, usesysid, usename, application_name
因此,客户机地址、客户机主机名、客户机端口、后端启动、状态、发送位置、写入位置等参数均为空
首先,我向用户授予了架构和表的权限:
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查询仍然返回空列。可能有什么问题?是的,对这些字段的访问被有意限制为超级用户 作为一种解决方法,您可以使用函数作为具有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();
它将产生与超级用户相同的结果。自PostgreSQL 10以来,它就简单到:
GRANT pg_monitor TO monitoring_user;
来源:这太棒了。谢谢你,丹尼尔!一个建议是:如果人们只想向公众公开某些复制状态值,那么修改函数如下:创建函数pg_stat_replication_by_user返回表client_addr inet、client_hostname text、state text、replay_lag interval、sync_state text as$$SELECT client_addr、state、replay_lag、,从pg_stat_复制同步_状态;$$语言sql安全定义器;