Postgres 9.6中使用MD5加密密码创建FDW时权限报错问题
Postgres 9.6 FDW使用MD5密码无法导入外部表的原因排查
先给你梳理几个最常见的原因,按优先级排查:
1. 用户映射(USER MAPPING)的密码格式填错了
这是最容易踩坑的点!很多人以为用MD5认证就得填加密后的MD5字符串,但Postgres FDW要求你在USER MAPPING里填明文密码——Postgres会自动把明文转换成MD5格式发送给远程服务器。
如果你手动填了md5xxxxxx这种加密后的密码串,FDW发送的内容和远程服务器预期的认证信息不匹配,直接就会报错。正确的写法应该是:
CREATE USER MAPPING FOR local_db_user SERVER foreign_db_server OPTIONS (user 'remote_db_user', password '你的明文密码');
2. 远程Postgres的pg_hba.conf认证方式不支持MD5
远程数据库的pg_hba.conf文件里,针对你的FDW服务器IP的连接规则,可能设置的是password(明文密码认证)而不是md5。当你用MD5方式连接时,远程端不接受这种认证方式,就会失败。
排查步骤:
- 登录远程Postgres服务器,找到
pg_hba.conf(通常在/var/lib/postgresql/9.6/main/目录下) - 找到对应你FDW服务器IP的条目,比如:
host all all 192.168.1.100/32 password - 把
password改成md5,然后重启Postgres服务:sudo systemctl restart postgresql-9.6
3. 远程数据库用户的密码不是MD5加密存储的
如果远程Postgres的用户密码是用UNENCRYPTED PASSWORD选项创建的,那么密码会以明文形式存储在pg_shadow表里,这时候远程端可能无法接受MD5认证的连接请求。
排查方法:
登录远程数据库,执行以下SQL查看用户密码的存储格式:
SELECT usename, passwd FROM pg_shadow WHERE usename = 'remote_db_user';
如果passwd字段不是以md5开头的,重新设置用户密码(默认就是MD5加密):
ALTER USER remote_db_user PASSWORD '你的新密码';
4. 本地FDW服务器的密码加密配置不匹配
Postgres 9.6默认的password_encryption配置是md5,但如果你的本地服务器被改成了其他加密方式,可能会影响FDW的认证流程。不过这个情况比较少见,你可以检查本地的postgresql.conf:
grep password_encryption /var/lib/postgresql/9.6/main/postgresql.conf
确保值是md5,如果不是改回来并重启服务。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

