暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

简单问题答疑之不简单:PostgreSQL实例之端口与数据目录

数据库杂记 2024-07-12
170

前言

不同的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 [1721LOG:  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 5555If notwait a few seconds and retry.
2024-07-12 21:26:21.631 CST [1721WARNING:  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 [1721LOG:  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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论