【GaussDB】在邏輯復制中剔除指定用戶的事務

【GaussDB】在邏輯復制中剔除指定用戶的事務

1. 需求背景

在邏輯復制中,期望對源端指定用戶的所有操作不復制到目標端。然而WAL日志中沒有用戶信息可用于過濾,因此考慮結合審計日志來實現這一需求。

2. 解決方案

2.1 配置審計日志

首先需要開啟事務號記錄和指定用戶的全量審計:

--開啟記錄事務號 
gs_guc reload -c "audit_xid_info=1"--配置指定用戶開啟全量審計
gs_guc reload -c "full_audit_users='ogadmin'"

2.2 查詢指定用戶的事務號

通過以下SQL查詢指定用戶的所有事務號:

--查詢指定用戶的所有事務號
with t as (
select case when substr(detail_info,1,3)='xid' and substr(detail_info,4,3)<>'=NA'  then regexp_replace(detail_info,'xid=(\d+),.*','\1') end as transactionid, * from gs_query_audit('19000101','30000101') where username='ogadmin' )select * from t where transactionid is not null;

查詢結果示例:

transactionidtimetyperesultuseridusernamedatabaseclient_conninfoobject_namedetail_infonode_namethread_idlocal_portremote_port
9285062025-06-26 13:34:22.000 +0800ddl_tableok16728ogadminpostgresgsql@[local]t7xid=928506, create table t7(a int);primary140316575266560@8042312624752037456null
9288102025-06-26 13:40:41.000 +0800ddl_schemaok16728ogadminpostgresgsql@[local]s2xid=928810, create schema s2;primary140316575266560@8042316410791307456null
9290012025-06-26 13:44:46.000 +0800dml_actionok16728ogadminpostgresgsql@[local]t7xid=929001, insert into t7 values (1);primary140316575266560@8042318866633567456null

2.3 審計日志事務號提取問題分析

GaussDB的ADM_AUDIT_TRAIL視圖中已嘗試截取出事務號,但該視圖的SQL存在問題:

CASEWHEN "position"(a.detail_info, 'xid = NA'::text) = 1 AND "position"(a.detail_info, 'xid'::text) = 1 THEN NULL::textELSE substr(a.detail_info, "position"(a.detail_info, '='::text) + 1, "position"(a.detail_info, ','::text) - "position"(a.detail_info, '='::text) - 1)
END AS transactionid

