PostgreSQL pg_receivewal

2021-09-13 16:21 更新

pg_receivewal — 以流的方式從一個(gè)PostgreSQL服務(wù)器得到預(yù)寫式日志

大綱

pg_receivewal [option...]

描述

pg_receivewal被用來從一個(gè)運(yùn)行著的PostgreSQL集簇以流的方式得到預(yù)寫式日志。預(yù)寫式日志會(huì)被使用流復(fù)制協(xié)議以流的方式傳送,并且被寫入到文件的一個(gè)本地目錄。這個(gè)目錄可以被用作歸檔位置來做一次使用時(shí)間點(diǎn)恢復(fù)的恢復(fù)(見第 25.3 節(jié))。

當(dāng)預(yù)寫式日志在服務(wù)器上被產(chǎn)生時(shí),pg_receivewal實(shí)時(shí)以流的方式傳輸預(yù)寫式日志,并且不像archive_command那樣等待段完成。由于這個(gè)原因,在使用pg_receivewal時(shí)不必設(shè)置archive_timeout。

與 PostgreSQL 后備服務(wù)器上的 WAL 接收進(jìn)程不同,pg_receivewal默認(rèn)只在一個(gè) WAL 文件被關(guān)閉時(shí)才刷入 WAL 數(shù)據(jù)。要實(shí)時(shí)刷入 WAL 數(shù)據(jù),必須指定選項(xiàng)--synchronous。 由于pg_receivewal不應(yīng)用于WAL,當(dāng)synchronous_commit 等于 remote_apply時(shí),你將不允許它成為同步備用。 如果發(fā)生這樣的情況,它將成為一個(gè)永遠(yuǎn)不能拉起的備用數(shù)據(jù)庫,并且會(huì)導(dǎo)致事務(wù)提交阻塞。 為了避免這種情況,你應(yīng)該為synchronous_standby_names配置一個(gè)適當(dāng)?shù)闹?,或?guī)定為pg_receivewalapplication_name與它不匹配,或?qū)?code class="varname">synchronous_commit的值更改為remote_apply以外的內(nèi)容。

預(yù)寫式日志在一個(gè)常規(guī)PostgreSQL連接上被以流式傳送,并且使用復(fù)制協(xié)議。連接必須由一個(gè)具有REPLICATION權(quán)限(見第 21.2 節(jié))的用戶或者一個(gè)超級(jí)用戶建立,并且pg_hba.conf必須允許復(fù)制連接。服務(wù)器也必須被配置一個(gè)足夠高的 max_wal_senders來至少留出一個(gè)可用會(huì)話給流。

如果該連接丟失,或者它一開始就由于一個(gè)非致命錯(cuò)誤而沒有被建立,pg_receivewal將無限期地重試連接并且盡可能重新建立流。為了避免這種行為,使用-n參數(shù)。

如果不出現(xiàn)致命錯(cuò)誤,pg_receivewal將一直運(yùn)行直至被SIGINT信號(hào)(Control+C)終止。

選項(xiàng)

-D directory
--directory=directory

要把輸出寫到哪個(gè)目錄。

這個(gè)參數(shù)是必需的。

-E lsn
--endpos=lsn

當(dāng)接收到達(dá)指定的LSN時(shí),自動(dòng)停止復(fù)制并且以正常退出狀態(tài)0退出。

如果有一個(gè)記錄的LSN正好等于lsn,則該記錄將會(huì)被處理。

--if-not-exists

當(dāng)指定--create-slot并且具有指定名稱 的槽已經(jīng)存在時(shí)不要拋出錯(cuò)誤。

-n
--no-loop

不要在連接錯(cuò)誤上循環(huán)。相反,碰到一個(gè)錯(cuò)誤時(shí)立刻退出。

--no-sync

這個(gè)選項(xiàng)導(dǎo)致pg_receivewal不強(qiáng)制WAL數(shù)據(jù)被刷回磁盤。這樣會(huì)更快,但是也意味著接下來的操作系統(tǒng)崩潰會(huì)讓W(xué)AL段損壞。通常,這個(gè)選項(xiàng)對(duì)于測(cè)試有用,但不應(yīng)該在對(duì)生產(chǎn)部署進(jìn)行WAL歸檔時(shí)使用。

這個(gè)選項(xiàng)與--synchronous不兼容。

-s interval
--status-interval=interval

指定發(fā)送回服務(wù)器的狀態(tài)包之間的秒數(shù)。這允許我們更容易地監(jiān)控服務(wù)器的進(jìn)度。 一個(gè)零值完全禁用這種周期性的狀態(tài)更新,不過當(dāng)服務(wù)器需要時(shí)還是會(huì)有一個(gè)更新 會(huì)被發(fā)送來避免超時(shí)導(dǎo)致的斷開連接。默認(rèn)值是 10 秒。

-S slotname
--slot=slotname

要求pg_receivewal使用一個(gè)已有的復(fù)制槽(見 第 26.2.6 節(jié))。在使用這個(gè)選項(xiàng)時(shí), pg_receivewal將會(huì)報(bào)告給服務(wù)器一個(gè)刷寫位置,指示每一個(gè) 段是何時(shí)被同步到磁盤的,這樣服務(wù)器可以在不需要該段時(shí)移除它。

