最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PostgreSQL 流復(fù)制認(rèn)證機(jī)制詳解

 更新時(shí)間:2025年05月14日 09:41:47   作者:王清歡Randy  
物理復(fù)制作為 PostgreSQL 高可用架構(gòu)的核心技術(shù),其安全性直接關(guān)系到數(shù)據(jù)庫集群的可靠性,本文選擇物理復(fù)制中備庫向主庫請求建立流復(fù)制連接的認(rèn)證過程,即 walreceiver 進(jìn)程連接主庫時(shí)的認(rèn)證機(jī)制,并結(jié)合源碼解析其實(shí)現(xiàn)原理,感興趣的朋友一起看看吧

物理復(fù)制(流復(fù)制 Streaming Replication )作為 PostgreSQL 高可用架構(gòu)的核心技術(shù),其安全性直接關(guān)系到數(shù)據(jù)庫集群的可靠性;本文選擇物理復(fù)制中備庫向主庫請求建立流復(fù)制連接的認(rèn)證過程,即 walreceiver 進(jìn)程連接主庫時(shí)的認(rèn)證機(jī)制,并結(jié)合源碼解析其實(shí)現(xiàn)原理

01 數(shù)據(jù)庫物理復(fù)制

如上圖所示,PostgreSQL 的主備物理復(fù)制即流復(fù)制(Streaming Replication)機(jī)制確保主庫(Primary)生成的預(yù)寫日志(WAL)能實(shí)時(shí)傳輸?shù)絺鋷欤⊿tandby)并正確應(yīng)用,從而實(shí)現(xiàn)數(shù)據(jù)的同步,其實(shí)現(xiàn)依賴于三個(gè)關(guān)鍵進(jìn)程:

  • walsender(主庫):推送 WAL 數(shù)據(jù)到備庫
  • walreceiver(備庫):接收并存儲 WAL 數(shù)據(jù)
  • startup(備庫):應(yīng)用 WAL 數(shù)據(jù)到數(shù)據(jù)庫文件

在流復(fù)制過程中,預(yù)寫日志(Write Ahead Log)即圖中的 XLOG 的生命周期如下:

  • 主庫生成 WAL:主庫執(zhí)行事務(wù)時(shí),將變更寫入 WAL 緩沖區(qū),最終持久化到 WAL 文件
  • walsender 發(fā)送 WAL:walsender 進(jìn)程從 WAL 文件或緩沖區(qū)讀取數(shù)據(jù),通過復(fù)制協(xié)議發(fā)送給備庫的 walreceiver
  • walreceiver 接收并存儲 WAL:備庫的 walreceiver 將接收到的 WAL 數(shù)據(jù)寫入本地 pg_wal 目錄,并通知 startup 進(jìn)程
  • startup 應(yīng)用 WALstartup 進(jìn)程讀取本地 WAL 文件,按順序?qū)⒆兏鼞?yīng)用到備庫的數(shù)據(jù)文件中,完成數(shù)據(jù)同步

02 連接主庫認(rèn)證

當(dāng)備庫以恢復(fù)模式(Recovery Mode)啟動(dòng)時(shí)(例如存在 standby.signalrecovery.conf 文件),PostgreSQL 主進(jìn)程postmaster會直接啟動(dòng) startup 進(jìn)程。在 startup 進(jìn)程初始化過程中對 primary_conninfo 中的參數(shù)信息解析后填充到共享內(nèi)存中的 WalRcvData 數(shù)據(jù)結(jié)構(gòu)中,然后備庫在啟動(dòng) walreceiver 進(jìn)程時(shí)根據(jù)配置嘗試連接到主庫。連接成功,該備庫的 walreceiver 進(jìn)程,與主庫的 walsender 建立復(fù)制流

所以,備庫想要和主庫建立復(fù)制流,需要進(jìn)行連接認(rèn)證

2.1 根據(jù)配置文件獲取密碼

通過配置文件中的 primary_conninfo 參數(shù) password 明文配置連接密碼是最常用的方式,正確配置對應(yīng)字段之后,walreceiver 進(jìn)程則根據(jù)該信息進(jìn)行連接認(rèn)證, primary_conninfo 參數(shù)配置樣例如下,

