
이번 문서에서는 PostgreSQL Replication과 관련된 Catalog에 대해 알아보겠습니다.
| Catalog Name | Description | 
| pg_stat_replication | Replication에 대한 통계 확인 | 
| pg_stat_wal_receiver | WAL Receiver에 대한 통계 확인 | 
| pg_replication_slots | Replication Slot에 대한 정보 확인 | 
| pg_stat_replication_slots | [Since. v14] Replication Slot에 대한 통계 확인 | 
| pg_publication | Logical Replication의 Publication에 대한 정보 확인 | 
| pg_publication_rel | Relation과 Publication간의 매핑정보 확인 | 
| pg_publication_tables | Publication에 포함된 Table 확인 | 
| pg_subscription | Subscription에 대한 정보 확인 | 
| pg_subscription_rel | Subscription에 포함된 Table 확인 | 
| pg_stat_subscription_stats | [Since. v15] Logical Replication 구독 오류에 대한 통계 확인 | 
pg_stat_replication
WAL Sender 프로세스당 하나의 Row로 표시되며, WAL Sender프로세스에 연결된 Standby Server에 대한 정보 및 통계를 보여줍니다. WAL Sender에 연결된 Standby Server 개수만큼 표시되며, Down Stream Standby Server는 표시되지 않습니다. Streaming과 Logical로 구성된 Replication에 대해서만 표시됩니다.
변경사항
- PostgreSQL 10 버전부터 *_location이*_lsn으로 변경되었습니다.
- PostgreSQL 10 버전부터 write_lag,flush_lag,replay_lag컬럼이 추가되었습니다.
- PostgreSQL 12 버전부터 replay_time컬럼이 추가되었습니다.
SELECT * FROM pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid              | 42435
usesysid         | 16384
usename          | replicauser
application_name | walreceiver
client_addr      | 10.10.45.237
client_hostname  |
client_port      | 57364
backend_start    | 2023-05-17 15:58:22.570344+09
backend_xmin     |
state            | streaming
sent_lsn         | 1/B8610A28
write_lsn        | 1/B8610A28
flush_lsn        | 1/B8610A28
replay_lsn       | 1/B8610A28
write_lag        | 00:00:00.047901
flush_lag        | 00:00:00.048666
replay_lag       | 00:00:00.092449
sync_priority    | 0
sync_state       | async
reply_time       | 2023-05-24 15:41:31.047546+09| Column Name | Description | 
| pid | WAL Sender 프로세스 PID | 
| usesysid | WAL Sender 프로세스에 연결한 User OID | 
| username | WAL Sender 프로세스에 연결 User명 | 
| application_name | WAL Sender에 연결된 Application 이름 | 
| client_addr | WAL Sender에 연결된 Client IP. NULL일 경우 Unix 소켓을 통해 연결됨을 의미 | 
| client_hostname | WAL Sender에 연결된 Client Hostname(DNS lookup에 의해 조회될 경우 표시). postgresql.conf의 log_hostname=off일 경우 NULL 표시 | 
| client_port | WAL Sender에 연결된 Client의 TCP Port. (프로세스 조회에서도 확인가능 ps -ef) Unix 소켓을 통한 연결은 -1 | 
| backend_start | Client가 WAL Sender에 연결된 시간 | 
| backend_xmin | Standby Server에서 hot_standby_feedback에 의해 보고된 xmin | 
| state | WAL Sender의 상태 - startup : WAL Sender 시작 - catchup : Stadnby Server가 Main Server를 따라잡고 있는 중 - streadming : Standby Server가 Main Server의 변경사항을 스트리밍 중 - backup : WAL Sender가 Backup을 보내는 중. - stopping : WAL Sender 중지 중 | 
| sent_lsn | [Rename. v10] 전송된 마지막 WAL LSN | 
| write_lsn | [Rename. v10] Standby Server가 Disk 쓴 마지막 WAL LSN | 
| flush_lsn | [Rename. v10] Standby Server에 의해 Disk로 Flush 된 마지막 WAL LSN | 
| replay_lsn | [Rename. v10] Standby Server의 Database로 재생되는 마지막 WAL LSN | 
| write_lag | [Since. v10] Main Server에서 최근 WAL을 Flush하고 Standby Server가 기록했다는 알림을 받는 사이에 경과된 시간. | 
| flush_lag | [Since. v10] Main Server에서 최근 WAL을 Flush하고 Standby Server가 기록+Flush했다는 알림을 받는 사이에 경과된 시간. | 
| replay_lag | [Since. v10] Main Server에서 최근 WAL을 Flush하고 Standby Server가 기록+Flush+적용했다는 알림을 받는 사이에 경과된 시간. | 
| sync_priority | 우선 순위 기반 동기식 복제에서 동기식 대기로 선택하기 위한 Standby Server의 우선순위. | 
| sync_state | 동기화 상태. (async, potential, sync, quorum) - async : Standby server는 비동기상태. - potential : Standby Server는 비동기상태 이지만, 현재 동기 서버 중 하나가 실패할 경우 잠재적으로 동기화할 수 있음. - sync : Standby Server는 동기식상태 - quorum : Standby Server는 quorum Standby 후보로 간주 | 
| reply_time | [Since. v12] Standby Server에서 받은 마지막 응답 메시지의 전송시간 | 
📢 WAL 파일의 변경사항이 없으면, write_lag, flush_lag, replay_lag는 NULL로 표시될 수 있습니다.
pg_stat_wal_receiver
현재 WAL Receiver에 대한 통계 정보를 나타냅니다. Receiver에 대한 Catalog로 Main Server에서는 조회되는 내용이 없으며, Standby Server에서 조회 가능합니다. Streaming Replication 구성에서만 조회 가능합니다.
변경사항
- PostgreSQL 11 버전부터 sender_host,sender_port컬럼이 추가되었습니다.
- PostgreSQL 13 버전부터 received_lsn이written_lsn,flushed_lsn으로 분리되었습니다.
SELECT * FROM pg_stat_wal_receiver ;
-[ RECORD 1 ]---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid                   | 24021
status                | streaming
receive_start_lsn     | 0/2D000000
receive_start_tli     | 1
written_lsn           | 1/B861BBE8
flushed_lsn           | 1/B861BBE8
received_tli          | 1
last_msg_send_time    | 2023-05-24 15:43:09.883988+09
last_msg_receipt_time | 2023-05-24 15:43:09.883011+09
latest_end_lsn        | 1/B861BBE8
latest_end_time       | 2023-05-24 15:42:09.775377+09
slot_name             | physical_slot
sender_host           | 10.10.45.236
sender_port           | 5432
conninfo              | user=replicauser passfile=/var/lib/pgsql/.pgpass channel_binding=prefer dbname=replication host=10.10.45.236 port=5432 fallback_application_name=walreceiver sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any| Column Name | Description | 
| pid | WAL Receiver 프로세스 PID | 
| status | WAL Receiver 프로세스 상태 | 
| receive_start_lsn | WAL Receiver가 시작될때 사용되는 처음 WAL LSN | 
| receive_start_tli | WAL Receiver가 시작될때 사용되는 처음 Timeline 번호 | 
| written_lsn | [Since. v13] 이미 수신되어 디스크에 Write된 마지막 WAL LSN(Flush는 제외) | 
| flushed_lsn | [Since. v13] 이미 수신되어 디스크에 Flush된 마지막 WAL LSN | 
| received_lsn | [Deprecated. v13] 이미 수신되어 디스크에 Flush된 마지막 WAL LSN | 
| received_tli | 디스크에 수신되고 Flush된 마지막 WAL LSN의 Timeline 번호 | 
| last_msg_sned_time | 원본 WAL Sender로 부터 받은 마지막 메시지의 전송 시간 | 
| last_msg_receipt_time | 원본 WAL Sender로 부터 받은 마지막 메시지의 수신 시간 | 
| latest_end_lsn | 원본 WAL Sender에게 보고된 마지막 WAL LSN | 
| latest_end_time | 원본 WAL Sender에게 보고된 마지막 WAL LSN 시간 | 
| slot_name | WAL Receiver에서 사용하는 Replication Slot 이름 | 
| sender_host | [Since. v11] WAL Receiver가 연결한 WAL Sender의 Host. (hostname, IP, Directory Path 일 수 있음) | 
| sender_port | [Since. v11] WAL Receiver가 연결한 WAL Sender의 Port | 
| conninfo | WAL Sender에 연결하기 위한 연결정보 | 
pg_replication_slots
현재 PostgreSQL에 존재하는 Replication Slot의 목록을 표시합니다.
변경사항
- PostgreSQL 10 버전부터 temporary컬럼이 추가되었습니다.
- PostgreSQL 13 버전부터 wal_status,safe_wal_size컬럼이 추가되었습니다.
- PostgreSQL 14 버전부터 two_phase컬럼이 추가되었습니다.
-- Physical Replication Slot
SELECT * FROM pg_replication_slots ;
-[ RECORD 1 ]-------+--------------
slot_name           | physical_slot
plugin              |
slot_type           | physical
datoid              |
database            |
temporary           | f
active              | t
active_pid          | 42435
xmin                | 799
catalog_xmin        |
restart_lsn         | 1/B861BCD0
confirmed_flush_lsn |
wal_status          | reserved
safe_wal_size       |
two_phase           | f-- Logical Replication Slot
SELECT * FROM pg_replication_slots ;
-[ RECORD 1 ]-------+----------------
slot_name           | my_subscription
plugin              | pgoutput
slot_type           | logical
datoid              | 14486
database            | postgres
temporary           | f
active              | t
active_pid          | 13161
xmin                |
catalog_xmin        | 796
restart_lsn         | 4/5620E6A8
confirmed_flush_lsn | 4/5620E6E0
wal_status          | reserved
safe_wal_size       |
two_phase           | f| Column Name | Description | 
| slot_name | Replication Slot의 고유 식별자(이름) | 
| plugin | Logical Replication일 경우, 출력 plugin을 포함하는 공유 개체의 이름. Physical Replication일 경우에는 NULL | 
| slot_type | Slot Type이 Physical 인지 Logical 인지 구분 | 
| datoid | Logical Replication일 경우 Slot에 연결된 Database OID.(pg_database.oid) Physical Replicaiton 일 경우 NULL | 
| database | Logical Replication일 경우 Slot에 연결된 Database 이름.(pg_database.datname) Physical Replicaiton 일 경우 NULL | 
| temporary | [Since. v10] Slot이 임시인지 아닌지 여부 (TRUE / FALSE) | 
| active | Slot 상태 (Active : TRUE / Inactive : FALSE) | 
| active_pid | Slot 상태가 Acive인 경우(active = TRUE) Slot을 사용하는 세션의 PID | 
| xmin | Slot이 유지되기 위해 Database가 필요한 가장 오래된 트랜잭션 | 
| catalog_xmin | Slot이 유지되기 위해 Database를 필요로 하는 System Catalog에 영향을 미치는 가장 오래된 트랜잭션 | 
| restart_lsn | Slot이 소비자에게 여전히 필요할 수 있는 가장 오래된 WAL의 주소(LSN) | 
| confirmed_flush_lsn | Logical Replication의 경우 Slot의 소비자가 데이터 수신을 확인한 주소(LSN) Physical Replication의 경우 NULL | 
| wal_status | [Since. v13] Slot에서 요청한 WAL 파일의 사용가능여부 - reserved : 요청한 WAL 파일이 max_wal_size 내에 존재 - extended : max_wal_size는 초과하였지만, Replication Slot 또는 wal_keep_size에 의해 유지 - unreserved : WAL 파일을 보유하지 않고 다음 Checkpoint에서 제거해야 함을 의미 - lost : WAL 파일이 제거되었으며, Slot을 더 이상 사용할 수 없음을 의미 - unreserved와 lost 상태는 max_slot_wal_keep_size가 음수가 이닌 경우에만 표시되며, restart_lsn = NULL 이면 NULL로 표시됩니다. | 
| safe_wal_size | [Since. v13] Slot이 “lost” 상태가 될 위험이 없도록 WAL에 기록할 수 있는 바이트 수. lost 상태이거나 max_slot_wal_keep_size = -1 인 경우 NULL | 
| two_phase | [Since. v14] Logical Replication의 경우 준비된 트랜잭션을 디코딩하기 위한 Slot 활성화여부. Physical Replication의 경우 항상 FALSE | 
pg_stat_replication_slots
Logical Replication Slot 사용에 대한 통계정보를 표시합니다.
변경사항
- PostgreSQL 14 버전에 생긴 Catalog입니다.
SELECT * FROM pg_stat_replication_slots ;
-[ RECORD 1 ]+----------------
slot_name    | my_subscription
spill_txns   | 4
spill_count  | 259
spill_bytes  | 17303997849
stream_txns  | 0
stream_count | 0
stream_bytes | 0
total_txns   | 47
total_bytes  | 1644946476
stats_reset  || Column Name | Description | 
| slot_name | Replication Slot의 고유 식별자(이름) | 
| spill_txns | WAL의 변경사항을 디코딩하는데 논리적 디코딩에서 사용한 메모리가 logical_decoding_work_mem을 초과하여 디스크로 넘어간 트랜잭션의 수 | 
| spill_count | WAL의 변경사항을 디코딩하는 동안 트랜잭션이 디스크에 넘어간 횟수 | 
| spill_bytes | WAL의 변경사항을 디코딩하는 동안 트랜잭션이 디스크에 넘어간 디코딩된 트랜잭션 데이터의 양 | 
| stream_txns | WAL의 변경사항을 디코딩하는데 논리적 디코딩에서 사용한 메모리가 logical_decoding_work_mem을 초과한 후 디코딩 출력 플러그인으로 스트리밍되는 진행 중인 트랜잭션 수 | 
| stream_count | WAL의 변경사항을 디코딩하는 동안 트랜잭션이 디코딩 출력 플러그인으로 스트리밍된 횟수 | 
| stream_bytes | WAL의 변경사항을 디코딩하는 동안 트랜잭션을 디코딩 출력 플러그인으로 스트리밍하기 위해 디코딩된 트랜잭션 데이터의 양 | 
| total_txns | 디코딩 출력 플러그인으로 보낸 디코딩된 트랜잭션의 수 | 
| total_bytes | WAL의 변경사항을 디코딩하는 동안 디코딩 출력 플러그인으로 트랜잭션을 전송하기 위해 디코딩된 트랜잭션 데이터의 양 | 
| stats_reset | 통계정보가 마지막으로 재설정된 시간 | 
pg_publication
PostgreSQL 10 버전부터 Logical Replication 기능이 도입되어 모니터링을 위한 pg_publication Catalog가 생성되었습니다. 게시자(Publisher)에 대한 정보를 포함합니다.
변경사항
- PostgreSQL 11 버전부터 pubtruncate컬럼이 추가되었습니다.
- PostgreSQL 13 버전부터 pubviaroot컬럼이 추가되었습니다.;
SELECT * FROM pg_publication ;
-[ RECORD 1 ]+---------------
oid          | 16411
pubname      | my_publication
pubowner     | 10
puballtables | f
pubinsert    | t
pubupdate    | t
pubdelete    | t
pubtruncate  | t
pubviaroot   | f| Column Name | Description | 
| oid | Row Identifier | 
| pubname | Publication 이름 | 
| pubowner | Publication 소유자 (pg_authid.oid) | 
| puballtables | Database의 모든 테이블을 - TRUE : 자동으로 Database의 모든 테이블을 포함. 이후에 작성될 테이블도 포함 - FALSE : Publication에 포함된 테이블을 지정 | 
| pubinsert | Publication 테이블에 대해 INSERT 작업 복제 여부 (TRUE / FALSE) | 
| pubupdate | Publication 테이블에 대해 UPDATE 작업 복제 여부 (TRUE / FALSE) | 
| pubdelete | Publication 테이블에 대해 DELETE 작업 복제 여부 (TRUE / FALSE) | 
| pubtruncate | Publication 테이블에 대해 TRUNCATE 작업 복제 여부 (TRUE / FALSE) | 
| pubviaroot | If true, operations on a leaf partition are replicated using the identity and schema of its topmost partitioned ancestor mentioned in the publication instead of its own. | 
pg_publication_rel
Database와 Publication 간의 관계 정보가 포함되어 있습니다. 게시(Publication)에 포함된 테이블의 정보를 조회할 수 있지만, oid를 표시하므로 가독성은 떨어지므로 pg_publication_tables Catalog로 대체하여 조회할 수 있습니다. FOR ALL TABLES로 생성한 Publication은 pg_publication_rel Catalog에서 조회가 되지 않으며 pg_publication_tables Catalog를 통해 조회할 수 있습니다.
변경사항
- PostgreSQL 12 버전부터 oid컬럼이 추가되었습니다.
- PostgreSQL 15 버전부터 prqual,prattrs컬럼이 추가되었습니다.
SELECT * FROM pg_publication_rel ;
  oid  | prpubid | prrelid
