Linux 20.04下如何修改PostgreSQL路径以识别Perl安装及解决psql执行时的权限错误
咱们一步步来拆解并解决你遇到的两个问题:先搞定眼前的psql权限报错,再调整PostgreSQL识别Perl安装的路径配置。
一、先解决psql的权限拒绝错误
你的错误提示Can't locate warnings.pm: /usr/local/lib/x86_64-linux-gnu/perl/5.30.0/warnings.pm: Permissão negada(葡萄牙语的“权限拒绝”),核心原因是postgres用户没有读取这个Perl模块文件的权限,或者系统的Perl环境配置有问题。
1. 确认psql是否为正常二进制程序
正常情况下/usr/bin/psql是C语言编译的二进制文件,而非Perl脚本。你可以先验证这一点:
file /usr/bin/psql
如果输出是类似ELF 64-bit LSB shared object, x86-64...的内容,说明psql是正常的;如果显示是Perl脚本,那说明你的psql被错误替换了,需要重新安装PostgreSQL客户端包:
# 替换成你安装的PostgreSQL版本,比如12、13 sudo apt reinstall postgresql-client-12
2. 修复Perl模块路径的权限
如果psql是正常二进制,但还是触发错误,那就是/usr/local/lib/x86_64-linux-gnu/perl/5.30.0/目录下的文件权限不足,postgres用户读不了。你可以直接给其他用户添加读权限(Perl核心模块本来就应该公开可读):
sudo chmod -R o+r /usr/local/lib/x86_64-linux-gnu/perl/5.30.0/
或者更安全的方式,把postgres用户加入到该目录所属的组,再给组添加读权限:
# 查看目录所属组 sudo ls -ld /usr/local/lib/x86_64-linux-gnu/perl/5.30.0/ # 假设所属组是staff,把postgres加入该组 sudo usermod -aG staff postgres # 给组添加读权限 sudo chmod -R g+r /usr/local/lib/x86_64-linux-gnu/perl/5.30.0/
做完后重新切换到postgres用户试试:
sudo -u postgres bash psql
3. 检查postgres用户的Perl环境变量
有时候postgres用户的PERL5LIB环境变量被设置成了非系统默认的路径,导致它找不到正确的Perl模块。你可以查看并重置:
# 查看postgres用户的Perl相关环境变量 sudo -u postgres env | grep PERL # 如果有PERL5LIB指向/usr/local的路径,编辑postgres用户的bashrc来重置 sudo nano /var/lib/postgresql/.bashrc # 添加一行:unset PERL5LIB 或者设置成系统默认路径 export PERL5LIB=/usr/lib/x86_64-linux-gnu/perl/5.30.0 # 保存退出后,重新登录postgres用户再试
二、配置PostgreSQL识别自定义Perl安装
如果你是自己编译安装了Perl(不是Ubuntu系统默认的版本),想让PostgreSQL(尤其是PL/Perl扩展)使用这个自定义版本,可以按以下步骤操作:
1. 针对PL/Perl扩展的编译配置
如果是用apt安装的PostgreSQL,默认会绑定系统自带的Perl。如果要使用自定义Perl,需要从源码编译PostgreSQL,编译时指定Perl路径:
# 编译时添加参数,替换成你的Perl安装路径 ./configure --with-perl=/usr/local/bin/perl make && sudo make install
2. 配置PostgreSQL运行时的Perl路径
如果已经安装好PostgreSQL,需要让它的运行环境能找到自定义Perl的库:
- 编辑PostgreSQL的配置文件,路径一般是
/etc/postgresql/<你的版本>/main/postgresql.conf - 添加或修改
environment参数,指定自定义Perl的库路径:environment = 'PERL5LIB=/usr/local/lib/perl5/site_perl/5.30.0' - 重启PostgreSQL服务:
sudo systemctl restart postgresql
3. 验证配置是否生效
进入psql,尝试创建PL/Perl扩展,如果没有报错,说明路径配置正确:
CREATE EXTENSION plperl;
内容的提问来源于stack exchange,提问作者John Kleber

