출력 플러그인의 예는 다음에서 찾을 수 있습니다.contrib/test_decodingPostgreSQL 소스 트리의 하위 디렉터리.
출력 플러그인은 출력 플러그인 이름을 라이브러리 기본 이름으로 사용하여 공유 라이브러리를 동적으로 로드하여 로드됩니다. 일반 라이브러리 검색 경로는 라이브러리를 찾는 데 사용됩니다. 필요한 출력 플러그인 콜백을 제공하고 라이브러리가 실제로 출력 플러그인임을 나타내려면 다음과 같은 함수를 제공해야 합니다._PG_output_plugin_init. 이 함수에는 개별 작업에 대한 콜백 함수 포인터로 채워져야 하는 구조체가 전달됩니다.
typedef 구조체 OutputPluginCallbacks
LogicalDecodeStartupCB 시작_cb;
LogicalDecodeBeginCB start_cb;
LogicalDecodeChangeCBchange_cb;
LogicalDecodeTruncateCB truncate_cb;
LogicalDecodeCommitCB commit_cb;
LogicalDecodeMessageCB message_cb;
LogicalDecodeFilterByOriginCB filter_by_origin_cb;
LogicalDecodeShutdownCB shutdown_cb;
LogicalDecodeFilterPrepareCB filter_prepare_cb;
LogicalDecodeBeginPrepareCB start_prepare_cb;
LogicalDecodePrepareCB prepare_cb;
LogicalDecodeCommitPreparedCB commit_prepared_cb;
LogicalDecodeRollbackPreparedCB Rollback_prepared_cb;
LogicalDecodeStreamStartCB stream_start_cb;
LogicalDecodeStreamStopCB stream_stop_cb;
LogicalDecodeStreamAbortCB stream_abort_cb;
LogicalDecodeStreamPrepareCB stream_prepare_cb;
LogicalDecodeStreamCommitCB stream_commit_cb;
LogicalDecodeStreamChangeCB stream_change_cb;
LogicalDecodeStreamMessageCB stream_message_cb;
LogicalDecodeStreamTruncateCB stream_truncate_cb;
OutputPluginCallbacks;
typedef void (*LogicalOutputPluginInit) (struct OutputPluginCallbacks *cb);
그begin_cb, change_cb그리고commit_cb콜백이 필요하지만startup_cb, truncate_cb, message_cb, filter_by_origin_cb및shutdown_cb선택사항입니다. 만일truncate_cb설정되지 않았지만 a잘라내기디코딩되어야 하며 작업은 무시됩니다.
출력 플러그인은 진행 중인 대규모 트랜잭션의 스트리밍을 지원하는 기능을 정의할 수도 있습니다.stream_start_cb, stream_stop_cb, stream_abort_cb, stream_commit_cb그리고stream_change_cb필수입니다. 반면stream_message_cb그리고stream_truncate_cb선택사항입니다.stream_prepare_cb출력 플러그인이 2단계 커밋도 지원하는 경우에도 필요합니다.
출력 플러그인은 2단계 커밋을 지원하는 기능을 정의할 수도 있습니다. 이를 통해 작업이 디코딩될 수 있습니다.거래 준비.begin_prepare_cb, prepare_cb, commit_prepared_cb그리고rollback_prepared_cb콜백이 필요하지만filter_prepare_cb선택사항입니다.stream_prepare_cb출력 플러그인이 진행 중인 대규모 트랜잭션의 스트리밍도 지원하는 경우에도 필요합니다.
디코딩, 형식화 및 출력 변경을 위해 출력 플러그인은 출력 기능 호출을 포함하여 백엔드의 일반 인프라 대부분을 사용할 수 있습니다. 다음 중 하나에 의해 생성된 관계에만 액세스하는 한 관계에 대한 읽기 전용 액세스가 허용됩니다.initdb에서pg_catalog스키마 또는 다음을 사용하여 사용자 제공 카탈로그 테이블로 표시되었습니다.
ALTER TABLE user_catalog_table SET (user_catalog_table = true); CREATE TABLE another_catalog_table(데이터 텍스트) WITH (user_catalog_table = true);
출력 플러그인의 사용자 카탈로그 테이블 또는 일반 시스템 카탈로그 테이블에 대한 액세스는 다음을 통해 수행되어야 합니다.systable_*API만 스캔합니다. 다음을 통해 액세스합니다.힙_*스캔 API에 오류가 발생합니다. 또한 거래 ID 할당으로 이어지는 모든 행위는 금지됩니다. 여기에는 테이블 쓰기, DDL 변경 수행, 호출 등이 포함됩니다.pg_current_xact_id().
출력 플러그인 콜백은 거의 임의의 형식으로 소비자에게 데이터를 전달할 수 있습니다. SQL을 통해 변경 사항을 보는 것과 같은 일부 사용 사례에서는 임의의 데이터를 포함할 수 있는 데이터 유형으로 데이터를 반환합니다(예:바이테아)은 번거롭습니다. 출력 플러그인이 서버의 인코딩으로 텍스트 데이터만 출력하는 경우 다음 설정을 통해 선언할 수 있습니다.OutputPluginOptions.output_type에OUTPUT_PLUGIN_TEXTUAL_OUTPUT대신OUTPUT_PLUGIN_BINARY_OUTPUT에서시작 콜백. 이 경우 모든 데이터는 서버의 인코딩에 있어야 합니다.텍스트데이텀이 이를 포함할 수 있습니다. 이는 어설션 지원 빌드에서 확인됩니다.
토토 사이트 순위 플러그인은 제공해야 하는 다양한 콜백을 통해 발생하는 변경 사항에 대한 알림을 받습니다.
동시 트랜잭션은 커밋 순서대로 디코딩되며, 특정 트랜잭션에 속한 변경 사항만 디코딩됩니다.시작그리고커밋콜백. 명시적으로 또는 암시적으로 롤백된 트랜잭션은 절대로 디코딩되지 않습니다. 성공적인 저장점은 해당 트랜잭션 내에서 실행된 순서대로 이를 포함하는 트랜잭션에 포함됩니다. 다음을 사용하여 2단계 커밋을 준비하는 트랜잭션입니다.거래 준비디코딩에 필요한 출력 플러그인 콜백이 제공되는 경우에도 디코딩됩니다. 현재 디코딩되고 있는 준비된 트랜잭션이 다음을 통해 동시에 중단될 수 있습니다.롤백 준비됨명령. 이 경우 이 트랜잭션의 논리적 디코딩도 중단됩니다. 중단이 감지되면 해당 트랜잭션의 모든 변경 사항을 건너뛰고prepare_cb콜백이 호출됩니다. 따라서 동시 중단이 발생하더라도 적절하게 처리할 수 있도록 출력 플러그인에 충분한 정보가 제공됩니다.롤백 준비됨디코딩되면.
이미 디스크에 안전하게 플러시된 트랜잭션만 디코딩됩니다. 이는 다음과 같은 상황으로 이어질 수 있습니다.커밋바로 다음에서 즉시 디코딩되지 않음pg_logical_slot_get_changes()언제동기_커밋다음으로 설정됨꺼짐.
선택사항startup_cb복제 슬롯이 생성되거나 내보낼 준비가 된 변경 사항 수에 관계없이 변경 사항 스트리밍을 요청할 때마다 콜백이 호출됩니다.
typedef void (*LogicalDecodeStartupCB) (struct LogicalDecodingContext *ctx,
OutputPluginOptions *옵션,
부울 is_init);
그is_init복제 슬롯이 생성될 때 매개변수는 true이고 그렇지 않으면 false입니다.옵션출력 플러그인이 설정할 수 있는 옵션의 구조를 가리킵니다:
typedef 구조체 OutputPluginOptions
OutputPluginOutputType 토토 사이트 순위_유형;
bool receive_rewrites;
출력 플러그인 옵션;
토토 사이트 순위_유형다음 중 하나로 설정되어야 합니다.OUTPUT_PLUGIN_TEXTUAL_OUTPUT또는OUTPUT_PLUGIN_BINARY_OUTPUT. 또한 참조하세요섹션 47.6.3. 만일receive_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,
ReorderBufferTXN *txn);
그txn매개변수에는 커밋된 타임스탬프 및 XID와 같은 트랜잭션에 대한 메타 정보가 포함됩니다.
필수commit_cb콜백은 트랜잭션 커밋이 디코딩될 때마다 호출됩니다.change_cb수정된 행이 있는 경우 모든 수정된 행에 대한 콜백이 이 전에 호출됩니다.
typedef void (*LogicalDecodeCommitCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
XLogRecPtr commit_lsn);
필수change_cb콜백은 트랜잭션 내부의 모든 개별 행 수정에 대해 호출됩니다.삽입, 업데이트, 또는삭제. 원래 명령이 한 번에 여러 행을 수정했더라도 콜백은 각 행에 대해 개별적으로 호출됩니다.change_cb콜백은 행 수정 세부정보를 출력하는 과정을 돕기 위해 시스템 또는 사용자 카탈로그 테이블에 액세스할 수 있습니다. 준비되었지만 아직 커밋되지 않은 트랜잭션을 디코딩하거나 커밋되지 않은 트랜잭션을 디코딩하는 경우 동일한 트랜잭션의 동시 롤백으로 인해 이 변경 콜백이 오류가 발생할 수도 있습니다. 이 경우 중단된 트랜잭션의 논리적 디코딩이 정상적으로 중지됩니다.
typedef void (*LogicalDecodeChangeCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
관계 관계,
ReorderBufferChange *변경);
그ctx그리고txn매개변수의 내용은 다음과 같습니다.begin_cb그리고commit_cb콜백, 추가로 관계 설명자관계행이 속한 관계와 구조체를 가리킴변경행 수정을 설명하는 내용이 전달되었습니다.
선택사항truncate_cb콜백이 호출됩니다.잘라내기명령.
typedef void (*LogicalDecodeTruncateCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
정수 관계,
관계관계[],
ReorderBufferChange *변경);
매개변수는 다음과 유사합니다.change_cb콜백. 그러나 왜냐하면잘라내기외래 키로 연결된 테이블에 대한 작업은 함께 실행되어야 하며, 이 콜백은 단일 관계 대신 관계 배열을 수신합니다. 설명을 참조하세요.잘라내기자세한 내용은 성명을 참조하세요.
선택사항filter_by_origin_cb데이터가 재생되었는지 여부를 확인하기 위해 콜백이 호출됩니다.origin_id토토 사이트 순위 플러그인에 관심이 있습니다.
typedef bool (*LogicalDecodeFilterByOriginCB) (struct LogicalDecodingContext *ctx,
RepOriginId Origin_id);
그ctx매개변수는 다른 콜백과 동일한 내용을 갖습니다. 정보는 없으나 원산지는 알 수 있습니다. 전달된 노드에서 발생한 변경 사항이 관련이 없다는 신호를 보내려면 true를 반환하여 해당 변경 사항이 필터링되도록 합니다. 그렇지 않으면 거짓입니다. 필터링된 트랜잭션 및 변경 사항에 대해서는 다른 콜백이 호출되지 않습니다.
이는 계단식 또는 다방향 복제 솔루션을 구현할 때 유용합니다. 원본을 기준으로 필터링하면 이러한 설정에서 동일한 변경 사항이 앞뒤로 복제되는 것을 방지할 수 있습니다. 트랜잭션과 변경 사항도 출처에 대한 정보를 전달하지만 이 콜백을 통한 필터링은 눈에 띄게 더 효율적입니다.
선택사항message_cb콜백은 논리적 디코딩 메시지가 디코딩될 때마다 호출됩니다.
typedef void (*LogicalDecodeMessageCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
XLogRecPtr message_lsn,
부울 트랜잭션,
const char *접두사,
크기 message_size,
const char *메시지);
그txn매개변수에는 커밋된 타임스탬프 및 XID와 같은 트랜잭션에 대한 메타 정보가 포함됩니다. 그러나 메시지가 비트랜잭션이고 메시지를 기록한 트랜잭션에서 XID가 아직 할당되지 않은 경우 NULL이 될 수 있습니다.lsn메시지의 WAL 위치가 있습니다.트랜잭션메시지가 트랜잭션으로 전송되었는지 여부를 나타냅니다. 변경 콜백과 유사하게, 준비된(아직 커밋되지 않은) 트랜잭션을 디코딩하거나 커밋되지 않은 트랜잭션을 디코딩하는 경우 이 메시지 콜백은 동일한 트랜잭션의 동시 롤백으로 인해 오류가 발생할 수도 있습니다. 이 경우 중단된 트랜잭션의 논리적 디코딩이 정상적으로 중지됩니다. 그만큼접두사는 현재 플러그인에 대한 흥미로운 메시지를 식별하는 데 사용할 수 있는 임의의 null 종료 접두사입니다. 그리고 마지막으로메시지매개변수에는 다음의 실제 메시지가 포함됩니다.message_size크기.
출력 플러그인이 관심 있다고 간주하는 접두사가 고유한지 확인하기 위해 특별한 주의를 기울여야 합니다. 확장 프로그램 이름이나 출력 플러그인 자체를 사용하는 것이 좋은 선택인 경우가 많습니다.
선택사항filter_prepare_cb콜백은 현재 2단계 커밋 트랜잭션의 일부인 데이터가 이 준비 단계에서 디코딩을 위해 고려되어야 하는지 또는 나중에 일반 1단계 트랜잭션으로 고려되어야 하는지 결정하기 위해 호출됩니다.커밋 준비됨시간. 디코딩을 건너뛰어야 한다는 신호를 보내려면 다음을 반환하세요.참; 거짓그렇지 않으면. 콜백이 정의되지 않은 경우거짓가정됩니다(즉, 필터링이 없으며 2단계 커밋을 사용하는 모든 트랜잭션도 2단계로 디코딩됩니다).
typedef bool (*LogicalDecodeFilterPrepareCB) (struct LogicalDecodingContext *ctx,
거래 ID xid,
const char *gid);
그ctx매개변수에는 다른 콜백과 동일한 내용이 있습니다. 매개변수xid그리고기드거래를 식별하는 두 가지 다른 방법을 제공합니다. 나중에커밋 준비됨또는롤백 준비됨두 식별자를 모두 전달하여 토토 사이트 순위 플러그인에 사용할 항목을 선택할 수 있습니다.
콜백은 디코딩을 위해 트랜잭션당 여러 번 호출될 수 있으며 주어진 쌍에 대해 동일한 정적 응답을 제공해야 합니다.xid그리고지드호출될 때마다.
필수begin_prepare_cb콜백은 준비된 트랜잭션의 시작이 디코딩될 때마다 호출됩니다.지드필드는의 일부입니다.txn매개변수는 플러그인이 이미 이를 수신했는지 확인하기 위해 이 콜백에서 사용할 수 있습니다.준비이 경우 오류가 발생하거나 트랜잭션의 나머지 변경 사항을 건너뛸 수 있습니다.
typedef void (*LogicalDecodeBeginPrepareCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn);
필수prepare_cb콜백은 2단계 커밋을 위해 준비된 트랜잭션이 디코딩될 때마다 호출됩니다.change_cb33950_34061기드필드(의 일부)txn매개변수는 이 콜백에서 사용될 수 있습니다.
typedef void (*LogicalDecodePrepareCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
XLogRecPtr prepare_lsn);
필수commit_prepared_cb트랜잭션이 발생할 때마다 콜백이 호출됩니다.커밋 준비됨디코드되었습니다.기드필드는의 일부입니다.txn매개변수는 이 콜백에서 사용될 수 있습니다.
typedef void (*LogicalDecodeCommitPreparedCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
XLogRecPtr commit_lsn);
필수rollback_prepared_cb트랜잭션이 발생할 때마다 콜백이 호출됩니다.롤백 준비됨디코드되었습니다.지드필드(의 일부)txn매개변수를 이 콜백에서 사용할 수 있습니다. 매개변수prepare_end_lsn그리고prepare_time플러그인이 이를 수신했는지 확인하는 데 사용할 수 있습니다.거래 준비이 경우 롤백을 적용할 수 있고, 그렇지 않으면 롤백 작업을 건너뛸 수 있습니다.기드다운스트림 노드가 동일한 식별자를 가진 준비된 트랜잭션을 가질 수 있으므로 단독으로는 충분하지 않습니다.
typedef void (*LogicalDecodeRollbackPreparedCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
XLogRecPtr prepare_end_lsn,
타임스탬프Tz prepare_time);
필수stream_start_cb진행 중인 트랜잭션에서 스트리밍된 변경 블록을 열 때 콜백이 호출됩니다.
typedef void (*LogicalDecodeStreamStartCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn);
필수stream_stop_cb진행 중인 트랜잭션에서 스트리밍된 변경 블록을 닫을 때 콜백이 호출됩니다.
typedef void (*LogicalDecodeStreamStopCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn);
필수stream_abort_cb이전에 스트리밍된 트랜잭션을 중단하기 위해 콜백이 호출됩니다.
typedef void (*LogicalDecodeStreamAbortCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
XLogRecPtr abort_lsn);
그stream_prepare_cb콜백은 2단계 커밋의 일부로 이전에 스트리밍된 트랜잭션을 준비하기 위해 호출됩니다. 이 콜백은 출력 플러그인이 진행 중인 대규모 트랜잭션의 스트리밍과 2단계 커밋을 모두 지원할 때 필요합니다.
typedef void (*LogicalDecodeStreamPrepareCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
XLogRecPtr prepare_lsn);
필수stream_commit_cb이전에 스트리밍된 트랜잭션을 커밋하기 위해 콜백이 호출됩니다.
typedef void (*LogicalDecodeStreamCommitCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
XLogRecPtr commit_lsn);
필수stream_change_cb스트리밍된 변경 사항 블록에서 변경 사항을 보낼 때 콜백이 호출됩니다(다음으로 구분됨).stream_start_cb그리고stream_stop_cb호출). 트랜잭션이 나중에 중단될 수 있고 중단된 트랜잭션에 대한 변경 사항은 디코딩되지 않으므로 실제 변경 사항은 표시되지 않습니다.
typedef void (*LogicalDecodeStreamChangeCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
관계 관계,
ReorderBufferChange *변경);
선택사항stream_message_cb스트리밍된 변경 블록에서 일반 메시지를 보낼 때 콜백이 호출됩니다(다음으로 구분됨).stream_start_cb그리고stream_stop_cb호출). 트랜잭션은 나중에 중단될 수 있고 중단된 트랜잭션에 대한 변경 사항은 디코딩되지 않으므로 트랜잭션 메시지의 메시지 내용은 표시되지 않습니다.
typedef void (*LogicalDecodeStreamMessageCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
XLogRecPtr message_lsn,
부울 트랜잭션,
const char *접두사,
크기 message_size,
const char *메시지);
선택사항stream_truncate_cb콜백이 다음에 대해 호출되었습니다.잘라내기스트리밍된 변경 블록의 명령(다음으로 구분됨stream_start_cb그리고stream_stop_cb호출).
typedef void (*LogicalDecodeStreamTruncateCB) (struct LogicalDecodingContext *ctx,
ReorderBufferTXN *txn,
정수 관계,
관계관계[],
ReorderBufferChange *변경);
매개변수는 다음과 유사합니다.stream_change_cb콜백. 그러나 왜냐하면잘라내기외래 키로 연결된 테이블에 대한 작업은 함께 실행되어야 하며, 이 콜백은 단일 관계 대신 관계 배열을 수신합니다. 설명을 참조하세요.잘라내기자세한 내용은 설명을 참조하세요.
실제로 출력을 생성하기 위해 출력 플러그인은 다음에 데이터를 쓸 수 있습니다.문자열정보토토 사이트 순위 버퍼 입력ctx-아웃내부에 있을 때begin_cb, commit_cb, 또는change_cb콜백. 토토 사이트 순위 버퍼에 쓰기 전에,OutputPluginPrepareWrite(ctx, last_write)호출되어야 하며, 버퍼에 쓰기를 마친 후,OutputPluginWrite(ctx, last_write)45494_45540last_write특정 쓰기가 콜백의 마지막 쓰기인지 여부를 나타냅니다.
다음 예는 출력 플러그인 소비자에게 데이터를 출력하는 방법을 보여줍니다.
OutputPluginPrepareWrite(ctx, true); AppendStringInfo(ctx-out, "BEGIN %u", txn-xid); OutputPluginWrite(ctx, true);
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.