简介

今天遇到了一个非常低级的错误,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数据库是有的

PG+PGBOUNCER同一端口,竟然能同时运行_sql


其次白名单也没有问题

PG+PGBOUNCER同一端口,竟然能同时运行_TCP_02


数据库监听也没有问题

PG+PGBOUNCER同一端口,竟然能同时运行_sql_03


在查看服务器对外服务地址的时候,就发现了问题

PG+PGBOUNCER同一端口,竟然能同时运行_数据库_04


tcp协议的对外服务中没有postgres进程。这样就好理解了,

psql 没有加h的时候是不走TCP协议的。加了h 是需要走TCP 协议的,但是却没有对应的,

PG+PGBOUNCER同一端口,竟然能同时运行_数据库_05


虽然在对外服务中你有看到tcp6 协议,那是PG默认开启时就是对所有IPv6 可以访问。但是由于我在白名单中并没有开放IPv6的访问名单,所以即便访问进来,也会被pg_hba.conf拒绝

PG+PGBOUNCER同一端口,竟然能同时运行_sql_06


这里还有一条pgbouncer的信息

tcp        0      0 10.0.0.107:5432         0.0.0.0:*               LISTEN      38255/pgbouncer

Local Address 端口信息竟然和我PG的一样,对口相同,PG竟然还能起得来。

PG+PGBOUNCER同一端口,竟然能同时运行_数据库_07


psql -h 后面使用的时IPv4 访问PG是走的tcp协议,如果使用的是IPv6,访问PG是走的tcp6协议。

结论

原来pgbouncer只会对外开启TCP服务协议,
postgresql只要有TCP或者TCP6其中一个协议能对外服务,就不影响启动。所以这个和之前同一服务器上同端口的两个PG实例启动会失败不一样。

通过IPv6 访问postgresql数据库。是可以正常访问postgresql数据库的。

PG+PGBOUNCER同一端口,竟然能同时运行_数据库_08