PostgreSQL 預(yù)寫式日志

2021-08-31 11:43 更新
19.5.1. 設(shè)置
19.5.2. 檢查點(diǎn)
19.5.3. 歸檔
19.5.4. 歸檔恢復(fù)
19.5.5. 恢復(fù)目標(biāo)

參閱第 29.4 節(jié)獲取調(diào)節(jié)這些設(shè)置的額外信息。

19.5.1. 設(shè)置

wal_level (enum)

wal_level決定多少信息寫入到 WAL 中。默認(rèn)值是replica,它會(huì)寫入足夠的數(shù)據(jù)以支持WAL歸檔和復(fù)制,包括在后備服務(wù)器上運(yùn)行只讀查詢。minimal會(huì)去掉除從崩潰或者立即關(guān)機(jī)中進(jìn)行恢復(fù)所需的信息之外的所有記錄。最后,logical會(huì)增加支持邏輯解碼所需的信息。每個(gè)層次包括所有更低層次記錄的信息。這個(gè)參數(shù)只能在服務(wù)器啟動(dòng)時(shí)設(shè)置。

minimal級(jí)別中,對(duì)于創(chuàng)建或重寫永久關(guān)系的事務(wù)的其余部分,不會(huì)記錄任何信息。。 這可以使那些操作更快(參見第 14.4.7 節(jié))。初始化這種優(yōu)化的操作包括:

ALTER ... SET TABLESPACE
CLUSTER
CREATE TABLE
REFRESH MATERIALIZED VIEW (without CONCURRENTLY)
REINDEX
TRUNCATE

但最少的 WAL 不會(huì)包括足夠的信息來從基礎(chǔ)備份和 WAL 日志中重建數(shù)據(jù),因此,要啟用 WAL 歸檔(archive_mode)和流復(fù)制,必須使用replica或更高級(jí)別。

logical層,與replica相同的信息會(huì)被記錄,外加上 允許從 WAL 抽取邏輯修改集所需的信息。使用級(jí)別 logical將增加 WAL 容量,特別是如果為了REPLICA IDENTITY FULL配置了很多表并且執(zhí)行了很多UPDATEDELETE語句時(shí)。

在 9.6 之前的版本中,這個(gè)參數(shù)也允許值archivehot_standby?,F(xiàn)在仍然接受這些值,但是它們會(huì)被映射到replica。

fsync (boolean)

如果打開這個(gè)參數(shù),PostgreSQL服務(wù)器將嘗試確保更新被物理地寫入到磁盤,做法是發(fā)出fsync()系統(tǒng)調(diào)用或者使用多種等價(jià)的方法(見?wal_sync_method?)。這保證了數(shù)據(jù)庫集簇在一次操作系統(tǒng)或者硬件崩潰后能恢復(fù)到一個(gè)一致的狀態(tài)。

雖然關(guān)閉fsync常??梢缘玫叫阅苌系氖找妫?dāng)發(fā)生斷電或系統(tǒng)崩潰時(shí)可能造成不可恢復(fù)的數(shù)據(jù)損壞。因此,只有在能很容易地從外部數(shù)據(jù)中重建整個(gè)數(shù)據(jù)庫時(shí)才建議關(guān)閉fsync

能安全關(guān)閉fsync的環(huán)境的例子包括從一個(gè)備份文件中初始加載一個(gè)新數(shù)據(jù)庫集簇、使用一個(gè)數(shù)據(jù)庫集簇來在數(shù)據(jù)庫被刪掉并重建之后處理一批數(shù)據(jù),或者一個(gè)被經(jīng)常重建并卻不用于失效備援的只讀數(shù)據(jù)庫克隆。單獨(dú)的高質(zhì)量硬件不足以成為關(guān)閉fsync的理由。

當(dāng)把fsync從關(guān)閉改成打開時(shí),為了可靠的恢復(fù),需要強(qiáng)制在內(nèi)核中的所有被修改的緩沖區(qū)進(jìn)入持久化存儲(chǔ)。這可以在多個(gè)時(shí)機(jī)來完成:在集簇被關(guān)閉時(shí)或在 fsync 因?yàn)檫\(yùn)行initdb --sync-only而打開時(shí)、運(yùn)行sync時(shí)、卸載文件系統(tǒng)時(shí)或者重啟服務(wù)器時(shí)。

在很多情況下,為不重要的事務(wù)關(guān)閉?synchronous_commit?可以提供很多關(guān)閉fsync的潛在性能收益,并不會(huì)有的同時(shí), 關(guān)閉fsync可以提供很多潛在的性能優(yōu)勢(shì),而不會(huì)有伴隨著的數(shù)據(jù)損壞風(fēng)險(xiǎn)。

fsync只能在postgresql.conf文件中或在服務(wù)器命令行上設(shè)置。如果你關(guān)閉這個(gè)參數(shù),請(qǐng)也考慮關(guān)閉?full_page_writes?。

synchronous_commit (enum)

指定數(shù)據(jù)庫服務(wù)器返回success指示給客戶端之前,必須要完成多少WAL處理。 合法的值為remote_apply, on(默認(rèn)值), remote_write,local, 和 off。

