CentOS下Perl连接PostgreSQL遇SCRAM认证版本错误求助
出现的错误
DBI connect('database=bigsdb_pseudomonas_isolates;host=localhost','apache',...) failed: SCRAM authentication requires libpq version 10 or above at test.pl line 23.
Failed to connect to database: SCRAM authentication requires libpq version 10 or above
测试脚本(test.pl)
#!/usr/bin/env perl use DBI; # Database connection parameters my $db_driver = "Pg"; my $db_name = "myDB"; my $db_user = "apache"; my $db_password = "undef"; my $db_host = "localhost"; # Attempt to connect to the database my $dbh = DBI->connect("DBI:$db_driver:database=$db_name;host=$db_host", $db_user, $db_password); # Check if the connection was successful if ($dbh) { print "Connected to database successfully!\n"; # You can perform additional database operations here if needed For example: $dbh->do("SELECT * FROM your_table"); } else { print "Failed to connect to database: " . DBI->errstr . "\n"; } # Disconnect from the database $dbh->disconnect if $dbh;
系统环境
- PostgreSQL 13.15(执行
pg_config --version输出) - Perl 5.16
- perl-DBD-Pg-2.19.3-5.el7_9.x86_64
已修改pg_hba.conf为md5认证,仍触发SCRAM相关错误,需解决方法。
确认pg_hba.conf配置生效
修改配置后必须重启PostgreSQL服务:systemctl restart postgresql-13同时检查对应条目,确保针对
localhost、用户apache、目标数据库的认证方式明确为md5,示例:host myDB apache 127.0.0.1/32 md5 host myDB apache ::1/128 md5检查并重置用户密码加密方式
若用户apache的密码存储为SCRAM格式,即使pg_hba.conf设为md5,PostgreSQL仍会强制SCRAM认证。执行SQL查看:SELECT usename, passwd FROM pg_shadow WHERE usename = 'apache';若
passwd以SCRAM-SHA-开头,重置密码为MD5格式:ALTER USER apache WITH PASSWORD '你的实际密码';注:PostgreSQL 10+默认用SCRAM,如需强制MD5重置,可临时修改
postgresql.conf中password_encryption = md5,重置后可改回(可选)。升级perl-DBD-Pg版本
当前使用的2.19.3版本发布于2013年,不支持SCRAM认证。可编译安装最新版:# 安装依赖 yum install perl-ExtUtils-MakeMaker postgresql13-devel # 下载最新源码包(以3.16.0为例) wget https://cpan.metacpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-3.16.0.tar.gz tar zxf DBD-Pg-3.16.0.tar.gz cd DBD-Pg-3.16.0 perl Makefile.PL make && make install升级后可兼容SCRAM认证,也能解决版本适配问题。
验证libpq库版本匹配
即使pg_config显示13.15,DBD::Pg可能链接了旧版libpq。检查链接的库版本:ldd $(perl -MConfig -e 'print $Config{archlib}')/auto/DBD/Pg/Pg.so | grep libpq若版本低于10,设置环境变量优先使用PostgreSQL 13的库:
export LD_LIBRARY_PATH=/usr/pgsql-13/lib:$LD_LIBRARY_PATH可将该命令添加到httpd启动脚本或用户
.bashrc中永久生效。
内容的提问来源于stack exchange,提问作者Alessandro Brozzi

