예제 토토 캔 플러그인은에서 찾을 수 있습니다.contrib/test_decoding
PostgreSQL 소스 트리의 하위 디렉토리.
토토 캔 플러그인 이름을 라이브러리 기본 이름으로 공유 라이브러리를 동적으로로드하여 토토 캔 플러그인이로드됩니다. 일반 라이브러리 검색 경로는 라이브러리를 찾는 데 사용됩니다. 필요한 토토 캔 플러그인 콜백을 제공하고 라이브러리가 실제로 토토 캔 플러그인임을 나타내려면_pg_output_plugin_init
. 이 함수는 개별 동작에 대한 콜백 함수 포인터로 채워야하는 구조물이 전달됩니다.
typedef struct outputplugincallbacks logicaldecodestartupcb startup_cb; logicaldecodebegincb begin_cb; logicaldecodechangecb change_cb; logicaldecodetruncatecb truncate_cb; logicaldecodecommitcb commit_cb; logicaldecodemessagecb message_cb; logicaldecodefilterbyorigincb filter_by_origin_cb; logicaldecodeshutdowncb shutdown_cb; outputplugincallbacks; typedef void ( *logicaloutputplugininit) (struct outputplugincallbacks *cb);
thebegin_cb
, Change_CB
andCommit_CB
콜백이 필요합니다.startup_cb
, filter_by_origin_cb
, Truncate_CB
및shutdown_cb
선택 사항입니다. 만약에Truncate_CB
설정되지 않았지만 aTruncate
해독되면 행동은 무시됩니다.
DECODE, FORMAT 및 OUTPUT 변경 사항을 위해 토토 캔 플러그인은 호출 토토 캔 기능을 포함하여 대부분의 백엔드의 일반 인프라를 사용할 수 있습니다. 읽기 만으로만 관계에 대한 액세스만이 허용됩니다.initdb
inPG_CATALOG
스키마 또는 사용자가 제공하는 카탈로그 테이블로 표시되었습니다
ALTER TABLE USER_CATALOG_TABLE SET (user_catalog_table = true); (user_catalog_table = true)를 사용하여 다른 _catalog_table (data text); 테이블을 만듭니다.
거래 ID 할당으로 이어지는 모든 조치는 금지됩니다. 여기에는 테이블 작성, DDL 변경 수행 및 통화가 포함됩니다.PG_CURRENT_XACT_ID ()
.
출력 플러그인 콜백은 거의 임의의 형식으로 소비자에게 데이터를 전달할 수 있습니다. SQL을 통한 변경 사항보기와 같은 일부 사용 사례의 경우 임의의 데이터를 포함 할 수있는 데이터 유형에서 데이터를 반환합니다 (예 :BYTEA
)는 번거 롭습니다. 토토 캔 플러그인이 서버 인코딩에서 텍스트 데이터 만 토토 캔하는 경우 설정하여를 선언 할 수 있습니다outputpluginoptions.output_type
tooutput_plugin_textual_output
대신output_plugin_binary_output
in시작 콜백. 이 경우 모든 데이터는 서버 인코딩에 있어야합니다.텍스트
Datum은 그것을 포함 할 수 있습니다. 이것은 Assertion 지원 빌드에서 확인됩니다.
토토 캔 플러그인은 제공 해야하는 다양한 콜백을 통해 발생하는 변경 사항에 대해 알림을받습니다.
동시 트랜잭션은 커밋 순서로 해독되며 특정 트랜잭션에 속하는 변경 사항만이 사이에 해독됩니다.시작
and커밋
콜백. 명시 적으로 또는 암시 적으로 롤백 된 거래는 디코딩되지 않습니다. 성공적인 저장 포인트는 해당 거래 내에서 실행 된 순서대로 포함 된 트랜잭션으로 접 힙니다.
디스크로 이미 안전하게 플러시 된 트랜잭션 만 디코딩됩니다. 그것은로 이어질 수 있습니다.커밋
직접 다음에 즉시 디코딩되지 않음pg_logical_slot_get_changes ()
언제synchronous_commit
로 설정되었습니다OFF
.
선택 사항startup_cb
콜백은 복제 슬롯이 생성되거나 스트림 변경을 요청할 때마다 호출됩니다.
typedef void ( *logicaldecodestartUpcb) (struct logicaldecodingcontext *ctx, outputpluginoptions *옵션, bool is_init);
theis_init
복제 슬롯이 생성되고 그렇지 않으면 거짓일 때 매개 변수가 사실이됩니다.옵션
출력 플러그인이 설정할 수있는 옵션 구조를 가리 킵니다.
typedef 구조물 출력 플러그 인노프 outputpluginoutputtype output_type; bool leceing_rewrites; outputpluginoptions;
output_type
|output_plugin_textual_output
또는output_plugin_binary_output
. 참조 참조섹션 48.6.3. 만약에수신 _rewrites
TRUE, 토토 캔 플러그인은 특정 DDL 작업 중에 힙으로 변경 된 변경 사항을 요구합니다. DDL 복제를 처리하는 플러그인에 관심이 있지만 특수 처리가 필요합니다.
시작 콜백은에 존재하는 옵션을 검증해야합니다.ctx- output_plugin_options
. 토토 캔 플러그인에 상태가 있어야하는 경우 사용할 수 있습니다ctx- output_plugin_private
저장하려면
선택 사항shutdown_cb
콜백은 이전의 활성 복제 슬롯이 더 이상 사용되지 않을 때마다 호출되며 출력 플러그인에 리소스를 개인화하는 데 사용할 수 있습니다. 슬롯이 반드시 떨어지지 않아도되며 스트리밍이 중지됩니다.
typedef void ( *logicaldecodeshutdowncb) (struct logicaldecodingcontext *ctx);
필수begin_cb
콜백은 커밋 된 트랜잭션의 시작이 해독 될 때마다 호출됩니다. 중단 된 거래와 해당 내용은 디코딩되지 않습니다.
typedef void ( *logicaldecodebegincb) (struct logicaldecodingcontext *ctx, REARDERBUFFERTXN *TXN);
theTXN
매개 변수는 거래에 대한 메타 정보가 포함되어 있습니다.
필수Commit_CB
트랜잭션 커밋이 해독 될 때마다 콜백이 호출됩니다. 그만큼Change_CB
수정 된 행이 있으면 모든 수정 된 행에 대한 콜백이 호출되었습니다.
typedef void ( *logicaldecodecommitcb) (struct logicaldecodingcontext *ctx, REARDERBUFFERTXN *TXN, xlogrecptr commit_lsn);
필수Change_CB
콜백은 트랜잭션 내의 모든 개별 행 수정에 대해 호출됩니다.삽입
, 업데이트
또는삭제
. 원래 명령이 한 번에 여러 행을 수정하더라도 콜백은 각 행에 대해 개별적으로 호출됩니다.
typedef void ( *logicaldecodechangecb) (struct logicaldecodingcontext *ctx, REARDERBUFFERTXN *TXN, 관계 관계, REARDERBUFFERCHANGE *Change);
theCTX
andTXN
매개 변수는와 동일한 내용을 갖습니다.begin_cb
andCommit_CB
콜백, 그러나 또한 관계 설명 자관계
행이 속한 관계를 가리키고 구조물변경
행 수정을 설명하는 것은 전달됩니다.
theTruncate_CB
콜백이 호출되었습니다Truncate
명령.
typedef void ( *logicaldecodetruncatecb) (struct logicaldecodingcontext *ctx, REARDERBUFFERTXN *TXN, int nrelations, 관계 관계 [], REARDERBUFFERCHANGE *Change);
매개 변수는와 유사합니다Change_CB
콜백. 그러나 왜냐하면Truncate
외국 키로 연결된 테이블의 조치를 함께 실행해야합니다.이 콜백은 단 하나의 관계 대신 일련의 관계를받습니다. 의 설명을 참조하십시오.Truncate자세한 내용은 진술.
선택 사항filter_by_origin_cb
콜백이 호출되어origin_id
토토 캔 플러그인에 관심이 있습니다.
typedef bool ( *logicaldecodefilterbyorigincb) (struct logicaldecodingcontext *ctx, reporiginid origin_id);
theCTX
매개 변수는 다른 콜백과 동일한 내용을 갖습니다. 정보는 없지만 원점을 사용할 수 있습니다. 노드에서 전달 된 변화가 관련이 없다는 것을 알리기 위해, true를 반환하여 필터링됩니다. 그렇지 않으면 거짓. 다른 콜백은 필터링 된 트랜잭션 및 변경에 대해 요구되지 않습니다.
이것은 계단식 또는 다 방향 복제 솔루션을 구현할 때 유용합니다. 원점에 의한 필터링을 사용하면 그러한 설정에서 동일한 변경 사항을 앞뒤로 복제하는 것을 방지 할 수 있습니다. 트랜잭션 및 변경 사항도 원점에 대한 정보를 제공하지만이 콜백을 통한 필터링은 더욱 효율적입니다.
선택 사항message_cb
논리적 디코딩 메시지가 디코딩 될 때마다 콜백이 호출됩니다.
typedef void ( *logicaldecodemessagecb) (struct logicaldecodingcontext *ctx, REARDERBUFFERTXN *TXN, xlogrecptr message_lsn, bool transactional, const char *prefix, size message_size, const char *메시지);
theTXN
매개 변수에는 거래에 대한 메타 정보가 포함되어 있습니다. 그러나 메시지가 비 트랜잭션이고 메시지를 기록한 트랜잭션에 아직 XID가 할당되지 않은 경우에는 NULL이 될 수 있습니다. 그만큼LSN
메시지의 WAL 위치가 있습니다. 그만큼거래
메시지가 트랜잭션으로 전송되었는지 여부를 말합니다. 그만큼prefix
현재 플러그인에 대한 흥미로운 메시지를 식별하는 데 사용할 수있는 임의의 null 종결 접두사입니다. 그리고 마지막으로메시지
매개 변수는 실제 메시지를 보유합니다message_size
크기.
출력 플러그인이 흥미롭게 간주되는 접두사가 독특하다는 것을 확인하기 위해 추가주의를 기울여야합니다. 확장자 이름 또는 출력 플러그인 자체를 사용하는 것은 종종 좋은 선택입니다.
실제로 토토 캔을 생성하려면 토토 캔 플러그인이에 데이터를 쓸 수 있습니다.StringInfo
토토 캔 버퍼에서ctx- out
내부에있을 때begin_cb
, Commit_CB
또는Change_CB
콜백. 토토 캔 버퍼에 쓰기 전에outputpluginpreparewrite (ctx, last_write)
호출해야하고 버퍼에 쓰기를 마친 후outputpluginWrite (CTX, last_write)
쓰기를 수행하려면 호출되어야합니다. 그만큼last_write
특정 쓰기가 콜백의 마지막 쓰기인지 여부를 나타냅니다.
다음 예제는 출력 플러그인의 소비자에게 데이터를 출력하는 방법을 보여줍니다.
outputpluginpreparewrite (ctx, true); AppendStringInfo (ctx- out, "시작 %u", txn- xid); OutputPlugInwrite (CTX, True);
문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면