如果synchronous_standby_names為空,則唯一有意義的設(shè)置為onoff ; remote_apply,remote_writelocal都提供與 on相同的本地同步級(jí)別。 所有非off模式的本地行為都是等待WAL的本地刷新到磁盤。 在 off模式,無需等待,因此在向客戶端報(bào)告成功和以后保證事務(wù)安全防止服務(wù)器崩潰之間可能會(huì)出現(xiàn)延遲。 當(dāng)設(shè)置為off時(shí),在向客戶端報(bào)告成功和真正保證事務(wù)不會(huì)被服務(wù)器崩潰威脅之間會(huì)有延遲(最大的延遲是?wal_writer_delay?的三倍)。 不同于?fsync?,將這個(gè)參數(shù)設(shè)置為off不會(huì)產(chǎn)生數(shù)據(jù)庫不一致性的風(fēng)險(xiǎn):一個(gè)操作系統(tǒng)或數(shù)據(jù)庫崩潰可能會(huì)造成一些最近據(jù)說已提交的事務(wù)丟失,但數(shù)據(jù)庫狀態(tài)是一致的,就像這些事務(wù)已經(jīng)被干凈地中止。 因此,當(dāng)性能比完全確保事務(wù)的持久性更重要時(shí),關(guān)閉synchronous_commit可以作為一個(gè)有效的代替手段。更多討論見第 29.3 節(jié)。

如果synchronous_standby_names為非空,synchronous_commit也控制是否事務(wù)提交將等待它們的 WAL 記錄在后備服務(wù)器上被處理。

當(dāng)設(shè)置為 remote_apply 時(shí),提交將等待,直到來自當(dāng)前同步備用服務(wù)器的答復(fù)顯示他們已收到事務(wù)的提交記錄并應(yīng)用了它,以便它變得對(duì)備用服務(wù)器上的查詢可見,并寫入備用服務(wù)器上的持久存儲(chǔ)。 這將導(dǎo)致比以前的設(shè)置更大的提交延遲,因?yàn)樗却?WAL 重放(replay)。 當(dāng)設(shè)置為on時(shí),提交將等待,直到來自于當(dāng)前同步的后備服務(wù)器的回復(fù)顯示它們已經(jīng)收到了事務(wù)的提交記錄并將其刷入了磁盤。 這保證事務(wù)將不會(huì)被丟失,除非主服務(wù)器和所有同步后備都遭受到了數(shù)據(jù)庫存儲(chǔ)損壞的問題。 當(dāng)這個(gè)參數(shù)被設(shè)置為remote_write時(shí),提交將等待,直到來自當(dāng)前的同步后備的回復(fù)指示它們已經(jīng)收到了該事務(wù)的提交記錄并且已經(jīng)把該記錄寫到它們的文件系統(tǒng),這種設(shè)置保證數(shù)據(jù)得以保存,在PostgreSQL的后備服務(wù)器實(shí)例崩潰時(shí),但是不能保證后備服務(wù)器遭受操作系統(tǒng)級(jí)別崩潰時(shí)數(shù)據(jù)能被保持,因?yàn)閿?shù)據(jù)不一定必須要在后備機(jī)上達(dá)到持久存儲(chǔ)。 設(shè)置local會(huì)導(dǎo)致提交等待本地刷寫到磁盤,而不是復(fù)制。在使用同步復(fù)制時(shí)這通常是不可取的,但是為了完整性提供了這個(gè)選項(xiàng)。

這個(gè)參數(shù)可以隨時(shí)被修改;任何一個(gè)事務(wù)的行為由其提交時(shí)生效的設(shè)置決定。因此,可以同步提交一些事務(wù),同時(shí)異步提交其他事務(wù)。例如,當(dāng)默認(rèn)是相反時(shí),實(shí)現(xiàn)一個(gè)單一多語句事務(wù)的異步提交,在事務(wù)中發(fā)出SET LOCAL synchronous_commit TO OFF。

表 19.1 概括了 synchronous_commit 設(shè)置的能力.

表 19.1. synchronous_commit Modes

synchronous_commit setting local durable commit standby durable commit after PG crash standby durable commit after OS crash standby query consistency
remote_apply ? ? ? ?
on ? ? ?  
remote_write ? ?    
local ?      
off        

wal_sync_method (enum)

用來向強(qiáng)制 WAL 更新到磁盤的方法。如果fsync是關(guān)閉的,那么這個(gè)設(shè)置就不相關(guān),因?yàn)?WAL 文件更新將根本不會(huì)被強(qiáng)制??赡艿闹凳牵?/p>

  • open_datasync(用open()選項(xiàng)O_DSYNC寫 WAL 文件)

  • fdatasync(在每次提交時(shí)調(diào)用fdatasync()

  • fsync(在每次提交時(shí)調(diào)用fsync()

  • fsync_writethrough(在每次提交時(shí)調(diào)用fsync(),強(qiáng)制任何磁盤寫高速緩存的直通寫)

  • open_sync(用open()選項(xiàng)O_SYNC寫 WAL 文件)

open_* 選項(xiàng)也可以使用O_DIRECT(如果可用)。不是在所有平臺(tái)上都能使用所有這些選擇。默認(rèn)值是列表中第一個(gè)被平臺(tái)支持的那個(gè), 不過fdatasync是 Linux 中的默認(rèn)值。默認(rèn)值不一定是最理想的;有可能需要修改這個(gè)設(shè)置或系統(tǒng)配置的其他方面來創(chuàng)建一個(gè)崩潰-安全的配置,或達(dá)到最佳性能。這些方面在第 29.1 節(jié)中討論。這個(gè)參數(shù)只能在postgresql.conf文件中或在服務(wù)器命令行上設(shè)置。

full_page_writes (boolean)

當(dāng)這個(gè)參數(shù)為打開時(shí),PostgreSQL服務(wù)器在一個(gè)檢查點(diǎn)之后的頁面的第一次修改期間將每個(gè)頁面的全部?jī)?nèi)容寫到 WAL 中。這么做是因?yàn)樵诓僮飨到y(tǒng)崩潰期間正在處理的一次頁寫入可能只有部分完成,從而導(dǎo)致在一個(gè)磁盤頁面中混合有新舊數(shù)據(jù)。在崩潰后的恢復(fù)期間,通常存儲(chǔ)在 WAL 中的行級(jí)改變數(shù)據(jù)不足以完全恢復(fù)這樣一個(gè)頁面。存儲(chǔ)完整的頁面映像可以保證頁面被正確存儲(chǔ),但代價(jià)是增加了必須被寫入 WAL 的數(shù)據(jù)量(因?yàn)?WAL 重放總是從一個(gè)檢查點(diǎn)開始,所以在檢查點(diǎn)后每個(gè)頁面的第一次改變時(shí)這樣做就夠了。因此,一種減小全頁面寫開銷的方法是增加檢查點(diǎn)間隔參數(shù)值)。