-------+---------+---------
 16412 |   16411 |   16394
 16413 |   16411 |   16401| Column Name | Description | 
| oid | Row Identifier | 
| prpubid | Publication 참조(pg_publication.oid) | 
| prrelid | Relation 참조(pg_class.oid) | 
| prqual | Expression tree (in nodeToString() representation) for the relation's publication qualifying condition. Null if there is no publication qualifying condition. | 
| prattrs | This is an array of values that indicates which table columns are part of the publication. For example, a value of 1 3 would mean that the first and the third table columns are published. A null value indicates that all columns are published. | 
pg_publication_tables
Database와 Publication 간의 관계 정보가 포함되어 있습니다. 게시(Publication)에 포함된 테이블의 정보를 조회할 수 있습니다. FOR ALL TABLES로 생성한 Publication은 pg_publication_rel Catalog에서 조회가 되지 않으며 pg_publication_tables Catalog를 통해 조회할 수 있습니다.
변경사항
- PostgreSQL 15 버전부터 attnames,rowfilter컬럼이 추가되었습니다.
SELECT * FROM pg_publication_tables ;
    pubname     | schemaname |      tablename
----------------+------------+----------------------
 my_publication | public     | replication_table_01
 my_publication | public     | replication_table_02| Column Name | Description | 
