千家信息网

POSTGRESQL10.3 RPM包如何实现主从搭建

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍POSTGRESQL10.3 RPM包如何实现主从搭建,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、POSTGRESQL主从复制搭建1、安装POSTGRES
千家信息网最后更新 2026年11月02日POSTGRESQL10.3 RPM包如何实现主从搭建

这篇文章主要介绍POSTGRESQL10.3 RPM包如何实现主从搭建,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!



一、POSTGRESQL主从复制搭建

1、安装POSTGRESQL

PGSQL10.3

下载地址:

https://yum.postgresql.org/testing/10/redhat/rhel-6-x86_64/repoview/postgresqldbserver10.group.html

下载

· postgresql10 - PostgreSQL client programs and libraries

· postgresql10-contrib - Contributed source and binaries distributed with PostgreSQL

· postgresql10-libs - The shared libraries required for any PostgreSQL clients

· postgresql10-server - The programs needed to create and run a PostgreSQL server

依次使用rpm -ivh 进行安装(两个节点都安装)

安装顺序:

rpm -ivh postgresql10-libs-10.3-1PGDG.rhel6.x86_64.rpm

rpm -ivh postgresql10-10.3-1PGDG.rhel6.x86_64.rpm

rpm -ivh postgresql10-server-10.3-1PGDG.rhel6.x86_64.rpm

rpm -ivh postgresql10-contrib-10.3-1PGDG.rhel6.x86_64.rpm

2、启动POSTGRESQL服务

(1)第一步启动

service postgresql-10 initdb

(2)第二步启动

service postgresql-10 start

3、修改监听

(1)修改监听地址

vi /var/lib/pgsql/10/data/postgresql.conf

# - Connection Settings -

#这里原本是#listen_addresses ='localhost'修改为以下黄色字体

listen_addresses = '192.168.159.128'

(2)查看监听

显示黄色特色字体即可

netstat -anlp |grep post

tcp 0 0 192.168.159.128:5432 0.0.0.0:* LISTEN 4784/postmaster

udp 0 0 ::1:57424 ::1:57424 ESTABLISHED 4784/postmaster

unix 2 [ ACC ] STREAM LISTENING 30353 4784/postmaster /var/run/postgresql/.s.PGSQL.5432

unix 2 [ ACC ] STREAM LISTENING 30356 4784/postmaster /tmp/.s.PGSQL.5432

4、主从搭建

(1)主库环境

su - postgres

psql

创建一个用户复制的用户replica

CREATE ROLE replica login replication encrypted password 'replica';

修改pg_hba.conf文件,指定replica登录网络(最后一添加)

vi /var/lib/pgsql/10/data/pg_hba.conf

host replication replica 192.168.159.0/24 md5
host all replica 192.168.159.0/24 trust


主库配置文件修改以下几项,其他不变
vi /var/lib/pgsql/10/data/postgresql.conf
listen_addresses = '*'
wal_level = hot_standby #热备模式
max_wal_senders= 6 #可以设置最多几个流复制链接,差不多有几个从,就设置多少
wal_keep_segments = 10240 #重要配置
wal_send_timeout = 60s
max_connections = 512 #从库的 max_connections要大于主库
archive_mode = on #允许归档
archive_command = 'cp %p /url/path%f' #根据实际情况设置

(2)从库环境