把這個(gè)參數(shù)關(guān)閉會(huì)加快正常操作,但是在系統(tǒng)失敗后可能導(dǎo)致不可恢復(fù)的數(shù)據(jù)損壞,或者靜默的數(shù)據(jù)損壞。其風(fēng)險(xiǎn)類似于關(guān)閉fsync, 但是風(fēng)險(xiǎn)較小。并且只有在可關(guān)閉fsync的情況下才應(yīng)該關(guān)閉它。

關(guān)閉這個(gè)選項(xiàng)并不影響用于時(shí)間點(diǎn)恢復(fù)(PITR)的 WAL 歸檔使用(見第 25.3 節(jié))。

這個(gè)參數(shù)只能在postgresql.conf文件中或在服務(wù)器命令行上設(shè)置。默認(rèn)值是on。

wal_log_hints (boolean)

當(dāng)這個(gè)參數(shù)為on時(shí),PostgreSQL服務(wù)器一個(gè)檢查點(diǎn)之后頁面被第一次修改期間把該磁盤頁面的整個(gè)內(nèi)容都寫入 WAL,即使對(duì)所謂的提示位做非關(guān)鍵修改也會(huì)這樣做。

如果啟用了數(shù)據(jù)校驗(yàn)和,提示位更新總是會(huì)被 WAL 記錄并且這個(gè)設(shè)置會(huì)被忽略。你可以使用這個(gè) 設(shè)置測(cè)試如果你的數(shù)據(jù)庫啟用了數(shù)據(jù)校驗(yàn)和,會(huì)有多少額外的 WAL 記錄發(fā)生。

這個(gè)參數(shù)只能在服務(wù)器啟動(dòng)時(shí)設(shè)置。默認(rèn)值是off。

wal_compression (boolean)

當(dāng)這個(gè)參數(shù)為on時(shí),如果?full_page_writes ?為打開或者處于基礎(chǔ)備份期間,PostgreSQL服務(wù)器 會(huì)壓縮寫入到 WAL 中的完整頁面鏡像。壓縮頁面鏡像將在 WAL 重放時(shí) 被解壓。默認(rèn)值為off。只有超級(jí)用戶可以更改這個(gè)設(shè)置。

打開這個(gè)參數(shù)可以減小 WAL 所占的空間且無需承受不可恢復(fù)的數(shù)據(jù)損壞風(fēng)險(xiǎn), 但是代價(jià)是需要額外的 CPU 開銷以便在 WAL 記錄期間進(jìn)行壓縮以及在 WAL 重放時(shí)解壓。

wal_init_zero (boolean)

如果設(shè)置為on(默認(rèn)值),此選項(xiàng)會(huì)導(dǎo)致新的 WAL 文件被零填充。 在某些文件系統(tǒng)上,這可確保在我們需要寫入 WAL 記錄之前分配空間。 但是,Copy-On-Write(COW)文件系統(tǒng)可能不會(huì)從此技術(shù)中受益,因此可以選擇跳過不必要的工作。 如果設(shè)置為off,則在創(chuàng)建文件時(shí)僅寫入最終字節(jié),以便其具有預(yù)期大小。

wal_recycle (boolean)

如果設(shè)置為 on (默認(rèn)值),此選項(xiàng)通過重命名來回收 WAL 文件,從而避免創(chuàng)建新文件。 在 COW 文件系統(tǒng)上,創(chuàng)建新文件系統(tǒng)可能更快,因此提供了禁用此行為的選項(xiàng)。

wal_buffers (integer)

用于還未寫入磁盤的 WAL 數(shù)據(jù)的共享內(nèi)存量。默認(rèn)值 -1 選擇等于shared_buffers的 1/32 的尺寸(大約3%),但是不小于64kB也不大于 WAL 段的尺寸(通常為)。如果自動(dòng)的選擇太大或太小可以手工設(shè)置該值,但是任何小于32kB的正值都將被當(dāng)作 32kB。 如果指定值時(shí)沒有單位,則以WAL塊作為單位,即為 XLOG_BLCKSZ 字節(jié),通常為8kB。這個(gè)參數(shù)只能在服務(wù)器啟動(dòng)時(shí)設(shè)置。

