postgres判断主备角色的五种方法

方式一:操作系统上查看WAL发送进程或WAL接收进程

流复制主库上有WAL发送进程,流复制备库上有WAL接收进程

主库

[postgres@postgres pg11]$ ps -ef | grep "wal" | grep -v "grep"
postgres   6199   6195  0 10:55 ?        00:00:01 postgres: walwriter      
postgres  25659   6195  0 19:03 ?        00:00:00 postgres: walsender replica 192.168.40.131(40508) streaming 0/5000360
[postgres@postgres pg11]$ 

备库

[postgres@postgreshot ~]$ ps -ef | grep "wal" | grep -v "grep"
postgres   4518   4511  0 10:19 ?        00:00:00 postgres: wal writer process   
postgres  93162  93157  0 19:03 ?        00:00:17 postgres: walreceiver   streaming 0/5000360
[postgres@postgreshot ~]$ 

方式二:数据库上查看WAL发送进程或WAL接收进程

数据库层面查看WAL发送进程和WAL接收进程,例如在主库上查询pg_stat_replication视图,如果返回记录说明是主库,备库上查询此视图无记录,如下所示:

postgres=# 
postgres=# SELECT pid,usename,application_name,client_addr,state,sync_state  FROM pg_stat_replication ;
  pid  | usename | application_name |  client_addr   |   state   | sync_state 
-------+---------+------------------+----------------+-----------+------------
 25659 | replica | pg1              | 192.168.40.131 | streaming | sync
(1 row)

postgres=# 

同样,在备库上查看pg_stat_wal_receiver视图,如果返回记录说明是备库,流复制主库上此视图无记录,

如下所示:

postgres=# \x
Expanded display is off.
postgres=# SELECT pid,status,last_msg_send_time,last_msg_receipt_time,conninfo
FROM pg_stat_wal_receiver ;
  pid  |  status   |      last_msg_send_time       |    last_msg_receipt_time     |                                                                          
                            conninfo                                                                                                      
-------+-----------+-------------------------------+------------------------------+--------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
 93162 | streaming | 2019-03-26 23:15:49.733418-04 | 2019-03-26 23:16:23.26434-04 | user=replica passfile=/home/postgres/.pgpass dbname=replication host=192.
168.40.130 port=5442 application_name=pg1 fallback_application_name=walreceiver sslmode=disable sslcompression=0 target_session_attrs=any
(1 row)

postgres=# 

方式三:通过系统函数查看

登录数据库执行以函数,如下所示:

postgres=# SELECT pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 t
(1 row)

postgres=# 

如果返回t说明是备库,返回f说明是主库

方式四:查看数据库控制信息

通过pg_controldata命令查看数据库控制信息,内容包含WAL日志信息、checkpoint、数据块等信息,通过Databasecluster state信息可判断是主库还是备库,如下所示:

[postgres@postgres ~]$ pg_controldata | grep cluster
Database cluster state:               in production
[postgres@postgres ~]$ 

以上查询结果返回in production表示为主库,返回in archive recovery表示是备库,

如下所示:

[postgres@postgreshot ~]$ pg_controldata | grep cluster
Database cluster state:               in archive recovery
[postgres@postgreshot ~]$ 

方式五:通过recovery.conf配置文件查看

在备库$PGDATA目录下会创建recovery.conf配置文件,如果存在这个文件说明是备库,如果$PGDATA目录不存在此文件或此文件后缀名是recovery.done则说明是主库。

猜你喜欢

转载自blog.csdn.net/m15217321304/article/details/88845353