
前言
不同的PG实例,大多由数据目录位置和端口配对组合用来标识。要么数据目录不同,要么端口不同。都标识着不同的PG实例。那么,怎么构造同一机器上,不同的数据目录,但是启用相同的端口,形成两个不同的实例呢?
实例
PG1配置文件中有关的配置项如下:
listen_addresses = '127.0.0.1'
unix_socket_directories = '/tmp' # comma-separated list of directories
port=5555
于是它可以正常启动并访问:
DATA绝对路径:/var/lib/pgsql/14/data,
进到/var/lib/pgsql/14目录:
pg_ctl start -D data/
psql -h /tmp
psql (14.10)
Type "help" for help.
postgres=#
现在我们构造PG2, 数据目录位于/var/lib/pgsql/14/d1, 内容与data下边的几位完全一样,除了配置文件:postgresql.conf
我们微调如下:
listen_addresses = '127.0.0.1'
unix_socket_directories = '/iihero/tmp' # comma-separated list of directories
port=5555
pg_ctl start -D d1/
你会发现log里头提示:
2024-07-12 21:26:21.631 CST [1721] LOG: could not bind IPv4 address "127.0.0.1": Address already in use
2024-07-12 21:26:21.631 CST [1721] HINT: Is another postmaster already running on port 5555? If not, wait a few seconds and retry.
2024-07-12 21:26:21.631 CST [1721] WARNING: could not create listen socket for "127.0.0.1"
2024-07-12 21:26:21.631 CST [1721] FATAL: could not create any TCP/IP sockets
2024-07-12 21:26:21.631 CST [1721] LOG: database system is shut down
提示地址: 127.0.0.1及端口被占用。我们有必要采用一个不同的IP地址:
mkdir -p /iihero/tmp
cat >> postgresql.conf << EOF
listen_addresses = '192.168.0.6'
unix_socket_directories = '/iihero/tmp' # comma-separated list of directories
port=5555
EOF
再度启动:
pg_ctl start -D d1/
成功了!
看看运行在同一个端口5555上的两个实例的情况:
[21:38:32-postgres@centos1:/var/lib/pgsql/14/d1]$ psql -p 5555 -h 127.0.0.1
psql (14.10)
Type "help" for help.
postgres=# show data_directory;
data_directory
------------------------
/var/lib/pgsql/14/data
(1 row)
postgres=# \q
[21:38:44-postgres@centos1:/var/lib/pgsql/14/d1]$ psql -p 5555 -h 192.168.0.6
psql (14.10)
Type "help" for help.
postgres=# show data_directory;
data_directory
----------------------
/var/lib/pgsql/14/d1
(1 row)
这样看起来,有点意思。端口相同,那么监听地址必须不同。同时Unix socket 目录也必须位于不同的位置。如果相同,一样会报错。比如,实例PG2,如果:
cat >> postgresql.conf << EOF
listen_addresses = '192.168.0.6'
unix_socket_directories = '/tmp' # comma-separated list of directories
port=5555
EOF
pg_start -D d1/
这时也会报错,日志里头显示:
2024-07-12 21:41:52.967 CST [2118] LOG: listening on IPv4 address "192.168.0.6", port 5555
2024-07-12 21:41:52.968 CST [2118] FATAL: lock file "/tmp/.s.PGSQL.5555.lock" already exists
2024-07-12 21:41:52.968 CST [2118] HINT: Is another postmaster (PID 1686) using socket file "/tmp/.s.PGSQL.5555"?
2024-07-12 21:41:52.968 CST [2118] LOG: database system is shut down
总结
经常是不同的数据目录,不同的端口,因此基本不会有任何冲突。强行让端口一样,就会增加了些难度。搞了半天,不知道说了些啥。欢迎留言。
我是【Sean】, 欢迎大家长按关注并加星公众号:数据库杂记。有好资源相送,同时为你提供及时更新。已关注的朋友,发送0、1到7,都有好资源相送。

往期导读和参考:
1. PostgreSQL中配置单双向SSL连接详解
2. 提升PSQL使用技巧:PostgreSQL中PSQL使用技巧汇集(1)
3. 提升PSQL使用技巧:PostgreSQL中PSQL使用技巧汇集(2)
4. PostgreSQL SQL的基础使用及技巧
5. PostgreSQL开发技术基础:过程与函数
文章转载自数据库杂记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