在每次事務(wù)提交時(shí),WAL 緩沖區(qū)的內(nèi)容被寫出到磁盤,因此極大的值不可能提供顯著的收益。不過,把這個(gè)值設(shè)置為幾個(gè)兆字節(jié)可以在一個(gè)繁忙的服務(wù)器(其中很多客戶端會(huì)在同一時(shí)間提交)上提高寫性能。由默認(rèn)設(shè)置 -1 選擇的自動(dòng)調(diào)節(jié)將在大部分情況下得到合理的結(jié)果。

wal_writer_delay (integer)

指定 WAL 寫入器刷寫 WAL 的頻繁程度,以時(shí)間為單位。 在刷寫WAL之后,寫入器將根據(jù)wal_writer_delay所給出的時(shí)間長(zhǎng)度進(jìn)行睡眠,除非被一個(gè)異步提交的事務(wù)提前喚醒。 如果最近的刷寫發(fā)生在 wal_writer_delay 之前,并且小于 wal_writer_flush_after WAL的值產(chǎn)生之后,那么WAL只會(huì)被寫入操作系統(tǒng),而不會(huì)被刷寫到磁盤。 如果指定值時(shí)沒有單位,則以毫秒作為單位。 默認(rèn)值是 200 毫秒(200ms)。注意在很多系統(tǒng)上,有效的睡眠延遲粒度是 10 毫秒,把wal_writer_delay設(shè)置為一個(gè)不是 10 的倍數(shù)的值,其效果和把它設(shè)置為大于該值的下一個(gè) 10 的倍數(shù)產(chǎn)生的效果相同。這個(gè)參數(shù)只能在postgresql.conf文件中或者服務(wù)器命令行上設(shè)置。

wal_writer_flush_after (integer)

指定 WAL 寫入器刷寫 WAL 的頻繁程度,以卷為單位。 如果最近的刷寫發(fā)生在 wal_writer_delay 之前,并且小于 wal_writer_flush_after WAL的值產(chǎn)生之后,那么WAL只會(huì)被寫入操作系統(tǒng),而不會(huì)被刷寫到磁盤。 如果wal_writer_flush_after被設(shè)置為0,則WAL數(shù)據(jù)總是會(huì)被立即刷寫。 如果指定值時(shí)沒有單位,則以WAL塊作為單位,即為XLOG_BLCKSZ字節(jié),通常為8kB。 默認(rèn)是1MB。這個(gè)參數(shù)只能在postgresql.conf文件中或者服務(wù)器命令行上設(shè)置。

wal_skip_threshold (integer)

當(dāng)wal_levelminimal,并且在創(chuàng)建或重寫永久關(guān)系之后提交事務(wù)時(shí),此設(shè)置將確定如何保留新數(shù)據(jù)。 如果數(shù)據(jù)小于此設(shè)置,將其寫入 WAL 日志;否則,使用受影響文件的 fsync。 根據(jù)存儲(chǔ)的屬性,如果此類提交減慢了并發(fā)事務(wù),提高或降低此值可能會(huì)有所幫助。 如果指定此值時(shí)沒有單位,則視為千字節(jié)。默認(rèn)為兩兆字節(jié)(2MB)。

commit_delay (integer)

在一次 WAL 刷寫被發(fā)起之前,commit_delay增加一個(gè)時(shí)間延遲。 如果系統(tǒng)負(fù)載足夠高,使得在一個(gè)給定間隔內(nèi)有額外的事務(wù)準(zhǔn)備好提交,那么通過允許更多事務(wù)通過一個(gè)單次 WAL 刷寫來提交能夠提高組提交的吞吐量。 但是,它也把每次 WAL 刷寫的潛伏期增加到了最多commit_delay。 因?yàn)槿绻麤]有其他事務(wù)準(zhǔn)備好提交,就會(huì)浪費(fèi)一次延遲,只有在當(dāng)一次刷寫將要被發(fā)起時(shí)有至少 commit_siblings個(gè)其他活動(dòng)事務(wù)時(shí),才會(huì)執(zhí)行一次延遲。 另外,如果fsync被禁用,則將不會(huì)執(zhí)行任何延遲。 如果指定值時(shí)沒有單位,則以微秒作為單位。 默認(rèn)的commit_delay是零(無延遲)。只有超級(jí)用戶才能修改這個(gè)設(shè)置。

PostgreSQL的 9.3 發(fā)布之前,commit_delay的行為不同并且效果更差:它只影響提交,而不是所有 WAL 刷寫,并且即使在 WAL 刷寫馬上就要完成時(shí)也會(huì)等待一整個(gè)配置的延遲。從PostgreSQL 9.3 中開始,第一個(gè)準(zhǔn)備好刷寫的進(jìn)程會(huì)等待配置的間隔,而后續(xù)的進(jìn)程只等到領(lǐng)先者完成刷寫操作。

commit_siblings (integer)

在執(zhí)行commit_delay延遲時(shí),要求的并發(fā)活動(dòng)事務(wù)的最小數(shù)目。大一些的值會(huì)導(dǎo)致在延遲間隔期間更可能有至少另外一個(gè)事務(wù)準(zhǔn)備好提交。默認(rèn)值是五個(gè)事務(wù)。

19.5.2. 檢查點(diǎn)

checkpoint_timeout (integer)

