W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
邏輯解碼是一種將對數(shù)據(jù)庫表的所有持久更改抽取到一種清晰、易于理解的格式 的處理,這種技術(shù)允許在不了解數(shù)據(jù)庫內(nèi)部狀態(tài)的詳細(xì)知識的前提下解釋該格式。
在PostgreSQL中,邏輯解碼通過解碼 預(yù)寫式日志的內(nèi)容來實現(xiàn),預(yù)寫式日志描述了存儲 層面上的更改,而邏輯解碼則會把更改解碼成一種應(yīng)用相關(guān)的形式,例如一個元組 流或者 SQL 語句流。
在邏輯復(fù)制的環(huán)境下,一個槽表示一個更改流,這些更改可以在客戶機(jī)上以它們在原服務(wù)器上產(chǎn)生的順序被重播。每一個流從一個單一數(shù)據(jù)庫中流式傳送更改序列。
PostgreSQL也有流復(fù)制槽(見第 26.2.5 節(jié)),但是它們的使用有所不同。
一個復(fù)制槽在一個PostgreSQL集簇的所 有數(shù)據(jù)庫之間具有一個唯一的標(biāo)識符。槽在使用它們的連接之間保持獨立并且 對于崩潰是安全的。
在常規(guī)操作中,一個邏輯槽只會把每次更改發(fā)出一次。 只有在檢查點時才會持久化每一個槽的當(dāng)前位置,因此如果發(fā)生崩潰,槽可能會回到一個較早的 LSN,這會導(dǎo)致服務(wù)器重啟時再次發(fā)送最近的更改。 邏輯解碼客戶端負(fù)責(zé)避免多次處理同一消息導(dǎo)致的副作用。 客戶端可能會希望在解碼時記錄它們看到的最新的 LSN,并且跳過任何從該 LSN 解碼得到的重復(fù)數(shù)據(jù)或者(使用復(fù)制協(xié)議時的)請求,而不是讓服務(wù)器來決定開始點。 復(fù)制進(jìn)度跟蹤特性就是為此服務(wù)的,請參考復(fù)制源頭。
對于同一個數(shù)據(jù)庫可能會存在多個獨立的槽。每一個槽有自己的狀態(tài),允許不 同的消費者從該數(shù)據(jù)庫的更改流中的不同點開始接收更改。對于大多數(shù)應(yīng)用, 每一個消費者都將要求一個單獨的槽。
邏輯復(fù)制槽完全不知道接收者的狀態(tài)。甚至可能會有多個不同的接收者在不同 時間使用同一個槽,它們將只是從上一個接收者停止消費更改的地方開始得到 更改。但在任一給定時刻,只有一個接收者可以從一個槽中消費更改。
復(fù)制槽可以在崩潰時保持,并且不知道其消費者的狀態(tài)。即便沒有連接使用它們, 它們也將阻止移除所需的資源。這會消耗存儲,因為只要還有一個復(fù)制槽需要, WAL 和來自于系統(tǒng)目錄的行就不能被VACUUM
移除。在極端情況下這會導(dǎo)致數(shù)據(jù)庫關(guān)閉以防止事務(wù)ID回卷(見第 24.1.5 節(jié))。因此如果不再需要一個槽,那就應(yīng)該刪除它。
輸出插件將數(shù)據(jù)從預(yù)寫式日志的內(nèi)部表示轉(zhuǎn)換成復(fù)制槽的消費者所需的格式。
當(dāng)使用流復(fù)制接口創(chuàng)建一個新的復(fù)制槽時(見CREATE_REPLICATION_SLOT),一個快照將被導(dǎo)出(見 第 9.27.5 節(jié)),在它所顯示的
數(shù)據(jù)庫狀態(tài)之后所有的更改都將被包括在更改流中。通過使用 SET TRANSACTION
SNAPSHOT
讀取槽被創(chuàng)建時的數(shù)據(jù)庫狀態(tài),這可以用來創(chuàng)建 一個新的復(fù)制。然后這個事務(wù)可以被用來及時轉(zhuǎn)儲那一點的數(shù)據(jù)庫狀態(tài),它后來 可以被槽的內(nèi)容更新而不丟失任何更改。
并非總能夠創(chuàng)建快照。特別是在連接到熱備時,快照創(chuàng)建將會失敗。不要求快照導(dǎo)出的應(yīng)用可以用NOEXPORT_SNAPSHOT
選項來抑制它。 option.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: