이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 47.6. 논리적 디코딩 토토 사이트 순위 플러그인버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

48.6. 논리적 디코딩 출력 플러그인

출력 플러그인의 예는 다음에서 찾을 수 있습니다.contrib/test_decodi젠 토토PostgreSQL 소스 트리의 하위 디렉터리.

48.6.1. 초기화 기능

출력 플러그인은 출력 플러그인 이름을 라이브러리 기본 이름으로 사용하여 공유 라이브러리를 동적으로 로드하여 로드됩니다. 일반 라이브러리 검색 경로는 라이브러리를 찾는 데 사용됩니다. 필요한 출력 플러그인 콜백을 제공하고 라이브러리가 실제로 출력 플러그인임을 나타내려면 다음과 같은 함수를 제공해야 합니다._PG_output_plugin_init. 이 함수에는 개별 작업에 대한 콜백 함수 포인터로 채워져야 하는 구조체가 전달됩니다.

typedef 구조체 OutputPluginCallbacks

    LogicalDecodeStartupCB 시작_cb;
    LogicalDecodeBeginCB start_cb;
    LogicalDecodeCha젠 토토eCBcha젠 토토e_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);

begin_cb, cha젠 토토e_cb그리고commit_cb콜백이 필요하지만startup_cb, filter_by_origin_cb, truncate_cbshutdown_cb선택사항입니다. 만일truncate_cb설정되지 않았지만 a잘라내기디코드되어야 하며 작업은 무시됩니다.

48.6.2. 기능

디코딩, 형식 지정 및 출력 변경을 위해 출력 플러그인은 출력 기능 호출을 포함하여 백엔드의 일반 인프라 대부분을 사용할 수 있습니다. 다음 중 하나에 의해 생성된 관계에만 액세스하는 한 관계에 대한 읽기 전용 액세스가 허용됩니다.initdb에서pg_catalog스키마 또는 다음을 사용하여 사용자 제공 카탈로그 테이블로 표시되었습니다.

ALTER TABLE user_catalog_table SET (user_catalog_table = true);
CREATE TABLE another_catalog_table(데이터 텍스트) WITH (user_catalog_table = true);

거래 ID 할당으로 이어지는 모든 행위는 금지됩니다. 여기에는 테이블 쓰기, DDL 변경 수행, 호출 등이 포함됩니다.txid_current().

48.6.3. 출력 모드

출력 플러그인 콜백은 거의 임의의 형식으로 소비자에게 데이터를 전달할 수 있습니다. SQL을 통해 변경 사항을 보는 것과 같은 일부 사용 사례에서는 임의의 데이터를 포함할 수 있는 데이터 유형으로 데이터를 반환합니다(예:바이테아)은 번거롭습니다. 출력 플러그인이 서버의 인코딩으로 텍스트 데이터만 출력하는 경우 다음 설정을 통해 선언할 수 있습니다.OutputPluginOptions.output_typeOUTPUT_PLUGIN_TEXTUAL_OUTPUT대신에OUTPUT_PLUGIN_BINARY_OUTPUT에서시작 콜백. 이 경우 모든 데이터는 서버의 인코딩에 있어야 합니다.텍스트데이텀이 이를 포함할 수 있습니다. 이는 어설션 지원 빌드에서 확인됩니다.

48.6.4. 출력 플러그인 콜백

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

동시 트랜잭션은 커밋 순서에 따라 디코딩되며 특정 트랜잭션에 속하는 변경 사항만 다음 사이에 디코딩됩니다.시작그리고커밋콜백. 명시적으로 또는 암시적으로 롤백된 트랜잭션은 절대로 디코딩되지 않습니다. 성공적인 저장점은 해당 트랜잭션 내에서 실행된 순서대로 이를 포함하는 트랜잭션에 포함됩니다.

참고

이미 안전하게 디스크에 플러시된 트랜잭션만 디코딩됩니다. 이는 다음과 같은 상황으로 이어질 수 있습니다.커밋바로 다음에서 즉시 디코딩되지 않음pg_logical_slot_get_cha젠 토토es()언제동기_커밋다음으로 설정됨꺼짐.

48.6.4.1. 시작 콜백

선택사항startup_cb복제 슬롯이 생성되거나 내보낼 준비가 된 변경 사항 수에 관계없이 변경 사항 스트리밍을 요청할 때마다 콜백이 호출됩니다.

typedef void (*LogicalDecodeStartupCB) (struct LogicalDecodi젠 토토Context *ctx,
                                        OutputPluginOptions *옵션,
                                        부울 is_init);

is_init복제 슬롯이 생성되는 동안 매개변수는 true이고 그렇지 않으면 false입니다.옵션출력 플러그인이 설정할 수 있는 옵션의 구조를 가리킵니다:

typedef 구조체 OutputPluginOptions

    OutputPluginOutputType 출력_유형;
    bool receive_rewrites;
 출력 플러그인 옵션;

출력_유형다음 중 하나로 설정되어야 합니다.OUTPUT_PLUGIN_TEXTUAL_OUTPUT또는OUTPUT_PLUGIN_BINARY_OUTPUT. 또한 참조하세요섹션 48.6.3. 만일receive_rewrites이 true이면 특정 DDL 작업 중 힙 재작성으로 인한 변경 사항에 대해서도 출력 플러그인이 호출됩니다. 이는 DDL 복제를 처리하는 플러그인에 관심이 있지만 특별한 처리가 필요합니다.