自動(dòng) WAL 檢查點(diǎn)之間的最長(zhǎng)時(shí)間。如果指定值時(shí)沒有單位,則以秒為單位。 合理的范圍在 30 秒到 1 天之間。默認(rèn)是 5 分鐘(5min)。增加這個(gè)參數(shù)的值會(huì)增加崩潰恢復(fù)所需的時(shí)間。這個(gè)參數(shù)只能在postgresql.conf文件中或在服務(wù)器命令行上設(shè)置。

checkpoint_completion_target (floating point)

指定檢查點(diǎn)完成的目標(biāo),作為檢查點(diǎn)之間總時(shí)間的一部分。默認(rèn)是 0.5。 這個(gè)參數(shù)只能在postgresql.conf文件中或在服務(wù)器命令行上設(shè)置。

checkpoint_flush_after (integer)

當(dāng)執(zhí)行檢查點(diǎn)時(shí)寫入的數(shù)據(jù)量超過此數(shù)量時(shí),就嘗試強(qiáng)制 OS 把這些寫發(fā)送到底層存儲(chǔ)。 這樣做將會(huì)限制內(nèi)核頁面高速緩存中的臟數(shù)據(jù)數(shù)量,降低在檢查點(diǎn)末尾發(fā)出fsync或者 OS 在后臺(tái)大批量寫回?cái)?shù)據(jù)時(shí)被卡住的可能性。 那常常會(huì)導(dǎo)致大幅度壓縮的事務(wù)延遲,但是也有一些情況(特別是負(fù)載超過shared_buffers但小于 OS 頁面高速緩存)的性能會(huì)降低。 這種設(shè)置可能會(huì)在某些平臺(tái)上沒有效果。 如果指定值時(shí)沒有單位,則以塊為單位,即為BLCKSZ 字節(jié),通常為8kB。 合法的范圍在0(禁用強(qiáng)制寫回)和2MB之間。Linux 上的默認(rèn)值是256kB,其他平臺(tái)上是0(如果 BLCKSZ不是8kB,則默認(rèn)值和最大值會(huì)按比例縮放到它)。這個(gè)參數(shù)只能在postgresql.conf文件中或者服務(wù)器命令行上設(shè)置。

checkpoint_warning (integer)

如果由于填充WAL段文件導(dǎo)致的檢查點(diǎn)之間的間隔低于這個(gè)參數(shù)表示的時(shí)間量,那么就向服務(wù)器日志寫一個(gè)消息(它建議增加max_wal_size的值)。 如果指定值時(shí)沒有單位,則以秒為單位。默認(rèn)值是 30 秒(30s)。零則關(guān)閉警告。如果checkpoint_timeout低于checkpoint_warning,則不會(huì)有警告產(chǎn)生。這個(gè)參數(shù)只能在 postgresql.conf文件中或在服務(wù)器命令行上設(shè)置。

max_wal_size (integer)

在自動(dòng) WAL 檢查點(diǎn)之間允許 WAL 增長(zhǎng)到的最大尺寸。這是一個(gè)軟限制,在特殊的情況下 WAL 尺寸可能會(huì)超過max_wal_size, 例如在重度負(fù)荷下、archive_command失敗或者高的 wal_keep_size設(shè)置。 如果指定值時(shí)沒有單位,則以兆字節(jié)為單位。默認(rèn)為 1 GB。增加這個(gè)參數(shù)可能導(dǎo)致崩潰恢復(fù)所需的時(shí)間。 這個(gè)參數(shù)只能在postgresql.conf 或者服務(wù)器命令行中設(shè)置。

min_wal_size (integer)

只要 WAL 磁盤用量保持在這個(gè)設(shè)置之下,在檢查點(diǎn)時(shí)舊的 WAL 文件總是 被回收以便未來使用,而不是直接被刪除。這可以被用來確保有足夠的 WAL 空間被保留來應(yīng)付 WAL 使用的高峰,例如運(yùn)行大型的批處理任務(wù)。 如果指定值時(shí)沒有單位,則以兆字節(jié)為單位。默認(rèn)是 80 MB。這個(gè)參數(shù)只能在postgresql.conf 或者服務(wù)器命令行中設(shè)置。

19.5.3. 歸檔

archive_mode (enum)

當(dāng)啟用archive_mode時(shí),可以通過設(shè)置 ?archive_command?命令將完成的 WAL 段發(fā)送到 歸檔存儲(chǔ)。除用于禁用的off之外,還有兩種模式: onalways。在普通操作期間,這兩種模式之間 沒有區(qū)別,但是當(dāng)設(shè)置為always時(shí),WAL 歸檔器在歸檔恢復(fù) 或者后備模式下也會(huì)被啟用。在always模式下,所有從歸檔恢復(fù) 的或者用流復(fù)制傳來的文件將被(再次)歸檔。詳見 第 26.2.9 節(jié)

archive_modearchive_command是獨(dú)立的變量,這樣可以在不影響歸檔模式的前提下修改archive_command。這個(gè)參數(shù)只能在服務(wù)器啟動(dòng)時(shí)設(shè)置。當(dāng)wal_level被設(shè)置為minimal時(shí), archive_mode不能被啟用。

archive_command (string)

本地 shell 命令被執(zhí)行來歸檔一個(gè)完成的 WAL 文件段。字符串中的任何%p被替換成要被歸檔的文件的路徑名, 而%f只被文件名替換(路徑名是相對(duì)于服務(wù)器的工作目錄, 即集簇的數(shù)據(jù)目錄)。如果要在命令里嵌入一個(gè)真正的%字符,可以使用%%。有一點(diǎn)很重要,該命令只在成功時(shí)返回一個(gè)零作為退出狀態(tài)。更多信息請(qǐng)見 第 25.3.1 節(jié)。

