48.6. 논리적 디코딩 토토 캔 플러그인

예제 토토 캔 플러그인은에서 찾을 수 있습니다.contrib/test_decodingPostgreSQL 소스 트리의 하위 디렉토리.

48.6.1. 초기화 함수

토토 캔 플러그인 이름을 라이브러리 기본 이름으로 공유 라이브러리를 동적으로로드하여 토토 캔 플러그인이로드됩니다. 일반 라이브러리 검색 경로는 라이브러리를 찾는 데 사용됩니다. 필요한 토토 캔 플러그인 콜백을 제공하고 라이브러리가 실제로 토토 캔 플러그인임을 나타내려면_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_CBandCommit_CB콜백이 필요합니다.startup_cb, filter_by_origin_cb, ​​Truncate_CBshutdown_cb선택 사항입니다. 만약에Truncate_CB설정되지 않았지만 aTruncate해독되면 행동은 무시됩니다.

48.6.2. 기능

DECODE, FORMAT 및 OUTPUT 변경 사항을 위해 토토 캔 플러그인은 호출 토토 캔 기능을 포함하여 대부분의 백엔드의 일반 인프라를 사용할 수 있습니다. 읽기 만으로만 관계에 대한 액세스만이 허용됩니다.initdbinPG_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 ().

48.6.3. 토토 캔 모드

출력 플러그인 콜백은 거의 임의의 형식으로 소비자에게 데이터를 전달할 수 있습니다. SQL을 통한 변경 사항보기와 같은 일부 사용 사례의 경우 임의의 데이터를 포함 할 수있는 데이터 유형에서 데이터를 반환합니다 (예 :BYTEA)는 번거 롭습니다. 토토 캔 플러그인이 서버 인코딩에서 텍스트 데이터 만 토토 캔하는 경우 설정하여를 선언 할 수 있습니다outputpluginoptions.output_typetooutput_plugin_textual_output대신output_plugin_binary_outputin시작 콜백. 이 경우 모든 데이터는 서버 인코딩에 있어야합니다.텍스트Datum은 그것을 포함 할 수 있습니다. 이것은 Assertion 지원 빌드에서 확인됩니다.

48.6.4. 토토 캔 플러그인 콜백

토토 캔 플러그인은 제공 해야하는 다양한 콜백을 통해 발생하는 변경 사항에 대해 알림을받습니다.

동시 트랜잭션은 커밋 순서로 해독되며 특정 트랜잭션에 속하는 변경 사항만이 사이에 해독됩니다.시작and커밋콜백. 명시 적으로 또는 암시 적으로 롤백 된 거래는 디코딩되지 않습니다. 성공적인 저장 포인트는 해당 거래 내에서 실행 된 순서대로 포함 된 트랜잭션으로 접 힙니다.

Note

디스크로 이미 안전하게 플러시 된 트랜잭션 만 디코딩됩니다. 그것은로 이어질 수 있습니다.커밋직접 다음에 즉시 디코딩되지 않음pg_logical_slot_get_changes ()언제synchronous_commit로 설정되었습니다OFF.

48.6.4.1. 시작 콜백

선택 사항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. 만약에수신 _rewritesTRUE, 토토 캔 플러그인은 특정 DDL 작업 중에 힙으로 변경 된 변경 사항을 요구합니다. DDL 복제를 처리하는 플러그인에 관심이 있지만 특수 처리가 필요합니다.

시작 콜백은에 존재하는 옵션을 검증해야합니다.ctx- output_plugin_options. 토토 캔 플러그인에 상태가 있어야하는 경우 사용할 수 있습니다ctx- output_plugin_private저장하려면

48.6.4.2. 종료 콜백

선택 사항shutdown_cb콜백은 이전의 활성 복제 슬롯이 더 이상 사용되지 않을 때마다 호출되며 출력 플러그인에 리소스를 개인화하는 데 사용할 수 있습니다. 슬롯이 반드시 떨어지지 않아도되며 스트리밍이 중지됩니다.

typedef void ( *logicaldecodeshutdowncb) (struct logicaldecodingcontext *ctx);

48.6.4.3. 거래 시작 콜백

