PostgreSQL邏輯訂閱中的復制狀態查看


1.訂閱端

pg_subscription_rel

查看訂閱的每個表的復制狀態。是多對多的映射。其中: srrelid:表示表的pg_class.oid srsubstate:狀態碼;i=初始化,d=正在復制數據,s=已同步,r =准備好(常規復制) srsublsn: s和r狀態時的結束LSN。

mytdb=# select * from pg_subscription_rel;
 srsubid | srrelid | srsubstate |   srsublsn   
---------+---------+------------+--------------
 5740670 | 5725376 | r          | EB/EFFFF900
 5740670 | 5725388 | r          | EC/114B1FF8
 5740670 | 7436654 | r          | 10F/54BCE3A8
(3 rows)

mytdb=#

初始時表處於i狀態,而后PG從發布端copy基表,此時該表處於d狀態,基表拷貝完成后記錄LSN位置到srsublsn。之后進入s狀態最后再進入r狀態,並通過pgoutput邏輯解碼從發布端拉取並應用增量數據。

pg_stat_subscription

pg_stat_subscription顯示每個訂閱worker的狀態。一個訂閱包含一個apply worker,可選的還有一個或多個進行初始同步的sync worker。 sync worker上的relid指示正在初始同步的表;如果apply worker沒有運行,relid為NULL。apply worker的latest_end_lsn為已反饋給發布端的LSN位置,一定程度上也可以認為是已完成同步的LSN位置。

mytdb=# select * from pg_stat_subscription;
-[ RECORD 1 ]---------+------------------------------
subid                 | 5740670
subname               | bpm_sub
pid                   | 29725
relid                 | 
received_lsn          | 12E/E32798F0
last_msg_send_time    | 2020-06-28 22:34:33.15169+08
last_msg_receipt_time | 2020-06-28 22:34:33.151752+08
latest_end_lsn        | 12E/E32798F0
latest_end_time       | 2020-06-28 22:34:33.15169+08

mytdb=# 

pg_replication_origin_status

mytdb=# select * from pg_replication_origin_status;
-[ RECORD 1 ]-------------
local_id    | 1
external_id | pg_5740670
remote_lsn  | 12E/E3264728
local_lsn   | 12E/E326E640

mytdb=# 

上面的remote_lsn是訂閱端應用的最后一個的WAL記錄在源節點的開始LSN位置)。

2.發布端

pg_replication_slots

mytdb=# select * from pg_replication_slots;
-[ RECORD 1 ]-------+----------------
slot_name           | publication_bpm
plugin              | pgoutput
slot_type           | logical
datoid              | 16386
database            | mybpm
temporary           | f
active              | t
active_pid          | 29726
xmin                | 
catalog_xmin        | 903856775
restart_lsn         | 12E/E33F50A8
confirmed_flush_lsn | 12E/E349E740

mytdb=# 

temporary:如果是臨時復制槽,為t;臨時復制槽不會被保存到磁盤,在會話結束后就會被自動刪除 restart_lsn:是可能仍被這個槽的消費者要求的最舊WAL地址(LSN),並且因此不會在檢查點期間自動被移除。 confirmed_flush_lsn:代表邏輯槽的消費者已經確認接收數據到什么位置的地址(LSN)。比這個地址更舊的數據已經不再可用。

confirmed_flush_lsn是最后一個已同步的WAL記錄的結束位置(需要字節對齊,實際是下條WAL的起始位置);restart_lsn有時候是最后一個已同步的WAL記錄的起始位置。

對應訂閱范圍內的表的更新WAL記錄,必須訂閱端執行完這條記錄才能算已同步;對其他無關的WAL,直接認為是已同步的,繼續處理下一條WAL。

pg_stat_replication

mybpm=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid              | 29726
usesysid         | 5673207
usename          | pgrep
application_name | bpm_sub
client_addr      | 11.11.11.111
client_hostname  | 
client_port      | 30428
backend_start    | 2020-06-17 13:15:31.117407+08
backend_xmin     | 
state            | streaming
sent_lsn         | 12E/EB57BD78
write_lsn        | 12E/EB579E98
flush_lsn        | 12E/EB579E98
replay_lsn       | 12E/EB579E98
write_lag        | 00:00:00.000427
flush_lag        | 00:00:00.201962
replay_lag       | 00:00:00.000427
sync_priority    | 0
sync_state       | async


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM