簡體   English   中英

PostgreSQL:邏輯復制是否包括回滾事務?

[英]postgresql: does logical replication include rollback transaction?

邏輯復制是否以事務單位解析WAL文件? 回滾事務怎么樣?

而且,什么是API可以在接收方進行數據更改而又不以SQL級別重放數據? 就像postgresql的內置流復制接收器一樣,無論是邏輯上還是物理上。

編輯

讓我進一步澄清我的問題。

邏輯流流如下所示:

postgresql實例(發送方,使用特定的輸出插件創建插槽)-------流協議----------> postgresql實例(接收方,獲取復制數據)

這里,復制數據的格式由輸出插件確定,我們假設它是純文本。 然后,以直接的方式,我們可以將其視為SQL語句,並在接收方postgresql中重播它們,但這顯然效率很低。 是否有任何低級API可以導入復制數據?

我花一些時間調查源代碼,然后嘗試自己回答問題。

  • PostgreSQL walsender僅包含已提交的事務,而忽略中止的事務。

相關的代碼路徑和代碼段:

pg_logical_slot_get_changes_guts() -> LogicalDecodingProcessRecord() -> DecodeXactOp() -> 
ReorderBufferCommit() -> ReorderBufferIterTXNNext()

DecodeXactOp():

switch (info)
{
    case XLOG_XACT_COMMIT:
    case XLOG_XACT_COMMIT_PREPARED:
        {
            xl_xact_commit *xlrec;
            xl_xact_parsed_commit parsed;
            TransactionId xid;

            xlrec = (xl_xact_commit *) XLogRecGetData(r);
            ParseCommitRecord(XLogRecGetInfo(buf->record), xlrec, &parsed);

            if (!TransactionIdIsValid(parsed.twophase_xid))
                xid = XLogRecGetXid(r);
            else
                xid = parsed.twophase_xid;

            DecodeCommit(ctx, buf, &parsed, xid);
            break;
        }
  • 內置的邏輯應用工作程序不會重播SQL,而是使用許多內部API在接收方應用更改。

https://github.com/postgres/postgres/blob/master/src/backend/replication/logical/worker.c#L585

/* Input functions may need an active snapshot, so get one */
PushActiveSnapshot(GetTransactionSnapshot());

/* Process and store remote tuple in the slot */
oldctx = MemoryContextSwitchTo(GetPerTupleMemoryContext(estate));
slot_store_cstrings(remoteslot, rel, newtup.values);
slot_fill_defaults(rel, estate, remoteslot);
MemoryContextSwitchTo(oldctx);

ExecOpenIndices(estate->es_result_relation_info, false);

/* Do the insert. */
ExecSimpleRelationInsert(estate, remoteslot);

/* Cleanup. */
ExecCloseIndices(estate->es_result_relation_info);
PopActiveSnapshot();

PG10的邏輯復制使用pgoutput作為輸出插件,該插件為二進制格式,適合直接輸入數據。

https://github.com/postgres/postgres/blob/master/src/backend/replication/pgoutput/pgoutput.c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM