29.2. 토토 커뮤니티#

A 토토 커뮤니티은 논리적 복제의 다운스트림 측면입니다. 토토 커뮤니티이 정의된 노드를토토 커뮤니티자. 토토 커뮤니티은 토토 커뮤니티하려는 다른 데이터베이스 및 발행물 세트(하나 이상)에 대한 연결을 정의합니다.

토토 커뮤니티자 데이터베이스는 다른 PostgreSQL 인스턴스와 동일한 방식으로 작동하며 자체 게시를 정의하여 다른 데이터베이스의 게시자로 사용할 수 있습니다.

토토 커뮤니티자 노드는 원하는 경우 여러 토토 커뮤니티을 가질 수 있습니다. 단일 게시자-토토 커뮤니티자 쌍 간에 여러 토토 커뮤니티을 정의할 수 있으며, 이 경우 토토 커뮤니티한 게시 개체가 겹치지 않도록 주의해야 합니다.

각 토토 커뮤니티은 하나의 복제 슬롯을 통해 변경 사항을 수신합니다(참조섹션 26.2.6). 기존 테이블 데이터의 초기 데이터 동기화를 위해 추가 복제 슬롯이 필요할 수 있으며 이러한 슬롯은 데이터 동기화가 끝나면 삭제됩니다.

논리적 복제 토토 커뮤니티은 동기 복제를 위한 대기가 될 수 있습니다(참조섹션 26.2.8). 대기 이름은 기본적으로 토토 커뮤니티 이름입니다. 대체 이름은 다음과 같이 지정할 수 있습니다.애플리케이션_이름토토 커뮤니티 연결 정보에서.

다음에 의해 토토 커뮤니티이 취소되었습니다.pg_dump현재 사용자가 슈퍼유저인 경우. 그렇지 않으면 슈퍼유저가 아닌 사용자가 모든 토토 커뮤니티 정보를 읽을 수 없기 때문에 경고가 작성되고 토토 커뮤니티을 건너뜁니다.pg_subscription카탈로그.

토토 커뮤니티은 다음을 사용하여 추가됩니다.토토 커뮤니티 작성언제든지 다음을 사용하여 중지/재개할 수 있습니다.토토 커뮤니티 변경107PostgreSQL: 문서: 17: 29.2. 토토 커뮤니티72토토 커뮤니티 중단.

토토 커뮤니티을 삭제하고 다시 생성하면 동기화 정보가 손실됩니다. 이는 나중에 데이터를 다시 동기화해야 함을 의미합니다.

스키마 정의는 복제되지 않으며 게시된 테이블은 토토 커뮤니티자에 존재해야 합니다. 일반 테이블만 복제 대상이 될 수 있습니다. 예를 들어 뷰에 복제할 수 없습니다.

테이블은 정규화된 테이블 이름을 사용하여 게시자와 토토 커뮤니티자 간에 일치됩니다. 토토 커뮤니티자에서 이름이 다른 테이블에 대한 복제는 지원되지 않습니다.

테이블의 열은 이름으로도 일치됩니다. 토토 커뮤니티자 테이블의 열 순서는 게시자의 순서와 일치할 필요가 없습니다. 데이터의 텍스트 표현을 대상 유형으로 변환할 수 있는 한 열의 데이터 유형은 일치할 필요가 없습니다. 예를 들어, 다음 유형의 열에서 복제할 수 있습니다.정수다음 유형의 열에비긴트. 대상 테이블에는 게시된 테이블에서 제공되지 않은 추가 열이 있을 수도 있습니다. 이러한 열은 대상 테이블 정의에 지정된 기본값으로 채워집니다. 그러나 바이너리 형식의 논리적 복제는 더 제한적입니다. 참조바이너리옵션토토 커뮤니티 작성자세한 내용은.

29.2.1. 복제 슬롯 관리#

앞서 언급했듯이 각 (활성) 토토 커뮤니티은 원격(게시) 측의 복제 슬롯에서 변경 사항을 받습니다.

추가 테이블 동기화 슬롯은 일반적으로 임시적이며 초기 테이블 동기화를 수행하기 위해 내부적으로 생성되고 더 이상 필요하지 않으면 자동으로 삭제됩니다. 다음 테이블 동기화 슬롯에는 이름이 생성되었습니다.pg_%u_sync_%u_%llu(매개변수: 토토 커뮤니티oid, 테이블렐리드, 시스템 식별자sysid)

