无法从Supabase项目执行pg_dump,遇GSSAPI协商错误求助
问题场景
- pg_restore可正常运行,但pg_dump执行时抛出以下错误:
pg_dump: error: connection to server at "aws-0-ap-southeast-1.pooler.supabase.com" (52.74.252.201), port 5432 failed: received invalid response to GSSAPI negotiation: S
初始使用的pg_dump命令:
pg_dump postgres -h aws-0-ap-southeast-1.pooler.supabase.com -p 5432 -U postgres.[censored] -f pg_dumps/test_climbjios_prod_dump.dump -Fcpg_dump版本:15.1
此前PgAdmin 4遇到同类问题,通过添加SSL证书解决,但pg_dump添加SSL参数后仍报错:
pg_dump -d 'sslmode=require sslcert=prod-ca-2021.crt host=aws-0-ap-southeast-1.pooler.supabase.com' -p 5432 -U postgres.[censored] -F c -f pgdumps/prod_dump_0803241509.dump
解决方案
1. 强制禁用GSSAPI认证
错误核心是pg_dump默认尝试GSSAPI认证,但Supabase Pooler不支持该方式,需显式禁用。在连接参数中添加gssencmode=disable即可跳过GSSAPI协商。
修正后的命令示例:
pg_dump postgres -h aws-0-ap-southeast-1.pooler.supabase.com -p 5432 -U postgres.[censored] -f pg_dumps/test_climbjios_prod_dump.dump -Fc -d 'sslmode=require gssencmode=disable'
或整合所有参数到连接字符串:
pg_dump -d 'dbname=postgres host=aws-0-ap-southeast-1.pooler.supabase.com port=5432 user=postgres.[censored] sslmode=require gssencmode=disable' -Fc -f pg_dumps/test_climbjios_prod_dump.dump
2. 确认SSL证书路径有效性
若指定sslcert参数,需确保证书文件路径为绝对路径,或pg_dump能识别的相对路径。建议用绝对路径测试:
pg_dump -d 'dbname=postgres host=aws-0-ap-southeast-1.pooler.supabase.com port=5432 user=postgres.[censored] sslmode=require sslcert=/完整路径/prod-ca-2021.crt gssencmode=disable' -Fc -f pg_dumps/test_climbjios_prod_dump.dump
3. 排查环境变量干扰
检查是否存在PGGSSENCMODE环境变量被设为prefer或require,这会强制客户端尝试GSSAPI认证。可临时取消该变量后再执行命令:
unset PGGSSENCMODE # 重新执行pg_dump命令
补充说明
PgAdmin 4此前能解决问题,是因为其配置SSL后默认禁用了GSSAPI协商,而pg_dump默认会优先尝试该认证方式,因此必须显式添加禁用参数才能正常连接。
内容的提问来源于stack exchange,提问作者Nathan Tew

