暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL知识分享-第30期

原创 多米爸比 2023-09-17
793

本期整理的几个问题如下:

  • 如何提前绑定VIP
  • 结果集的元数据如何获取
  • 善用psql条件交互式
  • 表空间size查询需要什么权限

Q1.监听如何提前绑定VIP?

在高可用环境中,主备节点会发生切换,通常使用虚拟IP(VIP)向外提供写服务,这样对于用户是无感的。

在PG里需要配置listen_addresses为“*”或者“0.0.0.0”(全链路监听),即监听本机所有网卡上的IP,但这存在遭受恶意连接的风险。

为了进行安全加固,应该避免全链路监听。但是,当绑定一个非本地IP,即网卡没有绑定的IP时,绑定会失败,报错信息为:

Cannot assign requested address

此时,需修改操作系统的配置文件/etc/sysctl.conf:

net.ipv4.ip_nonlocal_bind=1

该配置项默认值为0,表示不允许绑定一个不存在的IP。

参数值修改为1后,执行命令sysctl -p生效,然后重启数据库服务可以成功绑定VIP。

该问题引自闫老师的微信公众号文章:PgSQL-安全加固实践-如何设置非全零监听

Q2.SQL Server数据库set fmtonly on功能在PG里如何替换?

SQL Server数据库可以使用set fmtonly on获取结果集的元数据信息,在PG里可以使用元命令\gdesc来获取。

psql里可以通过?查看它的帮助信息:

\gdesc describe result of query, without executing it

\gdesc不需要实际执行查询,就可以获取结果集的元数据信息,示例如下:

postgres=# select relname,reloptions from pg_class \gdesc
   Column   |  Type  
------------+--------
 relname    | name
 reloptions | text[]
(2 rows)

Q3.psql使用条件表达式让业务逻辑更清晰

下面这个需求是在主库执行一个存储过程

psql -d postgres -AtqXc "select not pg_is_in_recovery();" | grep -qx t || exit; psql -d postgres -qt -c "CALL xxx.proc1(TRUE);"

可以使用psql的条件表达式来让逻辑变得更清晰,改写参考如下:

psql  <<EOF
    select pg_is_in_recovery() as in_recovery \gset
    \if :in_recovery
        \echo -n 'do nothing ...'
    \else
        --call procedure or do something;
    \endif
EOF

Q4.表空间size查询需要什么权限

普通用户可以使用pg_tablespace_size函数查看pg_default默认表空间的size,但无法查看pg_global和其他自定义表空间的size。

postgres=> select pg_tablespace_size('pg_global');
ERROR:  permission denied for tablespace pg_global

上面的查询就提示对pg_global表空间无权限。

从PG 10开始,使用预置角色pg_read_all_stats或者pg_monitor可以解决上面的权限问题,PG 10之前的版本需要使用superuser权限。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论