| pubname | Publication 이름(pg_publication.pubname) | 
| schemaname | 테이블이 포함된 Schema 이름(pg_namespace.nspname) | 
| tablename | 테이블 이름(pg_class.relname) | 
| attnames | 게시(Publication)에 포함된 테이블 Column 이름(pg_attribute.attname). Publication 설정 시 Column을 지정하지 않은경우 테이블의 모든 Column이 포함 | 
| rowfilter | 테이블의 게시 자격 조건에 대한 표현식(조건) | 
pg_subscription
pg_subscription Catalog는 Logical Replication의 구독(Subscription)에 대한 내용을 표시합니다.
- PostgreSQL 12 버전부터 oid컬럼이 추가되었습니다.
- PostgreSQL 13 버전부터 subslotname컬럼에 NULL이 가능합니다.
- PostgreSQL 14 버전부터 subbinary,substream컬럼이 추가되었습니다.
- PostgreSQL 15 버전부터 subskiplsn,subtwophasestate,subdisableonerr컬럼이 추가되었습니다.
- PostgreSQL 16 버전부터 suborigin컬럼이 추가되었습니다.
SELECT * FROM pg_subscription ;
-[ RECORD 1 ]---+----------------------------------------------------------------------------
oid             | 16425
subdbid         | 14486
subname         | my_subscription
subowner        | 10
subenabled      | t
subbinary       | f
substream       | f
subconninfo     | dbname=postgres host=10.10.45.230 port=5432 user=repluser password=repluser
subslotname     | my_subscription
subsynccommit   | off
subpublications | {my_publication}| Column Name | Description | 
| oid | Row Identifier | 
| subdbid | 구독(Subscription)이 있는 Database OID (pg_database.oid) | 
| subskiplsn | [Since. v15] 변경사항을 건너뛸 트랜잭션의 완료 LSN. 그렇지 않으면 0/0 | 
| subname | Subscription 이름 | 
| subowner | Subscription 소유자 (pg_authid.oid) | 
| subenabled | Subscription 활성화 여부 (TRUE / FALSE) | 
| subbinary | [Since. v14] Binary Format으로 데이터를 보내도록 요청 할지 여부(TRUE / FALSE) | 
| substream | [Since. v14] 구독에서 진행중인 트랜잭션의 Streaming 허용 여부(TRUE / FALSE) | 
| subtwophasestate | [Since. v15] two-phase mode 상태( d: disabled,p: pending enablement,e: enabled) | 
| subdisableonerr | [Since. v15] 오류를 감지하면 구독을 비활성 할지 여부(TRUE / FALSE) | 
| subconninfo | Publication에 연결하기 위한 연결정보 | 
| subslotname | Publication에 연결하기 위한 Slot 이름. NULL = NONE | 
| subsynccommit | 구독자에 대한 synchronous_commit 설정 값을 포함 (ON / OFF) | 
| subpublications | 구독한 게시(Publication) 이름의 배열 | 
| suborigin | [Since. v16] none과 any 사용가능 - none : 게시자(Publisher)는 출처에 관계없이 변경사항을 전송 (Default) - any : 원본이 없는 변경사항만 전송하도록 게시자(Publisher)에게 요청 | 
pg_subscription_rel
Publication(구독)과의 관계에 대한 상태를 표시합니다.
변경사항
- PostgreSQL 13 버전부터 srsublsn컬럼에 NULL이 가능합니다.
SELECT * FROM pg_subscription_rel ;
 srsubid | srrelid | srsubstate | srsublsn