일반적으로 다음을 사용하여 토토 커뮤니티이 생성되면 원격 복제 슬롯이 자동으로 생성됩니다.토토 커뮤니티 작성다음을 사용하여 토토 커뮤니티이 삭제되면 자동으로 삭제됩니다.토토 커뮤니티 중단. 그러나 어떤 상황에서는 토토 커뮤니티과 기본 복제 슬롯을 별도로 조작하는 것이 유용하거나 필요할 수 있습니다. 다음은 몇 가지 시나리오입니다.

  • 토토 커뮤니티을 생성할 때 복제 슬롯이 이미 존재합니다. 이 경우 다음을 사용하여 토토 커뮤니티을 생성할 수 있습니다.create_slot = false기존 슬롯과 연결하는 옵션.

  • 토토 커뮤니티을 생성할 때 원격 호스트에 연결할 수 없거나 불분명한 상태입니다. 이 경우 다음을 사용하여 토토 커뮤니티을 생성할 수 있습니다.연결 = 거짓옵션. 그러면 원격 호스트에 전혀 연결되지 않습니다. 이것이 바로pg_dump사용합니다. 그러면 토토 커뮤니티을 활성화하기 전에 원격 복제 슬롯을 수동으로 생성해야 합니다.

  • 토토 커뮤니티을 삭제할 때 복제 슬롯은 유지되어야 합니다. 이는 토토 커뮤니티자 데이터베이스가 다른 호스트로 이동되고 그곳에서 활성화될 때 유용할 수 있습니다. 이 경우 다음을 사용하여 토토 커뮤니티에서 슬롯을 연결 해제하세요.토토 커뮤니티 변경토토 커뮤니티을 취소하기 전에.

  • 토토 커뮤니티을 삭제하면 원격 호스트에 연결할 수 없습니다. 이 경우 다음을 사용하여 토토 커뮤니티에서 슬롯을 연결 해제하세요.토토 커뮤니티 변경토토 커뮤니티 취소를 시도하기 전에. 원격 데이터베이스 인스턴스가 더 이상 존재하지 않으면 추가 조치가 필요하지 않습니다. 그러나 원격 데이터베이스 인스턴스에 연결할 수 없는 경우에는 복제 슬롯(및 아직 남아 있는 테이블 동기화 슬롯)을 수동으로 삭제해야 합니다. 그렇지 않으면 WAL을 계속 예약하여 결국 디스크가 가득 차게 될 수 있습니다. 그러한 경우는 주의 깊게 조사되어야 합니다.

29.2.2. 예: 논리적 복제 설정#

게시자에 테스트 테이블을 생성하십시오.

test_pub=# CREATE TABLE t1(a int, b text, PRIMARY KEY(a));
테이블 만들기
test_pub=# CREATE TABLE t2(c int, d text, PRIMARY KEY(c));
테이블 만들기
test_pub=# CREATE TABLE t3(e int, f text, PRIMARY KEY(e));
테이블 만들기

토토 커뮤니티자에 동일한 테이블을 생성하십시오.

test_sub=# CREATE TABLE t1(a int, b text, PRIMARY KEY(a));
테이블 만들기
test_sub=# CREATE TABLE t2(c int, d text, PRIMARY KEY(c));
테이블 만들기
test_sub=# CREATE TABLE t3(e int, f text, PRIMARY KEY(e));
테이블 만들기

게시자 측 테이블에 데이터를 삽입하십시오.

test_pub=# t1 값에 삽입 (1, '1'), (2, '2'), (3, '3');
삽입 0 3
test_pub=# t2 값에 삽입 (1, 'A'), (2, 'B'), (3, 'C');
삽입 0 3
test_pub=# t3 값에 삽입 (1, 'i'), (2, 'ii'), (3, 'iii');
삽입 0 3

테이블에 대한 출판물을 생성합니다. 출판물pub2그리고pub3a일부 금지게시작업. 출판pub3b행 필터가 있습니다(참조PostgreSQL : 문서 : 17 : 29.4. 행 토토 커뮤니티).

test_pub=# 테이블 t1에 대한 출판 pub1 생성;
출판물 만들기
test_pub=# 테이블 t2에 대한 출판물 생성 pub2 WITH (publish = 'truncate');
출판물 만들기
test_pub=# 테이블 t3에 대한 출판물 생성 pub3a WITH (publish = 'truncate');
출판물 만들기
test_pub=# 테이블 t3에 대한 출판 pub3b 생성 WHERE(e  5);
출판물 생성

