如何解决bash脚本中的pg_dump主机名解析错误
PostgreSQL pg_dump脚本DNS解析失败问题求助
免责声明
- 非数据库管理员(DBA)
- 非系统管理员
- 无特权用户权限
- 不精通psql/PostgreSQL
- 无安装软件/补丁权限
- 无pgadmin使用权限
- 无ping命令权限
- 无修改pg_hba.conf、/etc/nsswitch.conf、/etc/hosts等系统文件的权限
工作环境
通过Windows 10远程桌面(RDC)连接到RHEL9远程系统,仅能使用命令行界面(CLI);脚本中明文存放密码仅用于测试。
软件版本
- PostgreSQL 16.4(x86_64-pc-linux-gnu平台,gcc 7.3.1编译,64位)
- pg_dump (PostgreSQL) 17.5
脚本内容
servera=<serverA_address> serverb=<serverB_address> serverc=<serverC_address> serverd=<serverD_address> port=5432 database=postgres user=<user_name> PGPASSWORD=<password> dtg=$(date "%Y-%m-%d") export PGPASSWORD pg_dump -U ${user} -h ${servera} -p ${port} -d ${database} -F t > ${dtg}_serverAdump.tar pg_dump -U ${user} -h ${serverb} -p ${port} -d ${database} -F t > ${dtg}_serverBdump.tar pg_dump -U ${user} -h ${serverc} -p ${port} -d ${database} -F t > ${dtg}_serverCdump.tar pg_dump -U ${user} -h ${serverd} -p ${port} -d ${database} -F t > ${dtg}_serverDdump.tar
终端错误输出
pg_dump: error: could not translate host name "<serverA_address>" to address: Name or service not known pg_dump: error: could not translate host name "<serverB_address>" to address: Name or service not known pg_dump: error: could not translate host name "<serverC_address>" to address: Name or service not known pg_dump: error: could not translate host name "<serverD_address>" to address: Name or service not known
异常现象说明
直接在CLI中单独执行pg_dump命令可正常完成备份,且用nslookup和dig查询服务器地址均能正常解析:
nslookup输出
nslookup <serverA_address> Server: a.b.c.d Address: a.b.c.d#<port> Non-authoritative answer: Name: <serverA_address> Address: a.b.c.d
dig输出
; <<>> Dig 9.16.23-RH <serverA_address> ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48340 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ; COOKIE <cookie_value> (good) ;; QUESTION SECTION:; <serverA_address>. IN A ;; ANSWER SECTION: <serverA_address>. 5 IN A <serverA_ip_address> ;; Query time: 7 msec ;; SERVER: <serverA_ip_address>#<port> (<serverA_ip_address>) ;; WHEN: Wed Jun 18 <etc> ;; MSG SIZE rcvd: 138
排查方向建议
- 检查脚本与手动执行的环境变量差异:在脚本开头添加
env | grep -i dns和echo $PATH,对比手动执行命令时的输出,确认是否存在DNS相关环境变量缺失或路径不一致的情况。 - 验证跨版本兼容性:当前pg_dump版本(17.5)高于PostgreSQL服务器版本(16.4),可尝试找到服务器对应版本的pg_dump路径并在脚本中指定,测试是否解决解析问题。
- 直接使用IP替代域名:在脚本中填写服务器IP地址,绕过DNS解析环节,验证是否为脚本内域名解析的问题。
- 添加解析调试步骤:在每个pg_dump命令前添加
nslookup ${servera},确认脚本执行时是否能正常解析域名,同时检查变量是否存在拼写错误或隐藏特殊字符。 - 检查脚本编码与特殊字符:用
cat -A 脚本文件名查看脚本内容,确认服务器地址变量行没有空格、制表符等隐藏特殊字符。
内容的提问来源于stack exchange,提问作者Solaris_Guy
相关产品推荐
相关产品推荐

