PG数据库,即PostgreSQL数据库,是一种特性非常齐全的自由软件的对象-关系型数据库管理系统。因其高度的可靠性、可扩展性以及数据完整性等优点而被广泛应用于Web应用程序、企业级应用程序、移动应用程序等。PG数据库与keepalive结合使用可实现一主多从,实现数据库的高可用。但是这种方式在使用过程中可能会出现双主的问题,本文主要介绍如何解决双主问题。
查看数据库主备信息以及版本信息常用命令
使用pg_controldata命令查询
首先登录切换到postgres用户:su – postgres
然后执行命令查询:pg_controldata | grep cluster
显示in production的为主数据库节点
显示in archive recovery的为备数据库节点
使用sql命令查询
首先登录切换到postgres用户:su – postgres
然后登录数据库:psql
执行select pg_is_in_recovery();
t表示当前节点为备节点
f表示当前节点为主节点
查看pg版本信息
su - postgres
psql –version
以9.x版本和14.x为例
PG数据库双主故障恢复
如果通过以上命令查询到数据库出现了双主的情况,则按以下步骤恢复:
当前数据库版本是9.x
1、确认真正的主数据库节点,一般vip所在的节点为真正的主节点。假定 B 为真正的主节点,A 为备节点。
2、恢复前备份好数据。登陆A,B节点分别执行
切换到数据库用户:su - postgres
进入数据库安装目录cd /home/postgres
cp -arf data /opt/
3、登陆A节点,停止keepalived
4、su - postgres
5、停止 postgres
6、pg_ctl stop
7、mv data databak # 将备pg 的data换个名字
8、mkdir data
9、chmod 0700 data
10、将主数据库的data目录同步到备pg上
pg_basebackup -X stream -D $PGDATA -h slave -U repuser
slave 填另一个postgres 的 hostname或者ip,可从hosts文件中获取
11、mv data/recovery.done data/recovery.conf
修改备recovery.conf 文件最后一行
primary_conninfo = 'host=master port=5432 user=repuser password={{ pg_rep_passwd }}'
# master 填另一个pg的hostname,从hosts文件中获取
12、pg_ctl start # 启动备库
13、验证双主问题是否解决:pg_controldata | grep cluster,显示in archive recovery表示当前数据库已启动,且为备库
14、登录主库验证数据同步情况,有以下记录说明被数据库正从当前机器备份数据
postgres=# select * from pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 6091 usesysid | 16384 usename | repuser application_name | walreceiver client_addr | x.x.x.x(当前数据库节点的IP) client_hostname | slave client_port | 62655 backend_start | 2022-03-31 21:31:28.095526+08 backend_xmin | state | streaming sent_location | 2A/86BF7DF8 write_location | 2A/86BF7DF8 flush_location | 2A/86BF7DF8 replay_location | 2A/86BF7D80 sync_priority | 0 sync_state | async |
当前数据库版本是14.x
1-7步同9.x
8、登录准备作为备数据的节点(A节点),su – postgres切换到数据库用户
9、进入数据库安装目录cd /home/postgres14/bin/
在salve节点上执行以下命令:
pg_basebackup -h <ip of another postgres> -p 5432 -U repuser -F p -P -R -D data -X stream --progress
确认主备数据库节点该文件/home/postgres14/data/pg_hba.conf 中最后一行 <slave> 中分别为对方节点 在hosts文件中对应的hostname,
代表授权对方信任
host replication repuser slave trust |
后续步骤同9.x的12-14步