检查PostgreSQL复制状态

46

有人能建议一下检查pgsql复制状态的步骤,以及如何识别复制是否正常进行吗?

我们使用pgsql9.0和pgsql9.4进行流式复制。


https://dev59.com/ZV4c5IYBdhLWcg3wFm84 - Vao Tsun
3个回答

70
我通常使用以下SQL查询来检查Postgres v11的状态。
在主节点上:
select * from pg_stat_replication;

对于副本(在我这个案例中是流式复制):

select * from pg_stat_wal_receiver;

11
将“;”替换为“\x\g\x”以进行垂直输出。 - x-yuri
4
你能解释一下如果一切正常或出现问题时我们应该看到什么吗?sync_state:主服务器同步是一个好的迹象吗? - Cyril Duchon-Doris
1
sync_state 指的是复制是如何配置的。state 是在 pg_stat_replication 中要检查的字段。 - gerardw

30
在您的主节点上,pg_stat_replication提供有关正在进行的复制的数据:
select client_addr, state, sent_location, write_location,
        flush_location, replay_location from pg_stat_replication;

在 PostgreSQL v10 上:

select client_addr, state, sent_lsn, write_lsn,
    flush_lsn, replay_lsn from pg_stat_replication;

3
那么,如果上面的查询返回0行,有什么问题呢? - gvasquez
1
0行意味着您的服务器未配置复制。当正确配置时,应该会获得一行或多行数据,但这并不意味着您已经设置了复制,因为从库可能无法连接(请检查“state”列)。 - Reinsbrain
嗯...我们的复制一直运行良好,但现在它失败了,现在显示没有行,请参见:https://dba.stackexchange.com/questions/180062/post-mortem-analysis-postgresql-replication-failed - gvasquez

28
在PostgreSQL中显示复制状态

在服务器上

postgres=# select usename,application_name,client_addr,backend_start,state,sync_state from pg_stat_replication ;

usename   | application_name |  client_addr   |         backend_start         |   state   | sync_state 
------------+------------------+----------------+-------------------------------+-----------+------------
replicator | walreceiver      | 192.168.10.132 | 2018-07-06 06:12:20.786918+03 | streaming | async
(1 row)

在客户端

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


postgres=# select pg_last_xlog_receive_location();
 pg_last_xlog_receive_location 
-------------------------------
 0/540C1DB8


postgres=# select pg_last_xlog_replay_location();
 pg_last_xlog_replay_location 
------------------------------
 0/540C1DB8
 (1 row)

postgres=#    SELECT CASE WHEN pg_last_xlog_receive_location() = pg_last_xlog_replay_location()
                  THEN 0
                ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp())
              END AS log_delay;
 log_delay 
-----------
 0
 (1 row)

7
在Postgres 10上,这个方法并不完全有效,但是SELECT pg_last_xact_replay_timestamp();可以提供有用的信息! - user39950
2
在单个查询中比较主节点和从节点的状态: select pg_last_xlog_receive_location(), pg_last_xlog_replay_location(), pg_last_xact_replay_timestamp(), CASE WHEN pg_last_xlog_receive_location() = pg_last_xlog_replay_location() THEN 0 ELSE EXTRACT(EPOCH FROM now() - pg_last_xact_replay_timestamp()) END AS log_delay; - Sergey Nemchinov
要从从服务器检查主服务器IP,请访问https://dba.stackexchange.com/a/45062/123063。 - GypsyCosmonaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接