게시물에 대한 토토 커뮤니티을 생성합니다. 토토 커뮤니티하위 3둘 다 토토 커뮤니티pub3a그리고pub3b. 모든 토토 커뮤니티은 기본적으로 초기 데이터를 복사합니다.

test_sub=# 토토 커뮤니티 만들기 하위 1
test_sub-# 연결 'host=localhost dbname=test_pub application_name=sub1'
test_sub-# 출판 pub1;
토토 커뮤니티 만들기
test_sub=# 토토 커뮤니티 만들기 sub2
test_sub-# 연결 '호스트=localhost dbname=test_pub 애플리케이션 이름=sub2'
test_sub-# 출판 pub2;
토토 커뮤니티 만들기
test_sub=# 토토 커뮤니티 만들기 sub3
test_sub-# 연결 'host=localhost dbname=test_pub application_name=sub3'
test_sub-# 출판 pub3a, pub3b;
토토 커뮤니티 만들기

초기 테이블 데이터가 복사되는 것을 관찰하십시오.게시출판 운영.

test_sub=# SELECT * FROM t1;
 |   비
---+---------
 1 | 하나
 2 | 두
 3 | 세
(3열)

test_sub=# SELECT * FROM t2;
 c | 디
---+---
 1 | 에이
 2 | 비
 3 | C
(3행)

또한 초기 데이터 복사는 다음을 무시하기 때문에게시작업 및 게시로 인해pub3a행 필터가 없습니다. 복사된 테이블을 의미합니다.t3게시 행 필터와 일치하지 않는 경우에도 모든 행을 포함pub3b.

test_sub=# SELECT * FROM t3;
 전자 |  에프
---+-----
 1 | 나
 2 | ii
 3 | iii
(3행)

게시자 측 테이블에 더 많은 데이터를 삽입하십시오.

test_pub=# t1 값에 삽입 (4, '4'), (5, '5'), (6, '6');
삽입 0 3
test_pub=# t2 값에 삽입 (4, 'D'), (5, 'E'), (6, 'F');
삽입 0 3
test_pub=# t3 값에 삽입 (4, 'iv'), (5, 'v'), (6, 'vi');
삽입 0 3

이제 게시자 측 데이터는 다음과 같습니다.

test_pub=# SELECT * FROM t1;
 |   비
---+---------
 1 | 하나
 2 | 두
 3 | 세
 4 | 네
 5 | 다섯
 6 | 여섯
(6열)

test_pub=# SELECT * FROM t2;
 c | 디
---+---
 1 | 에이
 2 | 비
 3 | C
 4 | 디
 5 | E
 6 | 에프
(6열)

test_pub=# SELECT * FROM t3;
 전자 |  에프
---+-----
 1 | 나
 2 | ii
 3 | iii
 4 | iv
 5 | v
 6 | vi
(6행)

정상 복제 중에 적절한 것을 관찰하십시오.게시작업이 사용됩니다. 이는 출판물을 의미합니다.pub2그리고pub3a복제하지 않습니다삽입. 또한 출판pub3b행 필터와 일치하는 데이터만 복제합니다pub3b. 이제 토토 커뮤니티자 측 데이터는 다음과 같습니다.

test_sub=# SELECT * FROM t1;
 |   비
---+---------
 1 | 하나
 2 | 두
 3 | 세
 4 | 네
 5 | 다섯
 6 | 여섯
(6열)

test_sub=# SELECT * FROM t2;
 c | 디
---+---
 1 | 에이
 2 | 비
 3 | C
(3열)

test_sub=# SELECT * FROM t3;
 전자 |  에프
---+-----
 1 | 나는
 2 | ii
 3 | iii
 6 | vi
(4행)

29.2.3. 예: 지연된 복제 슬롯 생성#

몇 가지 경우가 있습니다(예:섹션 29.2.1) 여기서 원격 복제 슬롯이 자동으로 생성되지 않은 경우 토토 커뮤니티을 활성화하기 전에 사용자가 수동으로 생성해야 합니다. 슬롯을 생성하고 토토 커뮤니티을 활성화하는 단계는 다음 예에 표시됩니다. 이 예에서는 표준 논리 디코딩 출력 플러그인(pgoutput), 이는 내장된 논리적 복제가 사용하는 것입니다.

먼저, 사용할 예시를 위한 출판물을 만드세요.

test_pub=# 모든 테이블에 대한 출판 pub1 생성;
출판물 생성

