다음 예는 SQL 인터페이스를 사용하여 논리적 디코딩을 제어하는 방법을 보여줍니다.
논리적 디코딩을 사용하기 전에 다음을 설정해야 합니다.wal_level에논리적그리고max_replication_slots최소 1개. 그런 다음 대상 데이터베이스에 연결해야 합니다(아래 예에서는포스트그레) 슈퍼유저로.
postgres=# -- 출력 플러그인 'test_decoding'을 사용하여 'regression_slot'이라는 슬롯을 생성합니다.
postgres=# SELECT * FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding', false, true);
슬롯_이름 | lsn
----+------------
회귀_슬롯 | 0/016B1970
(1줄)
postgres=# pg_replication_slots에서 SELECT 슬롯 이름, 플러그인, 슬롯 유형, 데이터베이스, 활성, 재시작_lsn, 확인_플러시_lsn;
슬롯_이름 | 플러그인 | 슬롯 유형 | 데이터베이스 | 활성 | 재시작_lsn | 확인_플러시_lsn
----+---------------+----------+----------+---------+------------+---------
회귀_슬롯 | 테스트_디코딩 | 논리적 | 포스트그레스 | 에프 | 0/016A4408 | 0/016A4440
(1줄)
postgres=# -- 아직 확인할 변경사항이 없습니다.
postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);
lsn | 시드 | 데이터
------+------+------
(0행)
postgres=# CREATE TABLE 데이터(id 직렬 기본 키, 데이터 텍스트);
테이블 만들기
postgres=# -- DDL은 복제되지 않으므로 트랜잭션만 표시됩니다.
postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);
lsn | 시드 | 데이터
-----------+---------+--------------
0/0BA2DA58 | 10297 | 10297 시작
0/0BA5A5A0 | 10297 | 커밋 10297
(2열)
postgres=# -- 변경 사항을 읽고 나면 소비되고 내보내지지 않습니다.
postgres=# -- 후속 호출에서:
postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);
lsn | 시드 | 데이터
------+------+------
(0행)
postgres=# 시작;
postgres=*# INSERT INTO data(data) VALUES('1');
postgres=*# INSERT INTO data(data) VALUES('2');
postgres=*# 커밋;
postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);
lsn | 시드 | 데이터
------------+---------+-------------------------------
0/0BA5A688 | 10298 | 10298 시작
0/0BA5A6F0 | 10298 | 테이블 public.data: INSERT: ID[정수]:1 데이터[텍스트]:'1'
0/0BA5A7F8 | 10298 | 테이블 public.data: INSERT: id[정수]:2 데이터[텍스트]:'2'
0/0BA5A8A8 | 10298 | 커밋 10298
(4열)
postgres=# 데이터(데이터) VALUES('3')에 삽입;
postgres=# -- 변경 사항을 소비하지 않고도 변경 스트림을 미리 볼 수도 있습니다.
postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL);
lsn | 시드 | 데이터
------------+---------+-------------------------------
0/0BA5A8E0 | 10299 | 10299 시작
0/0BA5A8E0 | 10299 | 테이블 public.data: INSERT: id[정수]:3 데이터[텍스트]:'3'
0/0BA5A990 | 10299 | 커밋 10299
(3열)
postgres=# -- 다음 pg_logical_slot_peek_changes() 호출은 동일한 변경 사항을 다시 반환합니다.
postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL);
lsn | 시드 | 데이터
------------+---------+-------------------------------
0/0BA5A8E0 | 10299 | 10299 시작
0/0BA5A8E0 | 10299 | 테이블 public.data: INSERT: id[정수]:3 데이터[텍스트]:'3'
0/0BA5A990 | 10299 | 커밋 10299
(3열)
postgres=# -- 형식에 영향을 주기 위해 옵션을 출력 플러그인에 전달할 수 있습니다.
postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-timestamp', 'on');
lsn | 시드 | 데이터
------------+---------+-------------------------------
0/0BA5A8E0 | 10299 | 10299 시작
0/0BA5A8E0 | 10299 | 테이블 public.data: INSERT: id[정수]:3 데이터[텍스트]:'3'
0/0BA5A990 | 10299 | 커밋 10299(2017-05-10 12:07:21.272494-04)
(3열)
postgres=# -- 더 이상 사용을 중지할 필요가 없는 슬롯을 파기하는 것을 기억하세요
postgres=# -- 서버 리소스:
postgres=# SELECT pg_drop_replication_slot('regression_slot');
pg_drop_replication_slot
----------
(1행)
다음 예는 프로그램을 사용하여 스트리밍 복제 프로토콜을 통해 논리적 디코딩을 제어하는 방법을 보여줍니다.pg_recvlogical스포츠 토토 베트맨QL 배포판에 포함되어 있습니다. 이를 위해서는 복제 연결을 허용하도록 클라이언트 인증을 설정해야 합니다(참조섹션 26.2.5.1) 그리고 그거max_wal_senders추가 연결을 허용할 만큼 충분히 높게 설정되어 있습니다. 두 번째 예는 2단계 트랜잭션을 스트리밍하는 방법을 보여줍니다. 2단계 명령을 사용하기 전에 다음을 설정해야 합니다.max_prepared_transactions적어도 1개.
예 1: $ pg_recvlogical -d postgres --slot=test --create-slot $ pg_recvlogical -d postgres --slot=test --start -f -제어+Z$ psql -d 스포츠 토토 베트맨 -c "데이터(데이터) VALUES('4')에 삽입;" $fg 시작 693 테이블 public.data: INSERT: id[정수]:4 데이터[텍스트]:'4' 커밋 693제어+C$ pg_recvlogical -d postgres --slot=test --drop-slot 예 2: $ pg_recvlogical -d postgres --slot=test --create-slot --enable-two-phase $ pg_recvlogical -d postgres --slot=test --start -f -제어+Z$ psql -d 스포츠 토토 베트맨 -c "BEGIN;데이터(데이터) VALUES('5')에 삽입; 트랜잭션 준비 '테스트';" $fg 시작 694 테이블 public.data: INSERT: id[정수]:5 데이터[텍스트]:'5' 거래 준비 '테스트', txid 694제어+Z$ psql -d 스포츠 토토 베트맨 -c "COMMIT PREPARED '테스트';" $fg 커밋 준비됨 '테스트', txid 694제어+C$ pg_recvlogical -d postgres --slot=test --drop-slot
다음 예는 준비된 트랜잭션을 디코딩하는 데 사용할 수 있는 SQL 인터페이스를 보여줍니다. 2단계 커밋 명령을 사용하기 전에 다음을 설정해야 합니다.max_prepared_transactions최소 1로 설정하십시오. 또한 다음을 사용하여 슬롯을 생성하는 동안 two-phase 매개변수를 'true'로 설정해야 합니다.pg_create_logical_replication_slot아직 디코딩되지 않은 경우 커밋 후 전체 트랜잭션을 스트리밍합니다.
스포츠 토토 베트맨=# 시작;
스포츠 토토 베트맨=*# INSERT INTO data(data) VALUES('5');
스포츠 토토 베트맨=*# 트랜잭션 준비 'test_prepared1';
스포츠 토토 베트맨=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);
lsn | 시드 | 데이터
------------+------+-------------------------------
0/01689DC0 | 529 | 시작 529
0/01689DC0 | 529 | 테이블 public.data: INSERT: id[정수]:3 데이터[텍스트]:'5'
0/01689FC0 | 529 | 트랜잭션 준비 'test_prepared1', txid 529
(3열)
스포츠 토토 베트맨=# COMMIT PREPARED 'test_prepared1';
스포츠 토토 베트맨=# pg_logical_slot_get_changes('regression_slot', NULL, NULL)에서 선택 *;
lsn | 시드 | 데이터
------------+------+-------------------------------
0/0168A060 | 529 | 커밋 준비됨 'test_prepared1', txid 529
(4열)
스포츠 토토 베트맨=#-- 준비된 트랜잭션을 롤백할 수도 있습니다.
스포츠 토토 베트맨=# 시작;
스포츠 토토 베트맨=*# 데이터(데이터) VALUES('6')에 삽입;
스포츠 토토 베트맨=*# 트랜잭션 준비 'test_prepared2';
스포츠 토토 베트맨=# pg_logical_slot_get_changes('regression_slot', NULL, NULL)에서 선택 *;
lsn | 시드 | 데이터
------------+------+-------------------------------
0/0168A180 | 530 | 시작 530
0/0168A1E8 | 530 | 테이블 public.data: INSERT: id[정수]:4 데이터[텍스트]:'6'
0/0168A430 | 530 | 트랜잭션 준비 'test_prepared2', txid 530
(3열)
스포츠 토토 베트맨=# 롤백 준비됨 'test_prepared2';
스포츠 토토 베트맨=# pg_logical_slot_get_changes('regression_slot', NULL, NULL)에서 선택 *;
lsn | 시드 | 데이터
------------+------+----------------------------------
0/0168A4B8 | 530 | 롤백 준비됨 'test_prepared2', txid 530
(1행)