primary_conninfo = 'host=192.168.1.100 port=5432 user=replicator password=yourpassword application_name=standby1 sslmode=require sslcompression=0 keepalives=on connect_timeout=10'

primary_conninfo 中常見的配置項(xiàng)及其說明如下:

參數(shù)說明示例值
host主庫的 IP 地址或主機(jī)名host=192.168.1.100
port主庫的監(jiān)聽端口(默認(rèn) 5432port=5432
user主庫上具有 REPLICATION 權(quán)限的用戶名(用于復(fù)制的專用用戶)user=replicator
password復(fù)制用戶的密碼password=yourpassword
dbname主庫的數(shù)據(jù)庫名(通常固定為 replication 或主庫的某個(gè)數(shù)據(jù)庫)dbname=postgres
application_name備庫的標(biāo)識名稱,主庫的 pg_stat_replication 視圖會顯示此名稱application_name=standby1
channel_binding是否啟用通道綁定(Channel Binding),增強(qiáng) SSL/TLS 安全性(可選)channel_binding=prefer
replication固定值 truedatabase,用于聲明連接為復(fù)制流(通常設(shè)置為 truereplication=true
connect_timeout連接主庫的超時(shí)時(shí)間(單位:秒)connect_timeout=10
keepalives是否啟用 TCP ?;顧C(jī)制(默認(rèn) onkeepalives=on
keepalives_idleTCP 保活包的空閑時(shí)間(單位:秒)keepalives_idle=60
keepalives_intervalTCP ?;畎闹卦囬g隔(單位:秒)keepalives_interval=5
keepalives_countTCP ?;畎淖畲笾卦嚧螖?shù)keepalives_count=3
sslmodeSSL 連接模式sslmode=require
sslcompression是否啟用 SSL 壓縮(默認(rèn) 0,即禁用)sslcompression=0
sslkey客戶端 SSL 私鑰文件路徑sslkey=/etc/ssl/client.key
sslcert客戶端 SSL 證書文件路徑sslcert=/etc/ssl/client.crt
sslrootcert根證書文件路徑(用于驗(yàn)證主庫證書)sslrootcert=/etc/ssl/ca.crt

如果需要避免在 primary_conninfo 中明文存儲密碼,可以通過接下來的兩種方式進(jìn)行認(rèn)證:在備庫啟動(dòng)時(shí)通過環(huán)境變量提供密碼或通過.pgpass 密碼文件提供密碼

2.2 通過環(huán)境變量注入密碼

PostgreSQL 的 libpq 庫通過一系列環(huán)境變量為連接參數(shù)提供默認(rèn)值,在代碼中沒有顯式指定對應(yīng)參數(shù)時(shí),這些變量會在調(diào)用 PQconnectdbPQsetdbLoginPQsetdb 時(shí)生效;這些環(huán)境變量同樣可以適用于 walreceiver 進(jìn)程向主庫申請建立連接的認(rèn)證過程

以下是 libpq 支持的常用環(huán)境變量,更多的環(huán)境變量適用說明可以參考官方文檔

https://www.postgresql.org/docs/current/libpq-envars.html

環(huán)境變量作用示例值
PGHOST數(shù)據(jù)庫服務(wù)器主機(jī)名或 IPlocalhost
PGHOSTADDR數(shù)據(jù)庫服務(wù)器的 IP 地址(跳過 DNS)192.168.1.100
PGPORT數(shù)據(jù)庫端口號5432
PGDATABASE要連接的數(shù)據(jù)庫名mydb
PGUSER數(shù)據(jù)庫用戶名postgres
PGPASSWORD數(shù)據(jù)庫密碼yourpassword
PGPASSFILE密碼文件路徑~/.pgpass
PGOPTIONS連接選項(xiàng)(如 -c search_path=...-c statement_timeout=1000
PGSSLMODESSL 模式(disable/require 等)require
PGREQUIRESSL強(qiáng)制 SSL 連接(優(yōu)先用 PGSSLMODE1
PGURI完整的連接 URI(覆蓋其他參數(shù))postgresql://user:pass@host/db

通過環(huán)境變量注入密碼,需要確保 walreceiver 進(jìn)程啟動(dòng)時(shí)的環(huán)境變量中已經(jīng)配置了 PGPASSWORD,即在備庫啟動(dòng)之前需要先使用如下命令設(shè)置 PGPASSWORD 環(huán)境變量,當(dāng)然也可以直接通過編輯 .bashrc 等文件進(jìn)行配置

export PGPASSWORD="yourpassword"

這樣就可以在 primary_conninfo 沒有配置 password 字段的情況下進(jìn)行驗(yàn)證,但需要保證該密鑰與流復(fù)制用戶正確匹配才能認(rèn)證成功

但在實(shí)際使用中 PGPASSWORD明文密碼可能被進(jìn)程監(jiān)控工具捕獲,同樣存在安全風(fēng)險(xiǎn),推薦使用 .pgpass 密碼文件

2.3 通過密碼文件獲取密碼

PostgreSQL 中通過密碼文件 .pgpass 存儲數(shù)據(jù)庫密碼是一種較為安全的方式,避免在代碼、命令行或環(huán)境變量中暴露明文密碼。當(dāng)客戶端工具連接數(shù)據(jù)庫時(shí),若未通過其他方式指定密碼,會自動(dòng)從 .pgpass 文件中匹配條目獲取密碼;該密碼文件的默認(rèn)路徑是 ~/.pgpass ,文件格式如下

hostname:port:database:username:password
字段說明
hostname主機(jī)名或 IP,* 表示匹配任意主機(jī)(包括本地套接字)
port端口號,* 表示匹配任意端口
database數(shù)據(jù)庫名,* 表示匹配任意數(shù)據(jù)庫
username用戶名,* 表示匹配任意用戶
password明文密碼

需要注意的是,密碼文件必須限制訪問權(quán)限,僅允許文件所有者讀寫,否則 PostgreSQL 會忽略該文件

chmod 600 ~/.pgpass

除了默認(rèn)的文件路徑 ~/.pgpass ,也可以通過環(huán)境變量 PGPASSFILE 或者直接設(shè)置連接參數(shù) passfile 來指定自定義密碼文件路徑

export PGPASSFILE=/path/to/custom_passfile

walreceiver 進(jìn)程通過 libpq 進(jìn)行認(rèn)證時(shí),如果未顯示指定密碼,則會嘗試在備庫的密碼文件中查找匹配的密碼,但作為流復(fù)制用戶在 .pgpass 文件中該記錄的數(shù)據(jù)庫名稱需要配置成 replication

hostname:port:replication:username:password

03 walreceiver 認(rèn)證源碼解析

前文提到 startup 進(jìn)程在主進(jìn)程postmaster發(fā)現(xiàn)作為備庫啟動(dòng)即以恢復(fù)模式(Recovery Mode)啟動(dòng)時(shí)直接啟動(dòng);而 walreceiver 進(jìn)程則是由 startup 進(jìn)程在進(jìn)行一系列條件判斷后,通知 postmaster 來啟動(dòng),該過程執(zhí)行順序如下:

  • 觸發(fā)條件:當(dāng)備庫負(fù)責(zé) WAL 恢復(fù)的 startup 進(jìn)程發(fā)現(xiàn)本地 WAL 日志不完整需要從主庫流式傳輸時(shí),會通過信號通知 postmaster 啟動(dòng) walreceiver 進(jìn)程
  • 信號傳遞startup 調(diào)用 SendPostmasterSignal(PMSIGNAL_START_WALRECEIVER),向 postmaster 發(fā)送啟動(dòng) walreceiver 的請求
  • postmaster 響應(yīng)postmaster 收到信號后,在其主循環(huán)中調(diào)用 LaunchMissingBackgroundProcesses(),發(fā)現(xiàn)需要啟動(dòng) walreceiver,隨即創(chuàng)建子進(jìn)程

進(jìn)程啟動(dòng):postmaster 通過 fork() 創(chuàng)建子進(jìn)程,子進(jìn)程執(zhí)行 WalReceiverMain(),成為 walreceiver 進(jìn)程,連接到主庫拉取 WAL 數(shù)據(jù)

StartupProcessMain()          // 備庫啟動(dòng) startup 進(jìn)程的主函數(shù)
  ->StartupXLOG()             // 負(fù)責(zé) WAL 恢復(fù)的核心邏輯
    ->InitWalRecovery()       // 初始化 WAL 恢復(fù)環(huán)境
      ->XLogReaderAllocate()  // 分配 WAL 讀取器
        ->XLogPageRead()      // 讀取 WAL 頁
          ->WaitForWALToBecomeAvailable()  // 檢查 WAL 是否可用
            ->RequestXLogStreaming()       // 判斷需要流復(fù)制,觸發(fā)啟動(dòng) walreceiver
              ->SendPostmasterSignal(PMSIGNAL_START_WALRECEIVER)  // 通知 postmaster
                // (postmaster 進(jìn)程側(cè)操作)
                ->process_pm_pmsignal()    // 處理信號 PMSIGNAL_START_WALRECEIVER
                  ->LaunchMissingBackgroundProcesses()  // 檢查并啟動(dòng)缺失的后臺進(jìn)程
                    ->StartChildProcess(B_WAL_RECEIVER) // 啟動(dòng) walreceiver 進(jìn)程
                      ->postmaster_child_launch()       // 創(chuàng)建子進(jìn)程
                        ->WalReceiverMain()             // walreceiver 主函數(shù)

walreceiver 進(jìn)程啟動(dòng)之后,根據(jù) WalRcvData 中已經(jīng)初始化好的連接信息 conninfo 嘗試和主庫建立連接,連接過程使用 libpq 和核心函數(shù) PQconnectStartParams 建立連接,認(rèn)證密碼獲取方式有:

  • 通過配置參數(shù):在根據(jù) primary_conninfo 初始化好的 WalRcvData 中包含 password 信息
  • 通過環(huán)境變量:在調(diào)用 conninfo_add_defaults 獲取默認(rèn)值時(shí),會使用 getenv 函數(shù)遍歷PQconninfoOptions 數(shù)組中的所有環(huán)境變量并獲取對應(yīng)的值,其中就包括 PGPASSWORD 用于給 pgpass 賦值
  • 通過密碼文件:在調(diào)用pqConnectOptions2函數(shù)時(shí)如果發(fā)現(xiàn)當(dāng)前的 conn->pgpass 仍然為空,則根據(jù)默認(rèn)的密碼文件 ~/.pgpass 或用戶自定義的密碼文件路徑 PGPASSFILE 并調(diào)用passwordFromFile函數(shù)獲取所有 host 對應(yīng)的密碼
WalReceiverMain()             // walreceiver 進(jìn)程主入口
  ->walrcv_connect()          // 觸發(fā)連接主庫的邏輯
    ->libpqrcv_connect()       // 調(diào)用 libpq 庫的封裝接口
      ->libpqsrv_connect_params()  // 增加一些額外的參數(shù)選項(xiàng) options
        ->PQconnectStartParams()   // 初始化非阻塞連接
          ->conninfo_array_parse()  // 解析連接參數(shù)數(shù)組
            ->conninfo_add_defaults()  // 補(bǔ)充默認(rèn)連接參數(shù)(從 service file 或者環(huán)境變量中獲取默認(rèn)值)
          ->pqConnectOptions2()     // 處理認(rèn)證相關(guān)選項(xiàng)(如密碼文件)
            ->passwordFromFile()    // 從 .pgpass 文件讀取密碼
          ->pqConnectDBStart()      // 啟動(dòng)異步連接過程
            ->PQconnectPoll()       // 處理連接狀態(tài)機(jī)(包括認(rèn)證協(xié)商)

認(rèn)證過程中使用密碼時(shí),優(yōu)先使用從密碼文件中獲取的密碼conn->connhost[conn->whichhost].password,該邏輯由 PQpass 函數(shù)實(shí)現(xiàn)

char *
PQpass(const PGconn *conn)
{
    char       *password = NULL;
    if (!conn)
        return NULL;
    if (conn->connhost != NULL)
        password = conn->connhost[conn->whichhost].password;
    if (password == NULL)
        password = conn->pgpass;
    /* Historically we've returned "" not NULL for no password specified */
    if (password == NULL)
        password = "";
    return password;
}

04 libpq 的連接控制函數(shù)

在介紹 walreceiver 連接認(rèn)證時(shí),提到使用PQconnectStartParams 去建立于主庫節(jié)點(diǎn)的連接,這個(gè)函數(shù)通過參數(shù)數(shù)組接收連接信息,這種直接傳遞鍵值對可以自動(dòng)處理特殊字符,是新版本引入的啟動(dòng)異步連接函數(shù)

PQconnectStartParams 函數(shù)定義如下,接受兩個(gè)數(shù)組:keywords 包含參數(shù)關(guān)鍵字,values 包含參數(shù)值,并通過 expand_dbname 指定是否允許擴(kuò)展參數(shù)

PGconn *PQconnectStartParams(const char *const *keywords, const char *const *values, int expand_dbname)

PQconnectStart 函數(shù)是另一種支持連接字符串的連接控制函數(shù),定義如下,數(shù)據(jù)庫連接信息是用從 conninfo 連接字符串里取得的參數(shù)中解析出來的

PGconn *PQconnectStart(const char *conninfo)

PQconnectPoll 函數(shù)則是PQconnectStartParamsPQconnectStart最終進(jìn)行連接建立時(shí)調(diào)用的函數(shù),該函數(shù)輪詢異步連接狀態(tài),推動(dòng)連接過程直至完成或失敗

PostgresPollingStatusType PQconnectPoll(PGconn *conn)

PQconnectPoll 函數(shù)返回狀態(tài) PostgresPollingStatusType 定義如下

typedef enum
{
    PGRES_POLLING_FAILED = 0,   // 連接成功
    PGRES_POLLING_READING,      // 需等待套接字可讀
    PGRES_POLLING_WRITING,      // 需等待套接字可寫
    PGRES_POLLING_OK,           // 連接成功
    PGRES_POLLING_ACTIVE        /* unused; keep for backwards compatibility */
} PostgresPollingStatusType;

上述三個(gè)函數(shù)PQconnectStart, PQconnectStartParams, PQconnectPoll 都是用于打開一個(gè)與數(shù)據(jù)庫服務(wù)器之間的非阻塞的連接,即應(yīng)用程序在執(zhí)行這些函數(shù)的時(shí)候不會因遠(yuǎn)端的 I/O 而被阻塞

基于這三個(gè)函數(shù),libpq 提供了三種連接控制接口PQconnectdb, PQconnectdbParams, PQsetdbLogin

PQconnectdb, PQconnectdbParams 分別對應(yīng)對PQconnectStart, PQconnectStartParams 函數(shù)的封裝,函數(shù)調(diào)用參數(shù)一致,如下所示

PGconn *
PQconnectdbParams(const char *const *keywords,
                  const char *const *values,
                  int expand_dbname)
PGconn *
PQconnectdb(const char *conninfo)

PQsetdbLogin函數(shù)則是 libpq 早期的遺留函數(shù),仍保留對舊版本的兼容,接受不太靈活的分立的參數(shù)形式:host, port, options, dbname, user, password,其定義如下

PGconn *
PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions,
             const char *pgtty, const char *dbName, const char *login,
             const char *pwd)

這三種接口區(qū)別在于參數(shù)傳遞方式:

PQconnectdbParams函數(shù)建立連接的示例如下,通過關(guān)鍵字和值的數(shù)組傳遞連接參數(shù),這種方式在動(dòng)態(tài)生成參數(shù)時(shí)更安全,無需轉(zhuǎn)義能避免字符串拼接錯(cuò)誤,而且支持參數(shù)擴(kuò)展

const char *keywords[] = {"host", "port", "dbname", NULL};
const char *values[] = {"localhost", "5432", "mydb", NULL};
PGconn *conn = PQconnectdbParams(keywords, values, 0); 

PQconnectdb函數(shù)建立連接的示例如下,通過連接字符串傳遞連接參數(shù),這種方式在處理密碼等字符串時(shí)需要手動(dòng)進(jìn)行轉(zhuǎn)義,也支持?jǐn)U展參數(shù)

PGconn *conn = PQconnectdb("host=127.0.0.1 port=5432 dbname=mydb");

PQsetdbLogin函數(shù)建立連接的示例如下,通過固定參數(shù)傳遞有限的連接參數(shù),這種方式缺乏靈活性,新代碼不建議使用該接口,該接口僅用于舊版本的兼容

PGconn *conn = PQsetdbLogin("localhost", "5432", "", "mydb", "postgres", "yourpassword");

參考資料

https://www.kancloud.cn/taobaomysql/monthly/81110
https://zhuanlan.zhihu.com/p/530628881
PostgreSQL: Documentation: 17: 19.6. Replication
PostgreSQL: Documentation: 17: 32.15. Environment Variables
PostgreSQL: Documentation: 17: 32.16. The Password File

https://www.postgresql.org/docs/current/libpq-connect.html//LIBPQ-PQCONNECTDB 

到此這篇關(guān)于PostgreSQL 流復(fù)制認(rèn)證機(jī)制的文章就介紹到這了,更多相關(guān)PostgreSQL 流復(fù)制認(rèn)證機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決postgresql 數(shù)據(jù)庫 update更新慢的原因

    解決postgresql 數(shù)據(jù)庫 update更新慢的原因

    這篇文章主要介紹了解決postgresql 數(shù)據(jù)庫 update更新慢的原因,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • postgresql修改完端口后直接psql連接數(shù)據(jù)庫報(bào)錯(cuò)的解決

    postgresql修改完端口后直接psql連接數(shù)據(jù)庫報(bào)錯(cuò)的解決

    這篇文章主要介紹了postgresql修改完端口后直接psql連接數(shù)據(jù)庫報(bào)錯(cuò)的解決,具有很好的參考價(jià)值,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • postgresql 如何關(guān)閉自動(dòng)提交

    postgresql 如何關(guān)閉自動(dòng)提交

    這篇文章主要介紹了postgresql 如何關(guān)閉自動(dòng)提交的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL+Pgpool實(shí)現(xiàn)HA主備切換的操作

    PostgreSQL+Pgpool實(shí)現(xiàn)HA主備切換的操作

    這篇文章主要介紹了PostgreSQL+Pgpool實(shí)現(xiàn)HA主備切換操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • postgresql 中round函數(shù)的用法說明

    postgresql 中round函數(shù)的用法說明

    這篇文章主要介紹了postgresql 中round函數(shù)的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL如何根據(jù)字符串的長度排序

    PostgreSQL如何根據(jù)字符串的長度排序

    在PostgreSQL數(shù)據(jù)庫中,可以通過LENGTH函數(shù)獲取字符串的長度,并據(jù)此進(jìn)行排序,LENGTH函數(shù)會計(jì)算并返回字符串的字符數(shù)量,要根據(jù)字符串長度進(jìn)行升序排序,可以在SQL查詢中直接使用LENGTH函數(shù),本文介紹PostgreSQL如何根據(jù)字符串的長度排序,感興趣的朋友一起看看吧
    2024-11-11
  • 淺談pg_hint_plan定制執(zhí)行計(jì)劃

    淺談pg_hint_plan定制執(zhí)行計(jì)劃

    這篇文章主要介紹了淺談pg_hint_plan定制執(zhí)行計(jì)劃操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL 序列增刪改案例

    PostgreSQL 序列增刪改案例

    這篇文章主要介紹了PostgreSQL 序列增刪改案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • postgresql邏輯復(fù)制的實(shí)現(xiàn)

    postgresql邏輯復(fù)制的實(shí)現(xiàn)

    本文介紹PostgreSQL邏輯復(fù)制實(shí)現(xiàn),基于發(fā)布訂閱模型,需設(shè)置WAL_LEVEL為logical,支持跨庫備份,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • PostgreSQ中的GIN 索引及使用方法

    PostgreSQ中的GIN 索引及使用方法

    GIN是 PostgreSQL 中用于高效處理多值數(shù)據(jù)類型的索引,類似于 Elasticsearch 的倒排索引,接下來通過本文給大家分享PostgreSQ中的GIN 索引的相關(guān)知識,感興趣的朋友一起看看吧
    2019-08-08

最新評論

陈巴尔虎旗| 靖边县| 荥经县| 富宁县| 仁化县| 千阳县| 荥经县| 郧西县| 清镇市| 襄垣县| 徐水县| 璧山县| 贺兰县| 南皮县| 武安市| 关岭| 茶陵县| 海口市| 邻水| 稻城县| 东丰县| 灵武市| 浠水县| 龙州县| 昌黎县| 上林县| 稷山县| 巴彦县| 永济市| 红河县| 南平市| 乃东县| 巴林右旗| 申扎县| 武平县| 瑞金市| 满城县| 甘南县| 延边| 光山县| 禹城市|