---------+---------+------------+-----------
   16425 |   16411 | r          | 0/3072468
   16425 |   16418 | r          | 0/3072468| Column Name | Description | 
| srsubid | Subscription의 참조번호(pg_subscription.oid) | 
| srrelid | Subscription에 포함된 Object ID | 
| srsubstate | Object 상태( i: initialize,d: data is being copied,s: synchronized,r: ready) | 
| srsublsn | s와r상태의 마지막 LSN | 
pg_stat_subscription_stats
Logical Replication 구독 오류를 보여줍니다.
변경사항
- PostgreSQL 15 버전에 생긴 Catalog입니다.
| Column Name | Description | 
| subid | Subscription oid | 
| subname | Subscription 이름 | 
| apply_error_count | 변경내용을 적용하는 동안 발생한 오류 횟수 | 
| sync_error_count | 초기 테이블 동기화 중 발생한 오류 횟수 | 
| stats_reset | 현재 통계가 마지막으로 재설정된 시간 | 
기획 및 글 | 플랫폼기술연구팀
'엑셈 경쟁력 > DB 인사이드' 카테고리의 다른 글
| DB 인사이드 | PostgreSQL Replication - Parameter (6) | 2023.07.26 | 
|---|---|
| DB 인사이드 | PostgreSQL Replication - 설정 확인 (0) | 2023.06.29 | 
| DB 인사이드 | PostgreSQL Replication - Function (0) | 2023.06.29 | 
| DB 인사이드 | PostgreSQL Replication - Trouble Shooting (0) | 2023.05.25 | 
| DB 인사이드 | PostgreSQL Replication - 구성 (0) | 2023.05.25 | 


 
										
									 
										
									 
										
									 
										
									
댓글