시작 콜백은 다음에 있는 옵션을 검증해야 합니다.ctx-output_plugin_options. 출력 플러그인에 상태가 필요한 경우 다음을 사용할 수 있습니다.ctx-output_plugin_private저장합니다.

48.6.4.2. 종료 콜백

선택사항shutdown_cb콜백은 이전에 활성화된 복제 슬롯이 더 이상 사용되지 않을 때마다 호출되며 출력 플러그인에 비공개 리소스를 할당 해제하는 데 사용될 수 있습니다. 슬롯이 반드시 삭제되는 것은 아니며 스트리밍이 중지되는 것뿐입니다.

typedef void (*LogicalDecodeShutdownCB) (struct LogicalDecodi젠 토토Context *ctx);

48.6.4.3. 거래 시작 콜백

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

typedef void (*LogicalDecodeBeginCB) (struct LogicalDecodi젠 토토Context *ctx,
                                      ReorderBufferTXN *txn);

txn매개변수에는 커밋된 타임스탬프 및 XID와 같은 트랜잭션에 대한 메타 정보가 포함됩니다.

48.6.4.4. 거래 종료 콜백

필수commit_cb콜백은 트랜잭션 커밋이 디코딩될 때마다 호출됩니다.cha젠 토토e_cb수정된 행이 있는 경우 모든 수정된 행에 대한 콜백이 이 전에 호출됩니다.

typedef void (*LogicalDecodeCommitCB) (struct LogicalDecodingContext *ctx,
                                       ReorderBufferTXN *txn,
                                       XLogRecPtr commit_lsn);

48.6.4.5. 콜백 변경

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

typedef void (*LogicalDecodeChangeCB) (struct LogicalDecodingContext *ctx,
                                       ReorderBufferTXN *txn,
                                       관계 관계,
                                       ReorderBufferChange *변경);

ctx그리고txn매개변수의 내용은 다음과 같습니다.begin_cb그리고commit_cb콜백, 추가로 관계 설명자관계행이 속한 관계와 구조체를 가리킴변경행 수정 설명이 전달되었습니다.

참고

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

48.6.4.6. 콜백 자르기

truncate_cb콜백이 호출됩니다.잘라내기명령.

typedef void (*LogicalDecodeTruncateCB) (struct LogicalDecodingContext *ctx,
                                         ReorderBufferTXN *txn,
                                         정수 관계,
                                         관계관계[],
                                         ReorderBufferChange *변경);

매개변수는 다음과 유사합니다.cha젠 토토e_cb콜백. 그러나 왜냐하면잘라내기외래 키로 연결된 테이블에 대한 작업은 함께 실행되어야 하며, 이 콜백은 단일 관계 대신 관계 배열을 수신합니다. 설명을 참조하세요.잘라내기자세한 내용은 성명을 참조하세요.

48.6.4.7. 오리진 필터 콜백

선택사항filter_by_origin_cb데이터가 재생되었는지 여부를 확인하기 위해 콜백이 호출됩니다.origin_id출력 플러그인에 관심이 있습니다.

typedef bool (*LogicalDecodeFilterByOriginCB) (struct LogicalDecodingContext *ctx,
                                               RepOriginId Origin_id);

ctx매개변수는 다른 콜백과 동일한 내용을 갖습니다. 정보는 없으나 원산지는 알 수 있습니다. 전달된 노드에서 발생한 변경 사항이 관련이 없다는 신호를 보내려면 true를 반환하여 해당 변경 사항이 필터링되도록 합니다. 그렇지 않으면 거짓입니다. 필터링된 트랜잭션 및 변경 사항에 대해서는 다른 콜백이 호출되지 않습니다.

이는 계단식 또는 다방향 복제 솔루션을 구현할 때 유용합니다. 원본을 기준으로 필터링하면 이러한 설정에서 동일한 변경 사항이 앞뒤로 복제되는 것을 방지할 수 있습니다. 트랜잭션과 변경 사항도 출처에 대한 정보를 전달하지만 이 콜백을 통한 필터링은 눈에 띄게 더 효율적입니다.

48.6.4.8. 일반 메시지 콜백

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

출력 플러그인이 관심 있다고 간주하는 접두사가 고유한지 확인하기 위해 특별한 주의를 기울여야 합니다. 확장 프로그램 이름이나 출력 플러그인 자체를 사용하는 것이 좋은 선택인 경우가 많습니다.

48.6.5. 출력 생성을 위한 함수

실제로 출력을 생성하기 위해 출력 플러그인은 다음에 데이터를 쓸 수 있습니다.문자열정보출력 버퍼 입력ctx-아웃내부에 있을 때begin_cb, commit_cb또는cha젠 토토e_cb콜백. 출력 버퍼에 쓰기 전에,OutputPluginPrepareWrite(ctx, last_write)호출되어야 하며, 버퍼에 쓰기를 마친 후,OutputPluginWrite(ctx, last_write)26921_26967last_write특정 쓰기가 콜백의 마지막 쓰기인지 여부를 나타냅니다.

다음 예는 출력 플러그인 소비자에게 데이터를 출력하는 방법을 보여줍니다.

OutputPluginPrepareWrite(ctx, true);
AppendStringInfo(ctx-out, "BEGIN %u", txn-xid);
OutputPluginWrite(ctx, true);