简介
今天遇到了一个非常低级的错误,psql无法访问已知的数据库
当我使用psql -h 的时候,会提示报错
[postgres@vm107 ~]$ psql -h 10.0.0.107
Password for user postgres:
psql: error: connection to server at "10.0.0.107", port 5432 failed: FATAL: no such database: postgres
首先postgres数据库是有的
其次白名单也没有问题
数据库监听也没有问题
在查看服务器对外服务地址的时候,就发现了问题
tcp协议的对外服务中没有postgres进程。这样就好理解了,
psql 没有加h的时候是不走TCP协议的。加了h 是需要走TCP 协议的,但是却没有对应的,
虽然在对外服务中你有看到tcp6 协议,那是PG默认开启时就是对所有IPv6 可以访问。但是由于我在白名单中并没有开放IPv6的访问名单,所以即便访问进来,也会被pg_hba.conf拒绝
这里还有一条pgbouncer的信息
tcp 0 0 10.0.0.107:5432 0.0.0.0:* LISTEN 38255/pgbouncer
Local Address 端口信息竟然和我PG的一样,对口相同,PG竟然还能起得来。
psql -h 后面使用的时IPv4 访问PG是走的tcp协议,如果使用的是IPv6,访问PG是走的tcp6协议。
结论
原来pgbouncer只会对外开启TCP服务协议,
postgresql只要有TCP或者TCP6其中一个协议能对外服务,就不影响启动。所以这个和之前同一服务器上同端口的两个PG实例启动会失败不一样。
通过IPv6 访问postgresql数据库。是可以正常访问postgresql数据库的。