Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法访问PostgreSQL中的流式复制统计信息_Postgresql_Replication_Monitoring - Fatal编程技术网

无法访问PostgreSQL中的流式复制统计信息

无法访问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 因此,客户机地址、客户机主机名、客户机端口、后端启动、状态、发送位置、

我有需要监视的流式复制。因此,Zabbix有一个特殊的用户。我不想使用pg_mongz,决定将自己的查询设置为pg_目录模式的view pg_stat_replication以获取复制状态

使用查询时:

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安全定义器;