暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 鸿惊九天 2022-12-09
1022

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论