主要問題:

  1. 實際日志中是xid=NA而非xid = NA,導致第一段條件永遠無法匹配
  2. 當detail_info中存在其他=號時(如配置guc參數),會錯誤截取非事務號內容(如'bind_procedure_searchpath

因此需要自行從原始detail_info中截取事務號。

3. 方案實施挑戰

3.1 關鍵問題分析

實施此方案需要解決以下核心問題:

  1. 審計日志完整性:如何確保審計日志記錄是完整的?
  2. 邏輯嵌入:如何將剔除事務的邏輯嵌入到原有的邏輯復制程序中去?
  3. 操作順序:如何確保各項操作的先后順序?
  4. 資源消耗:如何減少重復查詢審計日志的資源消耗(可否直接基于操作系統的存儲接口去監控審計日志文件的變化)?

4. 替代方案:基于事務標簽的過濾機制

PostgreSQL在雙向復制中,通過在事務上標記名稱來區分源端事務,防止循環復制,GaussDB同樣具有此能力:

gaussdb 已移除pg_recvlogical二進制程序,僅保留了相關接口,為測試方便,這里實際是使用MogDB測試的
# 服務端
--創建一個復制槽
pg_recvlogical -d postgres -S test_slot --create--創建復制源標簽
select pg_replication_origin_create('maintain_node');# 采集端
--開啟流式解碼
pg_recvlogical -d postgres -S test_slot --start -v -f -## sql執行客戶端
--執行一些SQL,采集端可以捕獲到數據--綁定當前會話標簽
select pg_replication_origin_session_setup ('maintain_node');---執行一些SQL,采集端沒有捕獲到數據--解綁當前會話標簽
select pg_replication_origin_session_reset ();--執行一些SQL,采集端可以捕獲到數據# 環境清理
pg_recvlogical -d postgres -S test_slot --drop
select pg_replication_origin_drop('maintain_node');

原理:邏輯復制輸出插件(如pgoutput、pg_recvlogical或test_decoding)默認會忽略攜帶復制源標簽的事務,因為這些事務被視為"已同步過的數據",避免重復復制。

可以通過創建登錄事件觸發器,針對指定用戶的登錄自動打上復制源標簽,從而實現指定的用戶事務不復制。

5. 推薦方案:歷史表歸檔策略

我個人不認為數據復制軟件是用來處理這種歸檔操作的。比較通用的方式是:

  1. 源庫對需要歸檔的表,在當前庫建立歷史表
  2. 歸檔時將需要歸檔的數據插入到歷史表,然后刪除當前表已歸檔的數據
  3. 對于歷史表的修改操作(一般只有運維delete或truncate),配置同步規則,不進行數據刪除的同步
  4. 可新建一個schema存放歷史表,便于在復制軟件中進行規則配置
  5. 復制軟件針對歷史表進行增量復制,對于實時表進行全量復制(其實這是ETL該干的事了)

雖然插入歷史表會產生額外IO,可能使數據歸檔操作時間翻倍,但相比剔除事務不同步的方式,歷史表方式更加安全,避免剔除事務時遺漏某些關鍵事務。

6.總結

本文探討了在GaussDB中實現指定用戶操作不復制到目標端的三種方案:

  1. 基于審計日志的事務過濾
    審計日志方案通過提取事務號實現過濾,但面臨審計日志完整性、邏輯嵌入復雜性、操作順序保證和資源消耗等挑戰。雖然技術上可行,但實施復雜度較高,且存在事務遺漏風險。
  2. 基于邏輯復制標簽的過濾
    基于邏輯復制標簽實現過濾,技術上可行,但打標簽這個附加操作需要在執行sql前執行(除非使用觸發器,但觸發器屬于高風險操作,不建議使用),如果漏執行,將會存在錯誤覆蓋目標庫的風險。
  3. 基于歷史表的歸檔策略
    歷史表歸檔方案通過在源庫建立歷史表存儲歸檔數據,配置復制規則排除歷史表的刪除操作,雖然會增加IO開銷,但實現簡單、安全性高,避免了事務過濾可能帶來的風險。

推薦實踐:采用歷史表歸檔策略,新建獨立schema存放歷史表,便于復制規則配置。這種方法既滿足了數據歸檔需求,又保證了復制數據的安全性和一致性,是更可靠的長期解決方案。

  • 本文作者: DarkAthena
  • 本文鏈接: https://www.darkathena.top/archives/GaussDB-Filtering-Out-Specified-User-s-Transactions-in-Logical-Replication
  • 版權聲明: 本博客所有文章除特別聲明外,均采用CC BY-NC-SA 3.0 許可協議。轉載請注明出處

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920599.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920599.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920599.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C/C++---預定義常量

在C/C開發中&#xff0c;預定義常量是編譯器與標準庫提供的“隱形工具集”&#xff0c;無需開發者顯式定義&#xff0c;卻在跨平臺兼容、調試定位、數值計算安全等場景中發揮核心作用。這些常量涵蓋編譯環境標識、語言標準判斷、代碼定位信息、數值邊界限制等多個維度&#xff…

嵌入式學習筆記--LINUX系統編程--DAY03進程控制

1.進程概述進程和程序的區別程序&#xff1a;程序是存儲在存儲介質上的一個可執行文件---靜態的進程&#xff1a;進程是程序的執行實例。可以說進程就是正在執行的程序。程序是一些指令的集合&#xff0c;而進程是程序的執行過程&#xff0c;這個過程的狀態是變化的&#xff0c…

【90頁PPT】新能源汽車數字化轉型SAP解決方案(附下載方式)

篇幅所限&#xff0c;本文只提供部分資料內容&#xff0c;完整資料請看下面鏈接 https://download.csdn.net/download/2501_92808859/91777751 資料解讀&#xff1a;《新能源汽車數字化轉型SAP解決方案》 ??詳細資料請看本解讀文章的最后內容?? 在全球汽車產業加速向電…

LSM6DS3姿態芯片和LIS2MD磁力計芯片數據讀取(stm32)

上代碼main.c 代碼示例#include "lsm6ds3.h" #include "lis2md.h"int16_t Acc[3] {0}, GYO[3] {0},Mag[3] {0};int main(void) {I2C_GPIO_Config(); //配置IIC使用端口Delayms(500); //延時Lsm6ds3_Init( ); …

數據傳輸安全-IKE工作過程

在前面的課程中&#xff0c;你已經掌握了&#xff1a;IPSec的目標&#xff1a;提供機密性、完整性、身份認證、防重放。IPSec的執行者&#xff1a;AH和ESP協議。IPSec的規則手冊&#xff1a;SA&#xff08;安全關聯&#xff09;&#xff0c;包含了所有保護參數&#xff08;算法…

翻譯-同位協同克里金算法

同點協同克里金法 副標題: 地統計學課程 主要內容: 同點協同克里金法 摘要 同點協同克里金法是一種多元地統計學技術,用于借助次要變量(協變量)來估算主要變量。本課程介紹了同點協同克里金法,并將其與簡單克里金法和簡單協同克里金法進行了比較。通過一個假設的案例…

國家統計局數據分析01——機器學習

我們前面爬取過國家統計局數據爬取——機器學習-CSDN博客的數據,我們接下來就對爬取的數據進行分析。 這是一個完整的數據分析代碼,主要用于加載、清洗和探索政府統計數據。讓我為你詳細解釋每個部分: 1. 導入必要的庫 import pandas as pd # 數據處理和分析的核心庫 imp…

【雜談】-混沌理論能否賦予機器差異化思考能力?

混沌理論能否賦予機器差異化思考能力&#xff1f; 文章目錄混沌理論能否賦予機器差異化思考能力&#xff1f;1、AI與結構化思維的本質特征2、人類思維的獨特優勢3、混沌算法的創新實踐4、混沌算法的作用機理5、混沌算法的應用實例5.1 音樂創作革新5.2 圖像生成突破5.3 科學發現…

jQuery.print插件:網頁內容打印與導出指南

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;在網頁開發中&#xff0c;為了實現內容的打印或導出&#xff0c;可以利用jQuery.print插件&#xff0c;該插件提供了一個簡易的解決方案&#xff0c;尤其適用于表格數據。本指南詳細介紹了如何使用jQuery.print…

w嵌入式分享合集125

自己的原文哦~ https://blog.51cto.com/whaosoft/14165530 一、常用電路基礎公式 1.歐姆定律計算 計算電阻電路中電流、電壓、電阻和功率之間的關系。 歐姆定律解釋了電壓、電流和電阻之間的關系&#xff0c;即通過導體兩點間的電流與這兩點間的電勢差成正比。說…

Docker 核心技術:Union File System

大家好&#xff0c;我是費益洲。UnionFS 作為 Docker 的技術核心之一&#xff0c;實現了 Docker 鏡像的分層輕量化構建、容器資源的隔離復用等目的。本文將從核心原理、主流技術實現簡單介紹 UnionFS。 核心原理 Linux 的聯合文件系統&#xff08;Union File System&#xff0c…

MongoDB 文檔模型設計:JSON 結構的靈活性與陷阱

MongoDB 文檔模型設計&#xff1a;JSON 結構的靈活性與陷阱第一章&#xff1a;MongoDB 文檔模型基礎與核心特性1.1 MongoDB 文檔模型的哲學基礎1.2 文檔模型的優勢分析1.3 與關系型數據庫的深度對比第二章&#xff1a;文檔設計模式與最佳實踐2.1 嵌入式模式&#xff08;Embeddi…

基于SQL大型數據庫的智能問答系統優化

一、食用指南 基于SQL數據庫的智能問答系統設計與實現介紹了在數據庫中創建表格數據問答系統的基本方法&#xff0c;我們可以向該系統提出關于數據庫數據的問題&#xff0c;最終獲得自然語言答案。 為了針對數據庫編寫有效的查詢&#xff0c;我們需要向模型提供表名、表結構和…

【計算機網絡】前端基礎知識Cookie、localStorage、sessionStorage 以及 Token

一、先搞懂&#xff1a;為什么需要這些“存儲工具”&#xff1f; 網頁是“無狀態”的——比如你登錄一個網站&#xff0c;瀏覽器和服務器每次通信都是獨立的&#xff0c;服務器默認記不住你是誰。為了讓服務器“記住”用戶狀態&#xff08;比如登錄狀態、購物車內容&#xff09…

【語法】【C+V】【mermaid】本身常用圖表類型用法快查【CSDN不支持,VSCODE可用】

文章目錄 Mermaid 簡介Mermaid 由三部分組成Mermaid 的使用方法復雜圖表結構的技巧餅圖簡介餅圖語法餅圖示例雷達圖簡介雷達圖語法雷達圖語法細節標題軸曲線選項 雷達圖示例時間線簡介時間線語法時間線示例樹形圖簡介樹形圖語法樹形圖示例數據包圖簡介數據包圖語法1&#xff1a…

不止效率工具:AI 在文化創作中如何重構 “靈感邏輯”?

一、引言1.1 AI 創作的崛起在當今時代&#xff0c;AI 技術在文化創作領域的迅猛發展已成為不可忽視的現象。從文字創作領域中&#xff0c;AI 能夠快速生成小說、詩歌&#xff0c;一些新聞媒體也開始運用 AI 撰寫新聞稿件&#xff1b;到視覺藝術方面&#xff0c;AI 繪畫軟件能依…

軟考-系統架構設計師 專家系統(ES)詳細講解

個人博客&#xff1a;blogs.wurp.top 一、ES的核心概念與價值 1. 什么是專家系統&#xff08;ES&#xff09;&#xff1f; 專家系統是一種模擬人類專家解決特定領域問題的智能計算機程序系統。它運用特定領域內大量專家水平的知識和經驗&#xff0c;進行推理和判斷&#xff…

Vue3+TS+Element-Plus+el-tree創建樹節點

1、一級樹應用效果&#xff1a;代碼&#xff1a;MaterialCategory.vue<script setup lang"ts" name"MaterialCategory"> ...... // 創建樹&#xff08;一級樹&#xff09; const createTree (dataList: IMaterialCategory[]) > {// 將原始數據轉…

C++基礎(④鏈表反轉(鏈表 + 迭代 / 遞歸))

鏈表反轉&#xff08;鏈表 迭代 / 遞歸&#xff09; 題目描述&#xff1a;給你單鏈表的頭節點 head&#xff0c;請你反轉鏈表&#xff0c;并返回反轉后的鏈表頭節點。 示例&#xff1a;輸入鏈表 1→2→3→4→5 → 輸出 5→4→3→2→1。 思路提示&#xff1a;迭代法&#xff1a…

面向企業級產品開發的自動化腳本實戰

引言&#xff1a; 在產品開發團隊中&#xff0c;設計師、產品經理和工程師之間的協作常常伴隨著大量重復性工作&#xff1a;手動整理設計稿鏈接、更新產品需求文檔、同步項目狀態...這些工作不僅耗時&#xff0c;還容易出錯。本文將帶你編寫一個Python腳本&#xff0c;自動化這…