這個(gè)參數(shù)只能在postgresql.conf文件中或在服務(wù)器命令行上設(shè)置。除非服務(wù)器啟動(dòng)時(shí)啟用了archive_mode,否則它會(huì)被忽略。如果archive_mode被啟用時(shí),archive_command是一個(gè)空字符串(默認(rèn)),WAL 歸檔會(huì)被臨時(shí)禁用,但服務(wù)器仍會(huì)繼續(xù)累計(jì) WAL 段文件,期待著一個(gè)命令被提供。將archive_command設(shè)置為一個(gè)只返回真但不做任何事的命令(例如/bin/true或 Windows 上的REM)實(shí)際上會(huì)禁用歸檔,也會(huì)打破歸檔恢復(fù)所需的 WAL 文件鏈,因此只有在極少數(shù)情況下才能用。

archive_timeout (integer)

?archive_command?僅在已完成的 WAL 段上調(diào)用。因此,如果你的服務(wù)器只產(chǎn)生很少的 WAL 流量(或產(chǎn)生流量的周期很長(zhǎng)),那么在事務(wù)完成和它被安全地記錄到歸檔存儲(chǔ)之間將有一個(gè)很長(zhǎng)的延遲。為了限制未歸檔數(shù)據(jù)存在的時(shí)間,你可以設(shè)置archive_timeout來強(qiáng)制服務(wù)器來周期性地切換到一個(gè)新的 WAL 段文件。 當(dāng)這個(gè)參數(shù)被設(shè)置為大于零時(shí),只要從上次段文件切換后過了參數(shù)所設(shè)置的時(shí)間量,并且已經(jīng)有過任何數(shù)據(jù)庫活動(dòng)(包括一個(gè)單一檢查點(diǎn)),服務(wù)器將切換到一個(gè)新的段文件(如果沒有數(shù)據(jù)庫活動(dòng)則會(huì)跳過檢查點(diǎn))。 注意,由于強(qiáng)制切換而提早關(guān)閉的被歸檔文件仍然與完整的歸檔文件長(zhǎng)度相同。因此,使用非常短的archive_timeout是不明智的 — 它將占用巨大的歸檔存儲(chǔ)。一分鐘左右的archive_timeout設(shè)置通常比較合理。如果你希望數(shù)據(jù)能被更快地從主服務(wù)器上復(fù)制下來,你應(yīng)該考慮使用流復(fù)制而不是歸檔。如果指定值時(shí)沒有單位,則以秒為單位。這個(gè)參數(shù)只能在 postgresql.conf文件中或在服務(wù)器命令行上設(shè)置。

19.5.4. 歸檔恢復(fù)

本節(jié)描述了僅在恢復(fù)期間適用的設(shè)置。如果您希望執(zhí)行任何后續(xù)恢復(fù),則必須重置它們。

Recovery涵蓋使用服務(wù)器作為備用服務(wù)器或用于執(zhí)行目標(biāo)恢復(fù)。 通常情況,備用模式用于提供高可用性和/或讀可擴(kuò)展性,而目標(biāo)恢復(fù)用于從數(shù)據(jù)丟失中恢復(fù)。

若要在備用模式下啟動(dòng)服務(wù)器,在數(shù)據(jù)目錄中建立名為standby.signal 的文件。 服務(wù)器將會(huì)進(jìn)入恢復(fù)狀態(tài)并且在到達(dá)歸檔WAL末尾時(shí)不會(huì)停止恢復(fù),但將保持嘗試?yán)^續(xù)恢復(fù),通過連接到primary_conninfo設(shè)置指定的發(fā)送服務(wù)器和/或用restore_command獲取新的WAL分段。 對(duì)于這種模式,來自本節(jié)的參數(shù)和第 19.6.3 節(jié) 是值得關(guān)注的。 本文中第 19.5.5 節(jié) 中的參數(shù)也會(huì)被應(yīng)用,但通常在這種模式下沒用。

要啟動(dòng)服務(wù)器為目標(biāo)恢復(fù)模式,需在數(shù)據(jù)目錄中建立名為recovery.signal 的文件。 如果同時(shí)創(chuàng)建了standby.signalrecovery.signal 文件,則優(yōu)先使用備用模式。 目標(biāo)恢復(fù)模式在歸檔的WAL全部回放或到達(dá)recovery_target時(shí)結(jié)束。 在這種模式下,將使用來自本節(jié)和本文中  第 19.5.5 節(jié) 的參數(shù)。

restore_command (string)

用于獲取 WAL 文件系列的一個(gè)已歸檔段的本地 shell 命令。這個(gè)參數(shù)是歸檔恢復(fù)所必需的,但是對(duì)于流復(fù)制是可選的。 在該字符串中的任何%f會(huì)被替換為從歸檔中獲得的文件的名字,并且任何%p會(huì)被在服務(wù)器上的復(fù)制目標(biāo)路徑名替換(該路徑名是相對(duì)于當(dāng)前工作目錄的,即集簇的數(shù)據(jù)目錄)。 任何%r會(huì)被包含上一個(gè)可用重啟點(diǎn)的文件的名字所替換。 在那些必須被保留用于使得一次恢復(fù)變成可重啟的文件中,這個(gè)文件是其中最早的一個(gè),因此這個(gè)信息可以被用來把歸檔截?cái)酁橹С謴漠?dāng)前恢復(fù)重啟所需的最小值。 %r通常只被溫備配置(見第 26.2 節(jié))所使用。要嵌入一個(gè)真正的%字符,需要寫成 %%。