필수begin_cb콜백은 커밋 된 트랜잭션의 시작이 해독 될 때마다 호출됩니다. 중단 된 거래와 해당 내용은 디코딩되지 않습니다.

typedef void ( *logicaldecodebegincb) (struct logicaldecodingcontext *ctx,
                                      REARDERBUFFERTXN *TXN);

theTXN매개 변수는 거래에 대한 메타 정보가 포함되어 있습니다.

48.6.4.4. 거래 종료 콜백

필수Commit_CB트랜잭션 커밋이 해독 될 때마다 콜백이 호출됩니다. 그만큼Change_CB수정 된 행이 있으면 모든 수정 된 행에 대한 콜백이 호출되었습니다.

typedef void ( *logicaldecodecommitcb) (struct logicaldecodingcontext *ctx,
                                       REARDERBUFFERTXN *TXN,
                                       xlogrecptr commit_lsn);

48.6.4.5. 콜백 변경

필수Change_CB콜백은 트랜잭션 내의 모든 개별 행 수정에 대해 호출됩니다.삽입, 업데이트또는삭제. 원래 명령이 한 번에 여러 행을 수정하더라도 콜백은 각 행에 대해 개별적으로 호출됩니다.

typedef void ( *logicaldecodechangecb) (struct logicaldecodingcontext *ctx,
                                       REARDERBUFFERTXN *TXN,
                                       관계 관계,
                                       REARDERBUFFERCHANGE *Change);

theCTXandTXN매개 변수는와 동일한 내용을 갖습니다.begin_cbandCommit_CB콜백, 그러나 또한 관계 설명 자관계행이 속한 관계를 가리키고 구조물변경행 수정을 설명하는 것은 전달됩니다.

note

응하지 않은 사용자 정의 테이블의 변경 만 변경 (참조미등록) 임시가 아님 (참조임시또는temp) 논리적 디코딩을 사용하여 추출 할 수 있습니다.

48.6.4.6. 절단 콜백

theTruncate_CB콜백이 호출되었습니다Truncate명령.

typedef void ( *logicaldecodetruncatecb) (struct logicaldecodingcontext *ctx,
                                         REARDERBUFFERTXN *TXN,
                                         int nrelations,
                                         관계 관계 [],
                                         REARDERBUFFERCHANGE *Change);

매개 변수는와 유사합니다Change_CB콜백. 그러나 왜냐하면Truncate외국 키로 연결된 테이블의 조치를 함께 실행해야합니다.이 콜백은 단 하나의 관계 대신 일련의 관계를받습니다. 의 설명을 참조하십시오.Truncate자세한 내용은 진술.

48.6.4.7. 원래 필터 콜백

선택 사항filter_by_origin_cb콜백이 호출되어origin_id토토 캔 플러그인에 관심이 있습니다.

typedef bool ( *logicaldecodefilterbyorigincb) (struct logicaldecodingcontext *ctx,
                                               reporiginid origin_id);

theCTX매개 변수는 다른 콜백과 동일한 내용을 갖습니다. 정보는 없지만 원점을 사용할 수 있습니다. 노드에서 전달 된 변화가 관련이 없다는 것을 알리기 위해, true를 반환하여 필터링됩니다. 그렇지 않으면 거짓. 다른 콜백은 필터링 된 트랜잭션 및 변경에 대해 요구되지 않습니다.

이것은 계단식 또는 다 방향 복제 솔루션을 구현할 때 유용합니다. 원점에 의한 필터링을 사용하면 그러한 설정에서 동일한 변경 사항을 앞뒤로 복제하는 것을 방지 할 수 있습니다. 트랜잭션 및 변경 사항도 원점에 대한 정보를 제공하지만이 콜백을 통한 필터링은 더욱 효율적입니다.

48.6.4.8. 일반 메시지 콜백

선택 사항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크기.

출력 플러그인이 흥미롭게 간주되는 접두사가 독특하다는 것을 확인하기 위해 추가주의를 기울여야합니다. 확장자 이름 또는 출력 플러그인 자체를 사용하는 것은 종종 좋은 선택입니다.

48.6.5. 토토 캔 생성 기능

실제로 토토 캔을 생성하려면 토토 캔 플러그인이에 데이터를 쓸 수 있습니다.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);

수정 제출

문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면