[英]postgresql: does logical replication include rollback transaction?
邏輯復制是否以事務單位解析WAL文件? 回滾事務怎么樣?
而且,什么是API可以在接收方進行數據更改而又不以SQL級別重放數據? 就像postgresql的內置流復制接收器一樣,無論是邏輯上還是物理上。
編輯 :
讓我進一步澄清我的問題。
邏輯流流如下所示:
postgresql實例(發送方,使用特定的輸出插件創建插槽)-------流協議----------> postgresql實例(接收方,獲取復制數據)
這里,復制數據的格式由輸出插件確定,我們假設它是純文本。 然后,以直接的方式,我們可以將其視為SQL語句,並在接收方postgresql中重播它們,但這顯然效率很低。 是否有任何低級API可以導入復制數據?
我花一些時間調查源代碼,然后嘗試自己回答問題。
相關的代碼路徑和代碼段:
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;
}
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.