把备库的数据文件夹目录清空
rm -rf /var/lib/pgsql/10/data/*

在备库上运行

pg_basebackup -F p --progress -D /var/lib/pgsql/10/data/ -h 192.168.159.128 -p 5432 -U replica --password

输入密码replica

!!!注意,复制完成后,在备库一定要将数据目录下的所有文件重新授权

chown -R postgres.postgres /var/lib/pgsql/10/data/

创建recovery.cnf 文件

cp /usr/pgsql-10/share/recovery.conf.sample /var/lib/pgsql/10/data/recovery.conf

vi /var/lib/pgsql/10/data/recovery.conf

standby_mode = on

primary_conninfo = 'host=192.168.159.128 port=5432 user=replica password=replica'

recovery_target_timeline = 'latest'

trigger_file = '/var/lib/pgsql/10/data/trigger.kenyon'

vi /var/lib/pgsql/10/data/postgresql.conf
listen_addresses ='*'

wal_level = hot_standby

max_connections =1000 #一般从的最大链接要大于主的

hot_standby =on #说明这台机器不仅仅用于数据归档,也用于查询

max_standby_streaming_delay =30s

wal_receiver_status_interval = 10s #多久向主报告一次从的状态

hot_standby_feedback = on #如果有错误的数据复制,是否向主进行范例

启动备库

service postgresql-10 start

如果无法启动,如下操作:

scp /var/lib/pgsql/10/data/postmaster.opts 192.168.159.129:/var/lib/pgsql/10/data/

chown -R postgres.postgres /var/lib/pgsql/10/data/

chmod 700 data/

5、验证主从功能

主库查询

su - postgres

psql

postgres=# select client_addr,sync_state from pg_stat_replication;

client_addr | sync_state

-----------------+------------

192.168.159.129 | async

(1 row)

在主库创建表

create table test2 (name varchar(3));

在从库查询表

\d

主库查询黄色字体

[root@ha1 data]# ps aux | grep postgres

postgres 4686 0.0 0.8 356584 15592 ? S 15:22 0:00 /usr/pgsql-10/bin/postmaster -D /var/lib/pgsql/10/data

postgres 4688 0.0 0.0 209416 1572 ? Ss 15:22 0:00 postgres: logger process

postgres 4690 0.0 0.1 356700 3744 ? Ss 15:22 0:00 postgres: checkpointer process

postgres 4691 0.0 0.1 356584 3044 ? Ss 15:22 0:00 postgres: writer process

postgres 4692 0.0 0.3 356584 5980 ? Ss 15:22 0:00 postgres: wal writer process

postgres 4693 0.0 0.1 356992 2616 ? Ss 15:22 0:00 postgres: autovacuum launcher process

postgres 4694 0.0 0.0 211516 1540 ? Ss 15:22 0:00 postgres: archiver process

postgres 4695 0.0 0.0 211648 1784 ? Ss 15:22 0:02 postgres: stats collector process

postgres 4696 0.0 0.1 356876 2272 ? Ss 15:22 0:00 postgres: bgworker: logical replication launcher

postgres 4711 0.7 0.4 358576 8536 ? Ss 15:24 0:35 postgres: dbuser exampledb 192.168.159.1(63172) idle

postgres 4845 0.0 0.1 357384 3424 ? Ss 15:39 0:00 postgres: wal sender process replica 192.168.159.129(46554) streaming 0/401B0A0

root 5049 0.0 0.0 103256 840 pts/3 S+ 16:42 0:00 grep postgres

备库查询黄色字体

[root@ha2 data]# ps aux | grep postgres

postgres 4827 0.0 2.2 398228 42844 ? S 15:39 0:00 /usr/pgsql-10/bin/postmaster -D /var/lib/pgsql/10/data

postgres 4829 0.0 0.0 209416 1536 ? Ss 15:39 0:00 postgres: logger process

postgres 4830 0.0 0.2 398324 3948 ? Ss 15:39 0:00 postgres: startup process recovering 000000010000000000000004

postgres 4831 0.0 0.1 398228 3496 ? Ss 15:39 0:00 postgres: checkpointer process

postgres 4832 0.0 0.1 398228 2772 ? Ss 15:39 0:00 postgres: writer process

postgres 4833 0.0 0.0 211516 1604 ? Ss 15:39 0:00 postgres: stats collector process

postgres 4834 0.1 0.1 405444 3688 ? Ss 15:39 0:06 postgres: wal receiver process streaming 0/401B0A0

root 4912 0.0 0.0 103252 828 pts/3 S+ 16:42 0:00 grep postgres

6、POSTGRESQL相关

(1)创建LINUX用户

useradd dbuser

passwd dbuser

(2)创建数据库用户

CREATE USER dbuser WITH PASSWORD 'password';

(3)创建数据库

CREATE DATABASE exampledb OWNER dbuser;

(4)赋予权限

GRANT ALL PRIVILEGES ON DATABASE exampledb TO dbuser;

(5)以dbuser的身份连接数据库exampledb

su - dbuser

psql -d exampledb

(6)网络登陆方式

vi /var/lib/pgsql/10/data/pg_hba.conf(在IPV4那里添加以下)

host exampledb dbuser 192.168.159.0/24 trust

切换dbuser用户登陆

psql -h 192.168.159.128 -U dbuser -p password -d exampledb -p 5432

(7)重启和停止命令

service postgresql-10 restart

service postgresql-10 stop

(8)重要配置文件

pg_hba.conf

postgresql.conf

(9)PG的安装目录及命令目录

查看进程是否启动,可以找到

命令目录/usr/pgsql-10/bin/

安装目录/var/lib/pgsql/10/data

[root@ha1 ~]# ps -ef|grep post

root 1732 1 0 02:25 ? 00:00:00 /usr/libexec/postfix/master

postfix 1742 1732 0 02:25 ? 00:00:00 pickup -l -t fifo -u

postfix 1743 1732 0 02:25 ? 00:00:00 qmgr -l -t fifo -u

postgres 2322 1 1 02:38 ? 00:00:00 /usr/pgsql-10/bin/postmaster -D /var/lib/pgsql/10/data

postgres 2324 2322 0 02:38 ? 00:00:00 postgres: logger process

postgres 2329 2322 0 02:38 ? 00:00:00 postgres: checkpointer process

postgres 2330 2322 0 02:38 ? 00:00:00 postgres: writer process

postgres 2331 2322 0 02:38 ? 00:00:00 postgres: wal writer process

postgres 2332 2322 0 02:38 ? 00:00:00 postgres: autovacuum launcher process

postgres 2333 2322 0 02:38 ? 00:00:00 postgres: stats collector process

postgres 2334 2322 0 02:38 ? 00:00:00 postgres: bgworker: logical replication launcher

root 2336 2232 0 02:39 pts/0 00:00:00 grep post





7、主备手动切换
4、手动主备切换

(1)创建备库recovery.conf 文件( 在备库上操作192.168.159.152)

cp $PGHOME/share/recovery.conf.sample $PGDATA/recovery.conf

配置以下参数

standby_mode = 'on' --标记PG为STANDBY SERVER

primary_conninfo = 'host=192.168.159.151 port=1921 user=repuser ' --标识主库信息

trigger_file = '/data/pg/data/trigger.kenyon' --标识触发器文件

(2) 关闭主库(在主库上操作192.168.159.151)

/opt/postgresql-10.3/bin/pg_ctl -D /data/pg/data/ -l logfile stop

(3)激活备库到主库状态 ( 在备库上操作192.168.159.152 )

激活备库只要创建一个文件即可,根据备库 recovery.conf 配置文件的参数 trigger_file 值,

创建这个 trigger 文件即可。 例如 "touch /data/pg/data/trigger.kenyon"

touch /data/pg/data/trigger.kenyon

过一会儿发现 recovery.conf 文件变成 recovery.done ,说明备库已经激活。

查看logfile日志,出现以下信息即激活
2018-06-04 21:11:01.137 PDT [12818] 日志: 已找到触发器文件:/data/pg/data/trigger.kenyon
2018-06-04 21:11:01.148 PDT [12818] 日志: redo 在 0/C02A390 完成
2018-06-04 21:11:01.172 PDT [12818] 日志: 已选择的新时间线ID:2
2018-06-04 21:11:05.442 PDT [12818] 日志: 归档恢复完毕
2018-06-04 21:11:05.568 PDT [12817] 日志: 数据库系统准备接受连接


(4)修改原来主库的配置文件
vi /data/pg/data/postgresql.conf
max_connections = 1500


(5)激活原来的主库,让其转变成从库 (在原来的主库上执行192.168.159.151)

--创建 $PGDATA/recovery.conf 文件,配置以下参数
vi /data/pg/data/recovery.conf

recovery_target_timeline = 'latest'

standby_mode = 'on' --标记PG为STANDBY SERVER

primary_conninfo = 'host=192.168.159.152 port=1921 user=repuser ' --标识主库信息

trigger_file = '/data/pg/data/trigger.kenyon' --标识触发器文件

--修改 pg_hba.conf (现在的主库上增加192.168.159.152),添加以下配置
vi /data/pg/data/pg_hba.conf

host replication repuser 192.168.159.151/32 md5


启动原来的主库即现在的从库(192.168.159.151)
/opt/postgresql-10.3/bin/pg_ctl -D /data/pg/data/ -l logfile start

查看现在的从库logfile日志发现报错信息
2018-06-05 00:08:00.326 PDT [9729] 详细信息: WAL结束时,到了时间线1和地址0/C02A400.
2018-06-05 00:08:00.327 PDT [9725] 日志: 在当前恢复点0/C02A630之前, 新的时间点2脱离了当前茅的数据库系统时间点1
2018-06-05 00:08:05.322 PDT [9729] 日志: 在0/C000000处时间线1上重启WAL流操作
2018-06-05 00:08:05.327 PDT [9729] 日志: 复制由主用服务器终止
2018-06-05 00:08:05.327 PDT [9729] 详细信息: WAL结束时,到了时间线1和地址0/C02A400.
2018-06-05 00:08:05.329 PDT [9725] 日志: 在当前恢复点0/C02A630之前, 新的时间点2脱离了当前茅的数据库系统时间点1
2018-06-05 00:08:10.328 PDT [9729] 日志: 在0/C000000处时间线1上重启WAL流操作
2018-06-05 00:08:10.332 PDT [9729] 日志: 复制由主用服务器终止
2018-06-05 00:08:10.332 PDT [9729] 详细信息: WAL结束时,到了时间线1和地址0/C02A400.
2018-06-05 00:08:10.333 PDT [9725] 日志: 在当前恢复点0/C02A630之前, 新的时间点2脱离了当前茅的数据库系统时间点1

在现在的主库操作:
scp /data/pg/data/pg_wal/00000002.history 192.168.159.151:/data/pg/data/pg_wal/4、手动主备切换

(1)创建备库recovery.conf 文件( 在备库上操作192.168.159.152)

cp $PGHOME/share/recovery.conf.sample $PGDATA/recovery.conf

配置以下参数

standby_mode = 'on' --标记PG为STANDBY SERVER

primary_conninfo = 'host=192.168.159.151 port=1921 user=repuser ' --标识主库信息

trigger_file = '/data/pg/data/trigger.kenyon' --标识触发器文件

(2) 关闭主库(在主库上操作192.168.159.151)

/opt/postgresql-10.3/bin/pg_ctl -D /data/pg/data/ -l logfile stop

(3)激活备库到主库状态 ( 在备库上操作192.168.159.152 )

激活备库只要创建一个文件即可,根据备库 recovery.conf 配置文件的参数 trigger_file 值,

创建这个 trigger 文件即可。 例如 "touch /data/pg/data/trigger.kenyon"

touch /data/pg/data/trigger.kenyon

过一会儿发现 recovery.conf 文件变成 recovery.done ,说明备库已经激活。

查看logfile日志,出现以下信息即激活
2018-06-04 21:11:01.137 PDT [12818] 日志: 已找到触发器文件:/data/pg/data/trigger.kenyon
2018-06-04 21:11:01.148 PDT [12818] 日志: redo 在 0/C02A390 完成
2018-06-04 21:11:01.172 PDT [12818] 日志: 已选择的新时间线ID:2
2018-06-04 21:11:05.442 PDT [12818] 日志: 归档恢复完毕
2018-06-04 21:11:05.568 PDT [12817] 日志: 数据库系统准备接受连接


(4)修改原来主库的配置文件
vi /data/pg/data/postgresql.conf
max_connections = 1500


(5)激活原来的主库,让其转变成从库 (在原来的主库上执行192.168.159.151)

--创建 $PGDATA/recovery.conf 文件,配置以下参数
vi /data/pg/data/recovery.conf

recovery_target_timeline = 'latest'

standby_mode = 'on' --标记PG为STANDBY SERVER

primary_conninfo = 'host=192.168.159.152 port=1921 user=repuser ' --标识主库信息

trigger_file = '/data/pg/data/trigger.kenyon' --标识触发器文件

--修改 pg_hba.conf (现在的主库上增加192.168.159.152),添加以下配置
vi /data/pg/data/pg_hba.conf

host replication repuser 192.168.159.151/32 md5


启动原来的主库即现在的从库(192.168.159.151)
/opt/postgresql-10.3/bin/pg_ctl -D /data/pg/data/ -l logfile start

查看现在的从库logfile日志发现报错信息
2018-06-05 00:08:00.326 PDT [9729] 详细信息: WAL结束时,到了时间线1和地址0/C02A400.
2018-06-05 00:08:00.327 PDT [9725] 日志: 在当前恢复点0/C02A630之前, 新的时间点2脱离了当前茅的数据库系统时间点1
2018-06-05 00:08:05.322 PDT [9729] 日志: 在0/C000000处时间线1上重启WAL流操作
2018-06-05 00:08:05.327 PDT [9729] 日志: 复制由主用服务器终止
2018-06-05 00:08:05.327 PDT [9729] 详细信息: WAL结束时,到了时间线1和地址0/C02A400.
2018-06-05 00:08:05.329 PDT [9725] 日志: 在当前恢复点0/C02A630之前, 新的时间点2脱离了当前茅的数据库系统时间点1
2018-06-05 00:08:10.328 PDT [9729] 日志: 在0/C000000处时间线1上重启WAL流操作
2018-06-05 00:08:10.332 PDT [9729] 日志: 复制由主用服务器终止
2018-06-05 00:08:10.332 PDT [9729] 详细信息: WAL结束时,到了时间线1和地址0/C02A400.
2018-06-05 00:08:10.333 PDT [9725] 日志: 在当前恢复点0/C02A630之前, 新的时间点2脱离了当前茅的数据库系统时间点1

在现在的主库操作:
scp /data/pg/data/pg_wal/00000002.history 192.168.159.151:/data/pg/data/pg_wal/

(1)创建备库recovery.conf 文件( 在备库上操作192.168.159.149)

cp /usr/pgsql-10/share/recovery.conf.sample /var/lib/pgsql/10/data/recovery.conf

配置以下参数

standby_mode = 'on' --标记PG为STANDBY SERVER

primary_conninfo = 'host=192.168.159.128 port=5432 user=replica password=replica' --标识主库信息

trigger_file = '/var/lib/pgsql/10/data/trigger.kenyon' --标识触发器文件

(2) 关闭主库(在主库上操作192.168.159.148)

service postgresql-10 stop

(3)激活备库到主库状态 ( 在备库上操作192.168.159.149 )

激活备库只要创建一个文件即可,根据备库 recovery.conf 配置文件的参数 trigger_file 值,

创建这个 trigger 文件即可。 例如 "touch /var/lib/pgsql/10/data/trigger.kenyon"

touch /var/lib/pgsql/10/data/trigger.kenyon

过一会儿发现 recovery.conf 文件变成 recovery.done ,说明备库已经激活。

查看/var/lib/pgsql/10/data/log/目录下的最新日志,出现以下信息即激活
(我这里的日志是tail -100f postgresql-Tue.log)
2018-06-05 19:32:36.403 PDT [3969] LOG: fetching timeline history file for timeline 2 from primary server
2018-06-05 19:32:36.429 PDT [3969] LOG: started streaming WAL from primary at 0/3000000 on timeline 1
2018-06-05 19:32:36.461 PDT [3969] LOG: replication terminated by primary server
2018-06-05 19:32:36.461 PDT [3969] DETAIL: End of WAL reached on timeline 1 at 0/301B078.
2018-06-05 19:32:36.478 PDT [3916] LOG: new target timeline is 2
2018-06-05 19:32:36.479 PDT [3969] LOG: restarted WAL streaming at 0/3000000 on timeline 2
2018-06-05 19:32:37.044 PDT [3916] LOG: redo starts at 0/301B078

(4)修改原来主库的配置文件(192.168.159.148)
vi /var/lib/pgsql/10/data/postgresql.conf
max_connections = 150


(5)激活原来的主库,让其转变成从库 (在原来的主库上执行192.168.159.148)

--创建 $PGDATA/recovery.conf 文件,配置以下参数
vi /data/pg/data/recovery.conf

recovery_target_timeline = 'latest'

standby_mode = 'on' --标记PG为STANDBY SERVER

primary_conninfo = 'host=192.168.159.149 port=1921 user=repuser ' --标识主库信息

trigger_file = '/var/lib/pgsql/10/data/trigger.kenyon' --标识触发器文件

--修改 pg_hba.conf (现在的主库上增加192.168.159.149),添加以下配置
vi /data/pg/data/pg_hba.conf

host replication replica 192.168.159.0/24 md5
host all replica 192.168.159.0/24 trust


注意这里修改完配置文件后需要重启数据库服务(192.168.159.149)
service postgresql-10 restart

启动原来的主库即现在的从库(192.168.159.148)
service postgresql-10 start


主库查询

su - postgres

psql

postgres=# select client_addr,sync_state from pg_stat_replication;

client_addr | sync_state
-----------------+------------
192.168.159.148 | async
(1 row)

相关报错:
(1)网络登录方式报错
psql: FATAL: no pg_hba.conf entry for host "192.168.159.128", user "dbuser", database "exampledb", SSL off

出现这个报错,就要检查pg_hba.conf文件了,
添加设置host exampledb dbuser 192.168.159.0/24 trust 重启数据库即可解决

(2)发现登陆postgres时出现以下问题
-bash-4.1$
root用户执行
cp /etc/skel/.bash* /var/lib/pgsql/
再次登陆即可变成
[postgres@node1 ~]$

以上是"POSTGRESQL10.3 RPM包如何实现主从搭建"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

文件 日志 时间 配置 信息 数据 激活 数据库 标识 参数 地址 系统 触发器 目录 前茅 标记 用户 服务 查询 主从 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 精品咖啡豆 江苏根荣互联网科技 科技互联网龙头 互联网是不是新科技 科技互联网公司装修 没上市的科技互联网公司 科技服务与互联网 互联网科技小贷 亿账通互联网科技 银川新华互联网科技学校地址 科技与互联网的利与弊 重庆互联网医院沙龙医盟信息科技 特约风豹互联网科技为什么扣费 南博望互联网科技有限公司 区块链结合互联网科技 深圳无忧互联网科技 版纳互联网科技选哪家 云南互联网科技学费 长沙易易互联网科技有限公司 互联网科技创新方面的资料 哈尔滨大商圈互联网科技有限公司 北京禾田雨橡互联网科技 深圳天众互联网科技公司 恒生科技互联网指数分析 广州慧亚互联网科技怎么样 栖莱科技互联网股份有限公司 注册互联网科技公司经营范围大全 洛阳共同富裕互联网科技有限公司 互联网安防科技感 重庆科技产业互联网有哪些
0