1.主库(10.124.50.13)故障,停掉主库
systemctl stop pgsql.service
2.从库(10.124.50.14)提到主库
su - postgres
pg_ctl promote -D /data/pgsql-13.11/data
提升从库为主库之后,可以看到,后台进程中不再有startup recovering,以及walreceiver streaming进程了,同时多了postgres: walwriter 写进程;
$PGDATA/standby.signal文件自动消失了. 这是告诉PostgreSQL,我现在不再是备库了,我的身份是主库了
3.新主库(10.124.50.14)删除primary_conninfo条目
原来的主从状态
postgres=# show primary_conninfo;
primary_conninfo ------------------------------------------------------------
user=replica password=replica host=10.124.50.13 port=5432
(1 row)
然后将之前主从同步的信息删除掉,$PGDATA/postgresql.auto.conf文件中的primary_conninfo
systemctl reload pgsql.service
重载配置后后主从状态如下即可
postgres=# show primary_conninfo;
primary_conninfo ------------------
(1 row)
4.通过原主库(10.124.50.13)上nginx四层代理新主库(10.124.50.14)的地址,保持对外的地址不变,便于服务重连
此步骤结束后,服务即可恢复
5.新主库(10.124.50.14)修改pg_hba.conf文件,在其中添加允许新备库(原主库10.124.50.13)可以通过replica用户访问数据库的条目信息。
host replication all 10.124.50.13/32 md5
若之前就是以网段的方式开通的话,可以不需要修改,如下:
host replication replica 10.124.50.0/24 md5
systemctl reload pgsql.service
6.原主库清空data目录,重新同步数据
pg_basebackup -U replica -h 10.124.50.14 -p 5432 -F p -X s -v -P -R -D /data/pgsql-13.11/data/
7.手动启动新从库(10.124.50.14)
/data/pgsql-13.11/bin/pg_ctl start -D ${PGDATA} -s -o "-p ${PGPORT}" -w -t 300
会有如下报错,不用管它,第一次启动会进行数据初始化,时间非常久,观察端口和日志正常,等待数据初始化结束即可
2023-12-21 16:26:24.711 CST 1623307 00000LOG: redirecting log output to logging collector process
2023-12-21 16:26:24.711 CST 1623307 00000HINT: Future log output will appear in directory "pg_log".
pg_ctl: server did not start in time
8.修改原主库(10.124.50.13)的端口,启动数据库并检查主从状态
systemctl start pgsql.service
show primary_conninfo;