方式一:操作系统上查看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则说明是主库。