很重要的一點(diǎn)是,該命令只有在成功時(shí)才返回一個(gè)為零的退出狀態(tài)。 該命令會(huì)被詢問不存在于歸檔中的文件名,當(dāng)這樣被詢問時(shí)它必須返回非零。例子:

restore_command = 'cp /mnt/server/archivedir/%f "%p"'
restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"'  # Windows

一個(gè)例外是如果該命令被一個(gè)信號(hào)(不是SIGTERM,它是數(shù)據(jù)庫服務(wù)器關(guān)閉的一部分)或者一個(gè) shell 錯(cuò)誤(例如命令未找到)終止,則恢復(fù)將會(huì)中止并且服務(wù)器將不會(huì)啟動(dòng)。

這個(gè)參數(shù)只能在服務(wù)器啟動(dòng)時(shí)被設(shè)置。

archive_cleanup_command (string)

這個(gè)可選參數(shù)指定了一個(gè) shell 命令,它將在每一個(gè)重啟點(diǎn)被執(zhí)行。 archive_cleanup_command的目的是提供一種清除不再被后備服務(wù)器需要的舊的已歸檔 WAL 文件的機(jī)制。 任何%r會(huì)被替換為包含最后一個(gè)可用重啟點(diǎn)的文件的名稱。 那是使一次恢復(fù)變成可重啟的所必須被保留的最早的文件,并且因此比 %r更早的所有文件可以被安全地移除。 這個(gè)信息可以被用來把歸檔截?cái)酁橹С謴漠?dāng)前恢復(fù)重啟所需的最小值。 對(duì)于單一后備配置,pg_archivecleanup模塊常常被用在archive_cleanup_command中,例如:

archive_cleanup_command = 'pg_archivecleanup /mnt/server/archivedir %r'

但是注意,如果多個(gè)后備服務(wù)器正在從同一個(gè)歸檔目錄中恢復(fù),你將需要保證只有當(dāng)任意服務(wù)器都不再需要 WAL 文件時(shí)才會(huì)刪除它們。 archive_cleanup_command通常被用于一種溫后備配置(見第 26.2 節(jié))中。 要在該命令中嵌入一個(gè)真正的%字符,需要寫成 %%

如果該命令返回一個(gè)非零退出狀態(tài),則將會(huì)寫出一個(gè)警告日志消息。 一個(gè)例外是如果該命令被一個(gè)信號(hào)或者一個(gè) shell 錯(cuò)誤(例如命令未找到)終止,則會(huì)拋出一個(gè)致命錯(cuò)誤。

這個(gè)參數(shù)只能在 postgresql.conf 文件中設(shè)置或通過服務(wù)器命令行的方式。

recovery_end_command (string)

這個(gè)參數(shù)指定了一個(gè)將只在恢復(fù)末尾被執(zhí)行一次的 shell 命令。這個(gè)參數(shù)是可選的。 recovery_end_command的目的是為復(fù)制或恢復(fù)之后的清除提供一種機(jī)制。 與archive_cleanup_command中相似,任何%r會(huì)被替換為包含最后一個(gè)可用重啟點(diǎn)的文件的名稱。

如果該命令返回一個(gè)非零退出狀態(tài),則一個(gè)警告日志消息將被寫出并且不管怎樣該數(shù)據(jù)庫將繼續(xù)啟動(dòng)。 一個(gè)例外是如果該命令被一個(gè)信號(hào)或者 shell 錯(cuò)誤(例如命令未找到)中止,該數(shù)據(jù)庫將不會(huì)繼續(xù)啟動(dòng)。

這個(gè)參數(shù)只能在 postgresql.conf 文件中設(shè)置或通過服務(wù)器命令行的方式。

19.5.5. 恢復(fù)目標(biāo)

默認(rèn)情況下,恢復(fù)將會(huì)一直恢復(fù)到 WAL 日志的末尾。下面的參數(shù)可以被用來指定一個(gè)更早的停止點(diǎn)。 在recovery_target、recovery_target_lsn、recovery_target_namerecovery_target_timerecovery_target_xid中, 最多只能使用一個(gè),如果在配置文件中使用了多個(gè),將會(huì)產(chǎn)生一個(gè)錯(cuò)誤。這個(gè)參數(shù)只能在服務(wù)器啟動(dòng)時(shí)設(shè)置。

recovery_target = 'immediate'

這個(gè)參數(shù)指定恢復(fù)應(yīng)該在達(dá)到一個(gè)一致狀態(tài)后盡快結(jié)束,即盡早結(jié)束。在從一個(gè)在線備份中恢復(fù)時(shí),這意味著備份結(jié)束的那個(gè)點(diǎn)。

在技術(shù)上,這是一個(gè)字符串參數(shù),但是'immediate'是目前唯一允許的值。

recovery_target_name (string)

這個(gè)參數(shù)指定(pg_create_restore_point()所創(chuàng)建)的已命名的恢復(fù)點(diǎn),恢復(fù)將進(jìn)入該恢復(fù)點(diǎn)。