當(dāng)pg_receivewal的復(fù)制客戶端在服務(wù)器 上被配置為一個(gè)同步后備時(shí),那么使用一個(gè)復(fù)制槽將會(huì)向服務(wù)器報(bào)告刷寫 位置,但只在一個(gè) WAL 文件被關(guān)閉時(shí)報(bào)告。因此,該配置將導(dǎo)致主服務(wù) 器上的事務(wù)等待很長(zhǎng)的時(shí)間并且無法令人滿意地工作。要讓這種配置工作 正確,還必須制定選項(xiàng)--synchronous(見下文)。

--synchronous

在 WAL 數(shù)據(jù)被收到后立即刷入到磁盤。還要在刷寫后立即向服務(wù)器回送 一個(gè)狀態(tài)包(不考慮--status-interval)。

如果pg_receivewal的復(fù)制客戶端在服務(wù)器 上被配置為一個(gè)同步后備,應(yīng)該指定這個(gè)選項(xiàng)來確保向服務(wù)器發(fā)送及時(shí)的反饋。

-v
--verbose

啟用冗長(zhǎng)模式。

-Z level
--compress=level

啟用預(yù)寫式日志上的gzip壓縮,并且指定壓縮級(jí)別(0到9,0是不壓縮而9是最大壓縮)。所有的文件名后都將被追加后綴.gz

下列命令行選項(xiàng)控制數(shù)據(jù)庫連接參數(shù)。

-d connstr
--dbname=connstr

指定用于連接到服務(wù)器的參數(shù),作為 連接字符串;這些將覆蓋所有沖突的命令行選項(xiàng)。

為了和其他客戶端應(yīng)用一致,該選項(xiàng)被稱為--dbname。但是因?yàn)?span id="p0nsbdh" class="application">pg_receivewal并不連接到集簇中的任何特定數(shù)據(jù)庫,連接字符串中的數(shù)據(jù)庫名將被忽略。

-h host
--host=host

指定運(yùn)行服務(wù)器的機(jī)器的主機(jī)名。如果該值以一個(gè)斜線開始,它被用作 Unix 域套接字的目錄。默認(rèn)值取自PGHOST環(huán)境變量(如果設(shè)置),否則會(huì)嘗試一個(gè) Unix 域套接字連接。

-p port
--port=port

指定服務(wù)器正在監(jiān)聽連接的 TCP 端口或本地 Unix 域套接字文件擴(kuò)展。默認(rèn)用PGPORT環(huán)境變量中的值(如果設(shè)置),或者一個(gè)編譯在程序中的默認(rèn)值。

-U username
--username=username

要作為哪個(gè)用戶連接。

-w
--no-password

從不發(fā)出一個(gè)口令提示。如果服務(wù)器要求口令認(rèn)證并且沒有其他方式提供口令(例如一個(gè).pgpass文件),那兒連接嘗試將失敗。這個(gè)選項(xiàng)對(duì)于批處理任務(wù)和腳本有用,因?yàn)樵谄渲袥]有一個(gè)用戶來輸入口令。

-W
--password

強(qiáng)制pg_receivewal在連接到一個(gè)數(shù)據(jù)庫之前提示要求一個(gè)口令。

這個(gè)選項(xiàng)不是必不可少的,因?yàn)槿绻?wù)器要求口令認(rèn)證,pg_receivewal將自動(dòng)提示要求一個(gè)口令。但是,pg_receivewal將浪費(fèi)一次連接嘗試來發(fā)現(xiàn)服務(wù)器想要一個(gè)口令。在某些情況下值得用-W來避免額外的連接嘗試。

為了控制物理復(fù)制槽,pg_receivewal 可以執(zhí)行下列兩種動(dòng)作之一:

--create-slot

--slot中指定的名稱創(chuàng)建一個(gè)新的物理復(fù)制槽, 然后退出。

--drop-slot

刪除--slot中指定的復(fù)制槽,然后退出。

其他選項(xiàng)也可用:

-V
--version

打印pg_receivewal版本并退出。

-?
--help

顯示有關(guān)pg_receivewal命令行參數(shù)的幫助并退出。

退出狀態(tài)

在被SIGINT信號(hào)終止(沒有正常的方式結(jié)束它。因此這不是一種錯(cuò)誤)時(shí),pg_receivewal將以狀態(tài)0退出。 對(duì)于致命錯(cuò)誤或者其他信號(hào),退出狀態(tài)將不是零。

環(huán)境

和大部分其他PostgreSQL工具相似,這個(gè)工具也使用libpq(見第 33.14 節(jié))支持的環(huán)境變量。

環(huán)境變量PG_COLOR規(guī)定在診斷消息中是否使用顏色。可能的值為always、auto、never。

注解

在使用pg_receivewal替代 archive_command作為主要的 WAL 備份方法時(shí), 強(qiáng)烈建議使用復(fù)制槽。否則,服務(wù)器可能會(huì)在預(yù)寫式日志文件被備份好之前重用 或者移除它們,因?yàn)闆]有任何信息(不管是來自 archive_command或是復(fù)制槽)能夠指示 WAL 流已 經(jīng)被歸檔到什么程度。不過要注意,如果接收者沒有持續(xù)地取走 WAL 數(shù)據(jù), 一個(gè)復(fù)制槽將會(huì)填滿服務(wù)器的磁盤空間。

如果在源集簇上啟用了組權(quán)限,pg_receivewal將保留接收到的WAL文件上的組權(quán)限。

例子

要從位于mydbserver的服務(wù)器流式傳送預(yù)寫式日志并且將它存儲(chǔ)在本地目錄/usr/local/pgsql/archive

$ pg_receivewal -h mydbserver -D /usr/local/pgsql/archive


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)