예 1: 토토 커뮤니티에 명시된 내용연결 = 거짓

  • 토토 커뮤니티을 생성하세요.

    test_sub=# 토토 커뮤니티 만들기 하위 1
    test_sub-# 연결 'host=localhost dbname=test_pub'
    test_sub-# 출판 pub1
    test_sub-# WITH (연결=false);
    경고: 토토 커뮤니티이 생성되었지만 연결되지 않았습니다.
    힌트: 복제를 시작하려면 복제 슬롯을 수동으로 생성하고, 토토 커뮤니티을 활성화하고, 토토 커뮤니티을 새로 고쳐야 합니다.
    토토 커뮤니티 만들기
  • 게시자에서 슬롯을 수동으로 생성하십시오. 이름이 지정되지 않았기 때문에토토 커뮤니티 작성, 생성할 슬롯의 이름은 토토 커뮤니티 이름과 동일합니다. "하위 1".

    test_pub=# SELECT * FROM pg_create_logical_replication_slot('sub1', 'pgoutput');
     슬롯_이름 |    lsn
    ---------+------------
     하위1 | 0/19404D0
    (1행)
  • 토토 커뮤니티자에서 토토 커뮤니티 활성화를 완료하세요. 그 후의 테이블은pub1복제를 시작합니다.

    test_sub=# ALTER SUBSCRIPTION sub1 ENABLE;
    토토 커뮤니티 변경
    test_sub=# 토토 커뮤니티 변경 sub1 출판 새로 고침;
    토토 커뮤니티 변경

예 2: 토토 커뮤니티에 명시된 내용연결 = 거짓뿐만 아니라도 지정합니다.slot_name옵션.

  • 토토 커뮤니티을 생성하세요.

    test_sub=# 토토 커뮤니티 만들기 하위 1
    test_sub-# 연결 'host=localhost dbname=test_pub'
    test_sub-# 출판 pub1
    test_sub-# WITH (connect=false, 슬롯_이름='myslot');
    경고: 토토 커뮤니티이 생성되었지만 연결되지 않았습니다.
    힌트: 복제를 시작하려면 복제 슬롯을 수동으로 생성하고, 토토 커뮤니티을 활성화하고, 토토 커뮤니티을 새로 고쳐야 합니다.
    토토 커뮤니티 만들기
  • 게시자에서, 동안 지정된 것과 동일한 이름을 사용하여 수동으로 슬롯을 생성하십시오.토토 커뮤니티 작성, 예: "마이슬롯".

    test_pub=# SELECT * FROM pg_create_logical_replication_slot('myslot', 'pgoutput');
     슬롯_이름 |    lsn
    ---------+------------
     마이슬롯 | 0/19059A0
    (1행)
  • 토토 커뮤니티자의 나머지 토토 커뮤니티 활성화 단계는 이전과 동일합니다.

    test_sub=# ALTER SUBSCRIPTION sub1 ENABLE;
    토토 커뮤니티 변경
    test_sub=# 토토 커뮤니티 변경 sub1 출판 새로 고침;
    토토 커뮤니티 변경

예 3: 토토 커뮤니티이 지정하는 경우slot_name = 없음

  • 토토 커뮤니티을 생성하세요. 언제slot_name = 없음그런 다음활성화 = 거짓create_slot = false또한 필요합니다.

    test_sub=# 토토 커뮤니티 만들기 하위 1
    test_sub-# 연결 'host=localhost dbname=test_pub'
    test_sub-# 출판 pub1
    test_sub-# WITH (slot_name=NONE, 활성화=false, create_slot=false);
    토토 커뮤니티 만들기
  • 게시자에서 임의의 이름을 사용하여 수동으로 슬롯을 생성하십시오. "마이슬롯".

    test_pub=# SELECT * FROM pg_create_logical_replication_slot('myslot', 'pgoutput');
     슬롯_이름 |    lsn
    ---------+------------
     마이슬롯 | 0/1905930
    (1행)
  • 토토 커뮤니티자에서 방금 생성된 슬롯 이름과 토토 커뮤니티을 연결하십시오.

    test_sub=# ALTER SUBSCRIPTION sub1 SET (slot_name='myslot');
    토토 커뮤니티 변경
  • 나머지 토토 커뮤니티 활성화 단계는 이전과 동일합니다.

    test_sub=# ALTER SUBSCRIPTION sub1 ENABLE;
    토토 커뮤니티 변경
    test_sub=# 토토 커뮤니티 변경 sub1 출판 새로 고침;
    토토 커뮤니티 변경

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.