recovery_target_time (timestamp)

此參數(shù)指定恢復(fù)將執(zhí)行的時(shí)間戳。精確的停止點(diǎn)還受到?recovery_target_inclusive?得影響。

此參數(shù)的值是一個(gè)被timestamp with time zone數(shù)據(jù)類型接受的相同格式的時(shí)間戳,只不過你不能使用時(shí)區(qū)縮寫(除非timezone_abbreviations變量在配置文件中已提前設(shè)置)。 首選樣式是使用 UTC 的數(shù)字偏移量,或者你可以寫一個(gè)完整時(shí)區(qū)名稱,例如 Europe/Helsinki而不是 EEST。

recovery_target_xid (string)

這個(gè)參數(shù)指定恢復(fù)將進(jìn)入的事務(wù) ID。記住雖然事務(wù) ID 是在事務(wù)開始時(shí)順序分配的,但是事務(wù)可能以不同的數(shù)字順序完成。 那些在指定事務(wù)之前(也可以包括該事務(wù))提交的事務(wù)將被恢復(fù)。精確的停止點(diǎn)也受到?recovery_target_inclusive?的影響。

recovery_target_lsn (pg_lsn)

此參數(shù)指定恢復(fù)將繼續(xù)進(jìn)行的預(yù)寫日志位置的LSN。精確的??奎c(diǎn)也受 ?recovery_target_inclusive?的影響。 使用系統(tǒng)數(shù)據(jù)類型pg_lsn解析此參數(shù)。

下列選項(xiàng)進(jìn)一步指定恢復(fù)目標(biāo),并且影響到達(dá)目標(biāo)時(shí)會(huì)發(fā)生什么:

recovery_target_inclusive (boolean)

指定我們是否僅在指定的恢復(fù)目標(biāo)之后停止(on),或者僅在恢復(fù)目標(biāo)之前停止(off)。 適用于?recovery_target_lsn?、?recovery_target_time?或者 ?recovery_target_xid?被指定的情況。 這個(gè)設(shè)置分別控制事務(wù)是否有準(zhǔn)確的目標(biāo)WAL位置(LSN)、提交時(shí)間或事務(wù)ID將被包括在該恢復(fù)中。默認(rèn)值為on。

recovery_target_timeline (string)

指定恢復(fù)到一個(gè)特定的時(shí)間線中。該值可以是數(shù)字時(shí)間線 ID 或特殊值。 值current沿著與執(zhí)行基本備份時(shí)相同的時(shí)間線恢復(fù)。 值latest將恢復(fù)到歸檔中能找到的最新的時(shí)間線,這在一個(gè)備用服務(wù)器中有用。latest是默認(rèn)的。

你通常只需要在復(fù)雜的重恢復(fù)情況下設(shè)置這個(gè)參數(shù),在這種情況下你需要返回到一個(gè)狀態(tài),該狀態(tài)本身是在一次時(shí)間點(diǎn)恢復(fù)之后到達(dá)的。 相關(guān)討論見第 25.3.5 節(jié)。

recovery_target_action (enum)

指定在達(dá)到恢復(fù)目標(biāo)時(shí)服務(wù)器應(yīng)該立刻采取的動(dòng)作。默認(rèn)動(dòng)作是pause,這表示恢復(fù)將會(huì)被暫停。 promote表示恢復(fù)處理將會(huì)結(jié)束并且服務(wù)器將開始接受連接。 最后,shutdown將在達(dá)到恢復(fù)目標(biāo)之后停止服務(wù)器。

使用pause設(shè)置的目的是:如果這個(gè)恢復(fù)目標(biāo)就是恢復(fù)最想要的位置,就允許對(duì)數(shù)據(jù)庫執(zhí)行查詢。 暫停的狀態(tài)可以使用pg_wal_replay_resume()(見表 9.87)繼續(xù),這會(huì)讓恢復(fù)終結(jié)。 如果這個(gè)恢復(fù)目標(biāo)不是想要的停止點(diǎn),那么關(guān)閉服務(wù)器,將恢復(fù)目標(biāo)設(shè)置改為一個(gè)稍后的目標(biāo)并且重啟以繼續(xù)恢復(fù)。

要讓實(shí)例在想要的重放點(diǎn)那里準(zhǔn)備好,shutdown設(shè)置可以派上用場(chǎng)。 該實(shí)例將仍能重放更多 WAL 記錄(并且事實(shí)上將不得不重放從下一次它被啟動(dòng)后最后一個(gè)檢查點(diǎn)以來的 WAL 記錄)。

注意由于在recovery_target_action被設(shè)置為shutdown時(shí),recovery.signal將不會(huì)被移除, 任何后續(xù)的啟動(dòng)都將會(huì)以立刻關(guān)閉為終結(jié),除非該配置被改變或者recovery.signal文件被手工移除。

如果沒有設(shè)置恢復(fù)目標(biāo),這個(gè)設(shè)置沒有效果。 如果沒有啟用hot_standby,pause設(shè)置的動(dòng)作將和shutdown一樣。 如果在升級(jí)期間達(dá)到恢復(fù)目標(biāo),pause 的設(shè)置將與 promote的行為相同。

在任何情況下,如果已配置了恢復(fù)目標(biāo),但歸檔恢復(fù)在達(dá)到目標(biāo)之前結(jié)束,則服務(wù)器將關(guān)閉,并出現(xiàn)致命錯(cuò)誤。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)