기본적으로 모든 게시된 테이블의 모든 데이터는 해당 구독자에게 복제됩니다. 복제된 데이터는 다음을 사용하여 줄일 수 있습니다.행 배트맨 토토. 사용자는 행동, 보안 또는 성능상의 이유로 행 배트맨 토토를 사용하도록 선택할 수 있습니다. 게시된 테이블에 행 배트맨 토토가 설정되면 해당 데이터가 행 배트맨 토토 식을 충족하는 경우에만 행이 복제됩니다. 이를 통해 테이블 세트를 부분적으로 복제할 수 있습니다. 행 배트맨 토토는 테이블별로 정의됩니다. 를 사용하세요어디8906_9005어디절은 괄호로 묶어야 합니다. 참조간행물 작성자세한 내용은.
행 배트맨 토토가 적용되었습니다이전변경사항 게시 중. 행 배트맨 토토가 다음과 같이 평가되는 경우거짓또는NULL그러면 행이 복제되지 않습니다.어디절 표현식은 복제 연결에 사용된 것과 동일한 역할(즉,연결의 절구독 작성). 행 배트맨 토토는 다음 항목에 적용되지 않습니다.잘라내기명령.
그어디절은 간단한 표현식만 허용합니다. 사용자 정의 함수, 연산자, 유형 및 데이터 정렬, 시스템 열 참조 또는 불변 내장 함수를 포함할 수 없습니다.
간행물이 출판되는 경우업데이트또는삭제작업, 행 배트맨 토토어디절은 복제본 ID에 포함되는 열만 포함해야 합니다(참조복제본 ID). 출판물이 출판만 된 경우삽입작업, 행 배트맨 토토어디절은 모든 열을 사용할 수 있습니다.
언제든지업데이트이 처리되면 행 배트맨 토토 표현식은 이전 행과 새 행 모두에 대해 평가됩니다(즉, 업데이트 전후의 데이터 사용). 두 평가가 모두 다음과 같은 경우참, 이는 다음을 복제합니다.업데이트변경. 두 평가가 모두 다음과 같은 경우거짓, 변경 사항을 복제하지 않습니다. 이전/새 행 중 하나만 행 배트맨 토토 표현식과 일치하는 경우,업데이트다음으로 변환됨삽입또는삭제, 데이터 불일치를 방지합니다. 구독자의 행은 게시자의 행 배트맨 토토 표현식으로 정의된 내용을 반영해야 합니다.
이전 행이 행 배트맨 토토 표현식을 만족하지만(구독자에게 전송됨) 새 행이 만족하지 않으면 데이터 일관성 관점에서 이전 행을 구독자에서 제거해야 합니다. 그래서업데이트다음으로 변환됩니다.삭제.
이전 행이 행 배트맨 토토 표현식을 충족하지 않지만(구독자에게 전송되지 않음) 새 행이 충족하는 경우 데이터 일관성 관점에서 새 행이 구독자에 추가되어야 합니다. 그래서업데이트는로 변환됩니다.삽입.
표 29.1적용된 변환을 요약합니다.
표 29.1. 업데이트변환 요약
| 이전 행 | 새 행 | 변환 |
|---|---|---|
| 일치하지 않음 | 일치하지 않음 | 복제하지 마세요 |
| 일치하지 않음 | 일치 | 삽입 |
| 일치 | 일치하지 않음 | 삭제 |
| 일치 | 일치 | 업데이트 |
게시물에 분할된 테이블이 포함된 경우 게시 매개변수publish_via_partition_root사용되는 행 배트맨 토토를 결정합니다. 만일publish_via_partition_rootis참, 그루트로 파티션을 나눈 테이블행 배트맨 토토가 사용되었습니다. 그렇지 않은 경우, 만약publish_via_partition_rootis거짓(기본값), 각각파티션의행 배트맨 토토가 사용되었습니다.
구독에 기존 테이블 데이터 복사가 필요하고 게시에 다음이 포함된 경우어디절, 행 배트맨 토토 표현식을 만족하는 데이터만 구독자에게 복사됩니다.
구독에 테이블이 서로 다른 출판물이 여러 개 있는 경우어디절, 만족하는 행모든표현식이 복사됩니다. 참조섹션 29.4.6자세한 내용은.
초기 데이터 동기화는 다음을 고려하지 않기 때문입니다.게시매개변수를 사용하면 기존 테이블 데이터를 복사할 때 DML을 사용하여 복제되지 않는 일부 행이 복사될 수 있습니다. 참조섹션 29.9.1그리고 보세요섹션 29.2.2예를 들어.
구독자가 15 이전 릴리스인 경우, 기존 데이터 복사는 발행물에 정의되어 있더라도 행 배트맨 토토를 사용하지 않습니다. 이전 릴리스에서는 전체 테이블 데이터만 복사할 수 있기 때문입니다.
구독에 동일한 테이블이 다른 행 배트맨 토토로 게시된 여러 게시가 있는 경우(동일한 경우게시연산), 해당 표현식은 OR로 연결되어 행이 만족됩니다.모든표현식 중 복제됩니다. 이는 다음과 같은 경우 동일한 테이블의 다른 모든 행 배트맨 토토가 중복된다는 의미입니다.
게시물 중 하나에 행 배트맨 토토가 없습니다.
간행물 중 하나는 다음을 사용하여 생성되었습니다.모든 테이블에 대해. 이 절은 행 배트맨 토토를 허용하지 않습니다.
간행물 중 하나는 다음을 사용하여 생성되었습니다.스키마 테이블의 경우그리고 테이블은 참조된 스키마에 속합니다. 이 절은 행 배트맨 토토를 허용하지 않습니다.
다음 예에서 사용할 테이블을 만드십시오.
/* pub # */ CREATE TABLE t1(a int, b int, c text, PRIMARY KEY(a,c)); /* pub # */ CREATE TABLE t2(d int, e int, f int, PRIMARY KEY(d)); /* pub # */ CREATE TABLE t3(g int, h int, i int, PRIMARY KEY(g));
간행물을 작성하십시오. 출판p1테이블이 하나 있습니다(t1) 해당 테이블에는 행 배트맨 토토가 있습니다. 출판p2테이블이 두 개 있습니다. 표t1행 배트맨 토토가 없고 테이블이 있음t2행 배트맨 토토가 있습니다. 출판p3두 개의 테이블이 있고 둘 다 행 배트맨 토토가 있습니다.
/* pub # */ WHERE (a 5 AND c = 'NSW'); /* pub # */ 테이블 t1, t2 WHERE (e = 99)에 대한 출판 p2 생성; /* pub # */ 테이블 t2 WHERE (d = 10), t3 WHERE (g = 10)에 대한 출판 p3 생성;
psql각 게시에 대한 행 배트맨 토토 표현식(정의된 경우)을 표시하는 데 사용할 수 있습니다.
/* 술집 # */ \dRp+
출판물 p1
소유자 | 모든 테이블 | 모든 시퀀스 | 삽입물 | 업데이트 | 삭제 | 잘림 | 생성된 열 | 루트를 통해
----------+------------+---------------+---------+---------+---------+------------+------+------------
포스트그레스 | 에프 | 에프 | 티 | 티 | 티 | 티 | 없음 | 에프
테이블:
"public.t1" WHERE ((a 5) AND (c = 'NSW'::text))
출판물 p2
소유자 | 모든 테이블 | 모든 시퀀스 | 삽입물 | 업데이트 | 삭제 | 잘림 | 생성된 열 | 루트를 통해
----------+------------+---------------+---------+---------+---------+------------+------+------------
포스트그레스 | 에프 | 에프 | 티 | 티 | 티 | 티 | 없음 | 에프
테이블:
"공개.t1"
"public.t2" 어디(e = 99)
출판물 p3
소유자 | 모든 테이블 | 모든 시퀀스 | 삽입물 | 업데이트 | 삭제 | 잘림 | 생성된 열 | 루트를 통해
----------+------------+---------------+---------+---------+---------+------------+------+------------
포스트그레스 | 에프 | 에프 | 티 | 티 | 티 | 티 | 없음 | 에프
테이블:
"public.t2" 어디(d = 10)
"public.t3" 어디(g = 10)
psql은(는) 각 테이블에 대한 행 배트맨 토토 표현식(정의된 경우)을 표시하는 데 사용할 수 있습니다. 해당 표를 참조하세요.t1은 두 출판물의 구성원이지만 행 배트맨 토토는 다음에만 있습니다.p1. 해당 표를 참조하세요.t2은 두 출판물의 구성원이며 각각 다른 행 배트맨 토토를 가지고 있습니다.
/* 술집 # */ \d t1
테이블 "public.t1"
칼럼 | 유형 | 데이터 정렬 | 널 입력 가능 | 기본값
---------+---------+------------+----------+---------
| 정수 | | null이 아님 |
비 | 정수 | | |
c | 텍스트 | | null이 아님 |
인덱스:
"t1_pkey" 기본 키, btree(a, c)
출판물:
"p1" WHERE ((a 5) AND (c = 'NSW'::text))
"p2"
/* 술집 # */ \d t2
테이블 "public.t2"
칼럼 | 유형 | 데이터 정렬 | 널 입력 가능 | 기본값
---------+---------+------------+----------+---------
디 | 정수 | | null이 아님 |
전자 | 정수 | | |
에프 | 정수 | | |
인덱스:
"t2_pkey" 기본 키, btree(d)
출판물:
"p2" 어디서(e = 99)
"p3" 어디서(d = 10)
/* 술집 # */ \d t3
테이블 "public.t3"
칼럼 | 유형 | 데이터 정렬 | 널 입력 가능 | 기본값
---------+---------+------------+----------+---------
지 | 정수 | | null이 아님 |
시간 | 정수 | | |
나 | 정수 | | |
인덱스:
"t3_pkey" 기본 키, btree(g)
출판물:
"p3" 어디(g = 10)
구독자 노드에서 테이블을 생성하십시오.t1게시자의 정의와 동일한 정의를 사용하고 구독도 생성s1간행물을 구독하는 사람p1.
/* sub # */ CREATE TABLE t1(a int, b int, c text, PRIMARY KEY(a,c)); /* 하위 # */ 구독 만들기 s1 /* sub - */ CONNECTION 'host=localhost dbname=test_pub application_name=s1' /* 하위 - */ 출판물 p1;
일부 행을 삽입하세요. 를 만족하는 행만t1 어디게시 조항p1복제되었습니다.
/* pub # */ t1 값에 삽입(2, 102, 'NSW'); /* pub # */ INSERT INTO t1 VALUES (3, 103, 'QLD'); /* pub # */ INSERT INTO t1 VALUES (4, 104, 'VIC'); /* pub # */ INSERT INTO t1 VALUES (5, 105, 'ACT'); /* pub # */ INSERT INTO t1 VALUES (6, 106, 'NSW'); /* pub # */ INSERT INTO t1 VALUES (7, 107, 'NT'); /* pub # */ INSERT INTO t1 VALUES (8, 108, 'QLD'); /* pub # */ INSERT INTO t1 VALUES (9, 109, 'NSW'); /* pub # */ SELECT * FROM t1; | 비 | ㄷ ---+------+----- 2 | 102 | NSW 3 | 103 | 퀸즐랜드 4 | 104 | 빅 5 | 105 | 행위 6 | 106 | NSW 7 | 107 | NT 8 | 108 | 퀸즐랜드 9 | 109 | NSW (8행)
/* 하위 # */ SELECT * FROM t1; | 비 | ㄷ ---+------+----- 6 | 106 | NSW 9 | 109 | NSW (2행)
이전 행 값과 새 행 값이 모두 다음을 만족하는 일부 데이터를 업데이트합니다.t1 어디게시 조항p1.업데이트변경사항을 정상적으로 복제합니다.
/* pub # */ 업데이트 t1 SET b = 999 WHERE a = 6; /* pub # */ SELECT * FROM t1; | 비 | ㄷ ---+------+----- 2 | 102 | NSW 3 | 103 | 퀸즐랜드 4 | 104 | 빅 5 | 105 | 행위 7 | 107 | NT 8 | 108 | 퀸즐랜드 9 | 109 | NSW 6 | 999 | NSW (8행)
/* 하위 # */ SELECT * FROM t1; | 비 | ㄷ ---+------+----- 9 | 109 | NSW 6 | 999 | NSW (2행)
이전 행 값이 만족하지 못한 일부 데이터를 업데이트합니다.t1 어디게시 조항p1이지만 새 행 값은 이를 충족합니다.업데이트는로 변환됩니다.삽입그리고 변경사항이 복제됩니다. 구독자의 새 행을 확인하세요.
/* pub # */ 업데이트 t1 SET a = 555 WHERE a = 2; /* pub # */ SELECT * FROM t1; | 비 | ㄷ ----+------+----- 3 | 103 | 퀸즐랜드 4 | 104 | 빅 5 | 105 | 행위 7 | 107 | NT 8 | 108 | 퀸즐랜드 9 | 109 | NSW 6 | 999 | NSW 555 | 102 | NSW (8행)
/* 하위 # */ SELECT * FROM t1; | 비 | ㄷ ----+------+----- 9 | 109 | NSW 6 | 999 | NSW 555 | 102 | NSW (3행)
이전 행 값이 만족하는 일부 데이터 업데이트t1 어디게시 조항p1이지만 새 행 값이 이를 충족하지 않습니다.업데이트a로 변환됩니다.삭제그리고 변경사항이 복제됩니다. 구독자에서 행이 제거되었는지 확인하세요.
/* pub # */ 업데이트 t1 SET c = 'VIC' WHERE a = 9; /* pub # */ SELECT * FROM t1; | 비 | ㄷ ----+------+----- 3 | 103 | 퀸즐랜드 4 | 104 | 빅 5 | 105 | 행위 7 | 107 | NT 8 | 108 | 퀸즐랜드 6 | 999 | NSW 555 | 102 | NSW 9 | 109 | 빅 (8행)
/* 하위 # */ SELECT * FROM t1; | 비 | ㄷ ----+------+----- 6 | 999 | NSW 555 | 102 | NSW (2행)
다음 예는 게시 매개변수가 어떻게 작동하는지 보여줍니다.publish_via_partition_root분할된 테이블의 경우 상위 또는 하위 테이블의 행 배트맨 토토를 사용할지 여부를 결정합니다.
게시자에 분할된 테이블을 생성하십시오.
/* pub # */ CREATE TABLE parent(a int PRIMARY KEY) PARTITION BY RANGE(a); /* pub # */ 부모 DEFAULT의 테이블 하위 PARTITION 생성;
구독자에 동일한 테이블을 생성하십시오.
/* sub # */ CREATE TABLE parent(a int PRIMARY KEY) PARTITION BY RANGE(a); /* sub # */ CREATE TABLE 하위 PARTITION OF 상위 DEFAULT;
간행물 작성p4을 선택한 다음 구독하세요. 출판 매개변수publish_via_partition_root이 true로 설정되었습니다. 파티션을 나눈 테이블() 모두에 행 배트맨 토토가 정의되어 있습니다.부모) 및 파티션(아이).
/* pub # */ CREATE PUBLICATION p4 FOR TABLE 상위 WHERE(a < 5), 하위 WHERE(a = 5) /* pub - */ WITH (publish_via_partition_root=true);
/* 하위 # */ 구독 만들기 s4 /* sub - */ CONNECTION 'host=localhost dbname=test_pub application_name=s4' /* 하위 - */ 출판 p4;
일부 값을 다음에 직접 삽입부모그리고아이테이블. 그들은 다음의 행 배트맨 토토를 사용하여 복제합니다.부모(왜냐하면publish_via_partition_root사실입니다).
/* pub # */ 상위 값에 삽입 (2), (4), (6); /* pub # */ INSERT INTO 하위 VALUES (3), (5), (7); /* pub # */ SELECT * FROM parent ORDER BY a; 에 --- 2 3 4 5 6 7 (6행)
/* 하위 # */ SELECT * FROM 상위 ORDER BY a; 에 --- 2 3 4 (3행)
동일한 테스트를 반복하지만 다른 값을 사용하여publish_via_partition_root. 출판 매개변수publish_via_partition_root거짓으로 설정되었습니다. 행 배트맨 토토는 파티션()에 정의되어 있습니다.아이).
/* pub # */ 출판물 삭제 p4; /* pub # */ CREATE PUBLICATION p4 FOR TABLE 부모, 자식 WHERE (a = 5) /* pub - */ WITH (publish_via_partition_root=false);
/* 하위 # */ 구독 변경 s4 출판 새로고침;
이전과 동일하게 게시자에 삽입을 수행하십시오. 그들은 다음의 행 배트맨 토토를 사용하여 복제합니다.아이(왜냐하면publish_via_partition_root거짓입니다).
/* pub # */ TRUNCATE 상위; /* pub # */ INSERT INTO 상위 VALUES (2), (4), (6); /* pub # */ INSERT INTO 하위 VALUES (3), (5), (7); /* pub # */ SELECT * FROM parent ORDER BY a; 에 --- 2 3 4 5 6 7 (6행)
/* 하위 # */ SELECT * FROM child ORDER BY a; 에 --- 5 6 7 (3행)