2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

pg_basebackup

pg_basebackup — 備份 PostgreSQL 叢集的基線備份

概要

pg_basebackup [選項...]

描述

pg_basebackup 用於備份正在執行的 PostgreSQL 資料庫叢集的基線備份。備份操作不會影響資料庫的其他客戶端,可用於時間點恢復(參見 第 25.3 節)以及作為日誌傳輸或流複製備用伺服器的起點(參見 第 26.2 節)。

pg_basebackup 可以進行完全基線備份或增量基線備份。當用於完全備份時,它會複製資料庫叢集檔案的精確副本。當用於增量備份時,某些原本會包含在完全備份中的檔案可能會被替換為同一檔案的增量版本,僅包含自參考備份以來已修改的塊。增量備份不能直接使用;而是必須先使用 pg_combinebackup 將其與它所依賴的先前備份合併。有關增量備份的更多資訊,請參見 第 25.3.3 節,有關從備份恢復的步驟,請參見 第 25.3.5 節

在任何模式下,pg_basebackup 都會自動將伺服器置於備份模式並從中退出。備份始終針對整個資料庫叢集進行;無法備份單個數據庫或資料庫物件。對於選擇性備份,必須使用另一個工具,例如 pg_dump

備份透過使用複製協議的常規 PostgreSQL 連線進行。連線必須使用具有 REPLICATION 許可權(參見 第 21.2 節)或超級使用者的使用者 ID 進行,並且 pg_hba.conf 必須允許複製連線。伺服器還必須配置 max_wal_senders 以提供足夠的 walsender(至少一個用於備份,一個用於 WAL 流式傳輸(如果使用))。

可以同時執行多個 pg_basebackup,但從效能角度來看,通常最好只進行一次備份,然後複製結果。

pg_basebackup 不僅可以從主伺服器,還可以從備用伺服器進行基線備份。要從備用伺服器備份,請將備用伺服器設定為可以接受複製連線(即,設定 max_wal_sendershot_standby,並相應地配置其 pg_hba.conf)。您還需要在主伺服器上啟用 full_page_writes

請注意,從備用伺服器備份存在一些限制

  • 備份歷史檔案未在備份的資料庫叢集中建立。

  • pg_basebackup 無法強制備用伺服器在備份結束時切換到新的 WAL 檔案。當使用 -X none 時,如果主伺服器上的寫入活動量較低,pg_basebackup 可能需要等待很長時間才能完成備份所需的最後一個 WAL 檔案的切換和歸檔。在這種情況下,執行主伺服器上的 pg_switch_wal 以觸發即時 WAL 檔案切換可能很有用。

  • 如果在備份期間備用伺服器被提升為主伺服器,備份將失敗。

  • 備份所需的所有 WAL 記錄都必須包含足夠的全頁寫入,這要求您在主伺服器上啟用 full_page_writes

每當 pg_basebackup 進行基線備份時,伺服器的 pg_stat_progress_basebackup 檢視將報告備份的進度。有關詳細資訊,請參見 第 27.4.6 節

選項

以下命令列選項控制輸出的位置和格式

-D directory
--pgdata=directory

設定輸出目標目錄。如果該目錄不存在,pg_basebackup 將建立該目錄(以及任何缺失的父目錄)。如果該目錄已存在,則必須為空。

當備份為 tar 格式時,目標目錄可以指定為 -(連字元),這會將 tar 檔案寫入 stdout

此選項是必需的。

-F format
--format=format

選擇輸出格式。 格式 可以是以下之一

p
plain

將輸出寫入普通檔案,其佈局與源伺服器的資料目錄和表空間相同。當叢集沒有額外的表空間時,整個資料庫將放在目標目錄中。如果叢集包含額外的表空間,則主資料目錄將放在目標目錄中,但所有其他表空間將放在源伺服器上具有的相同絕對路徑中。(有關更改,請參見 --tablespace-mapping。)

這是預設格式。

t
tar

將輸出寫入目標目錄中的 tar 檔案。主資料目錄的內容將寫入名為 base.tar 的檔案,每個其他表空間將寫入一個單獨的 tar 檔案,該檔案以表空間的 OID 命名。

如果目標目錄指定為 -(連字元),則 tar 內容將寫入標準輸出,適合透過管道傳輸到(例如)gzip。僅當叢集沒有額外的表空間並且未使用 WAL 流式傳輸時,才允許這樣做。

-i old_manifest_file
--incremental=old_manifest_file

執行增量備份。必須提供參考備份的備份清單,並將其上傳到伺服器,伺服器將響應傳送請求的增量備份。

-R
--write-recovery-conf

在目標目錄(或使用 tar 格式時的基礎存檔檔案內)中建立 standby.signal 檔案,並將連線設定追加到 postgresql.auto.conf 檔案。這有助於使用備份結果設定備用伺服器。

postgresql.auto.conf 檔案將記錄連線設定,如果指定,還將記錄 pg_basebackup 使用的複製槽,以便流複製和邏輯複製槽同步之後可以使用相同的設定。僅當在連線字串或環境變數中顯式指定了 dbname 時,才會記錄 dbname。

-t target
--target=target

指示伺服器將基線備份放在何處。預設目標是 client,它指定備份應傳送到執行 pg_basebackup 的機器。如果目標設定為 server:/some/path,則備份將儲存在伺服器所在的機器的 /some/path 目錄中。將備份儲存在伺服器上需要超級使用者許可權或 pg_write_server_files 角色的許可權。如果目標設定為 blackhole,則內容將被丟棄,不會儲存在任何地方。這僅用於測試目的,因為您最終不會得到實際備份。

由於 WAL 流式傳輸是由 pg_basebackup 而不是伺服器實現的,因此此選項不能與 -Xstream 一起使用。由於這是預設設定,當指定此選項時,您還必須指定 -Xfetch-Xnone

-T olddir=newdir
--tablespace-mapping=olddir=newdir

在備份期間,將目錄 olddir 中的表空間重新定位到 newdir。為了生效,olddir 必須與表空間在源伺服器上定義時的路徑規範完全匹配。(但如果源伺服器上 olddir 中沒有表空間,也不是錯誤。)同時,newdir 是接收主機檔案系統中的一個目錄。與主目標目錄一樣,newdir 不需要預先存在,但如果存在,則必須為空。 olddirnewdir 都必須是絕對路徑。如果任一路徑需要包含等號(=),則在其前面加上反斜槓。此選項可以多次指定用於多個表空間。

如果以這種方式重新定位表空間,主資料目錄中的符號連結將被更新以指向新位置。因此,新的資料目錄已準備好用於新的伺服器例項,所有表空間都位於更新後的位置。

目前,此選項僅適用於普通輸出格式;如果選擇了 tar 格式,則會忽略此選項。

--waldir=waldir

設定寫入 WAL(預寫日誌)檔案的目錄。預設情況下,WAL 檔案將放置在目標目錄的 pg_wal 子目錄中,但此選項可用於將它們放在其他位置。 waldir 必須是絕對路徑。與主目標目錄一樣,waldir 不需要預先存在,但如果存在,則必須為空。此選項只能在備份為普通格式時指定。

-X method
--wal-method=method

在備份中包含所需的 WAL(預寫日誌)檔案。這將包含備份期間生成的所有預寫日誌。除非指定了 none 方法,否則可以在目標目錄中啟動 postmaster,而無需查閱 WAL 存檔,從而使輸出成為完全獨立的備份。

支援以下用於收集預寫日誌的 方法

n
none

不在備份中包含預寫日誌。

f
fetch

預寫日誌檔案在備份結束時收集。因此,源伺服器的 wal_keep_size 引數必須設定得足夠高,以至於所需的日誌資料在備份結束前不會被刪除。如果所需的日誌資料在需要傳輸之前已被回收,備份將失敗且無法使用。

使用 tar 格式時,預寫日誌檔案將包含在 base.tar 檔案中。

s
stream

在備份進行期間流式傳輸預寫日誌資料。此方法將開啟到伺服器的第二個連線,並在執行備份的同時並行流式傳輸預寫日誌。因此,它將需要兩個複製連線,而不僅僅是一個。只要客戶端能夠跟上預寫日誌資料,使用此方法就不需要在源伺服器上儲存任何額外的預寫日誌。

使用 tar 格式時,預寫日誌檔案將寫入一個名為 pg_wal.tar 的單獨檔案(如果伺服器版本早於 10,則檔名為 pg_xlog.tar)。

此值為預設值。

-z
--gzip

啟用 tar 檔案輸出的 gzip 壓縮,使用預設的壓縮級別。僅在使用 tar 格式時才可用壓縮,並且字尾 .gz 將自動新增到所有 tar 檔名。

-Z level
-Z [{client|server}-]method[:detail]
--compress=level
--compress=[{client|server}-]method[:detail]

請求壓縮備份。如果包含 clientserver,則指定壓縮的位置。在伺服器上壓縮將減少傳輸頻寬,但會增加伺服器的 CPU 消耗。預設值為 client,除非使用了 --target。在這種情況下,備份不會發送到客戶端,因此只有伺服器端壓縮是合理的。當使用 -Xstream(這是預設設定)時,WAL 不會應用伺服器端壓縮。要壓縮 WAL,請使用客戶端壓縮,或指定 -Xfetch

壓縮方法可以設定為 gziplz4zstdnone(無壓縮)或整數(0 表示無壓縮,大於 0 表示 gzip)。可以選擇性地指定壓縮詳細資訊字串。如果詳細資訊字串是整數,則它指定壓縮級別。否則,它應該是一個逗號分隔的關鍵字列表,每個關鍵字的形式為 keywordkeyword=value。目前支援的關鍵字是 levellongworkers。當壓縮方法指定為純整數時,不能使用詳細資訊字串。

如果未指定壓縮級別,將使用預設壓縮級別。如果僅指定級別而未提及演算法,則當級別大於 0 時使用 gzip 壓縮,當級別為 0 時不使用壓縮。

當 tar 格式與 gziplz4zstd 一起使用時,字尾 .gz.lz4.zst 將分別自動新增到所有 tar 檔名。當使用普通格式時,不能指定客戶端壓縮,但仍然可以請求伺服器端壓縮。如果這樣做,伺服器將壓縮備份進行傳輸,然後客戶端將解壓縮並提取它。

當此選項與 -Xstream 結合使用時,如果選擇了客戶端 gzip 壓縮,則 pg_wal.tar 將使用 gzip 壓縮,但如果選擇了任何其他壓縮演算法或選擇了伺服器端壓縮,則不會壓縮。

以下命令列選項控制備份的生成和程式的呼叫

-c {fast|spread}
--checkpoint={fast|spread}

將檢查點模式設定為快速(即時)或分佈(預設)(參見 第 25.3.4 節)。

-C
--create-slot

指定應在開始備份之前建立由 --slot 選項命名的複製槽。如果該槽已存在,則會引發錯誤。

-l label
--label=label

設定備份的標籤。如果未指定,將使用預設值 pg_basebackup base backup

-n
--no-clean

預設情況下,當 pg_basebackup 因錯誤而中止時,它會刪除在發現無法完成任務之前可能建立的任何目錄(例如,目標目錄和預寫日誌目錄)。此選項會阻止清理,因此對除錯很有用。

請注意,表空間目錄無論如何都不會被清理。

-N
--no-sync

預設情況下,pg_basebackup 將等待所有檔案安全寫入磁碟。此選項使 pg_basebackup 在不等待的情況下返回,這更快,但意味著後續的作業系統崩潰可能會導致基線備份損壞。通常,此選項對測試有用,但不應在建立生產環境時使用。

-P
--progress

啟用進度報告。啟用此選項將在備份過程中提供近似的進度報告。由於資料庫在備份期間可能會發生變化,因此這只是一個近似值,可能不會精確地結束於 100%。特別是,當 WAL 日誌包含在備份中時,無法提前估計資料總量,在這種情況下,一旦估計值超過不包含 WAL 的總估計值,估計目標大小就會增加。

-r rate
--max-rate=rate

設定從源伺服器收集資料的最大傳輸速率。這有助於限制 pg_basebackup 對伺服器的影響。值以千位元組/秒為單位。使用 M 字尾表示兆位元組/秒。也接受 k 字尾,無實際效果。有效值介於每秒 32 千位元組和每秒 1024 兆位元組之間。

此選項始終影響資料目錄的傳輸。僅當收集方法為 fetch 時,才會影響 WAL 檔案的傳輸。

-S slotname
--slot=slotname

此選項只能與 -X stream 一起使用。它會導致 WAL 流式傳輸使用指定的複製槽。如果基線備份將用作具有複製槽的流複製備用伺服器,則備用伺服器應使用與 primary_slot_name 相同的複製槽名稱。這可確保主伺服器不會在基線備份結束和新備用伺服器上開始流複製之間刪除任何必要的 WAL 資料。

指定的複製槽必須存在,除非還使用了 -C 選項。

如果未指定此選項,並且伺服器支援臨時複製槽(10 版及更高版本),則會自動為 WAL 流式傳輸使用臨時複製槽。

--sync-method=method

當設定為 fsync(這是預設值)時,pg_basebackup 將遞迴開啟並同步備份目錄中的所有檔案。當使用普通格式時,檔案搜尋將遵循 WAL 目錄和每個配置的表空間的符號連結。

在 Linux 上,也可以使用 syncfs 來要求作業系統同步包含備份目錄的整個檔案系統。當使用普通格式時,pg_basebackup 還會同步包含 WAL 檔案和每個表空間的檔案系統。有關使用 syncfs 時需要注意的注意事項,請參見 recovery_init_sync_method

當使用 --no-sync 時,此選項無效。

-v
--verbose

啟用詳細模式。將在啟動和關閉期間輸出一些額外步驟,如果同時啟用了進度報告,還將顯示當前正在處理的檔名。

--manifest-checksums=algorithm

指定應應用於備份清單中每個檔案的校驗和演算法。目前,可用演算法為 NONECRC32CSHA224SHA256SHA384SHA512。預設值為 CRC32C

如果選擇了 NONE,備份清單將不包含任何校驗和。否則,它將包含備份中每個檔案的校驗和,使用指定的演算法。此外,清單將始終包含其自身內容的 SHA256 校驗和。SHA 演算法比 CRC32C 更消耗 CPU,因此選擇其中一種可能會增加完成備份所需的時間。

使用 SHA 雜湊函式為每個檔案提供密碼學安全的摘要,供希望驗證備份未被篡改的使用者使用,而 CRC-32C 演算法提供了一個計算速度快得多的校驗和;它能很好地捕獲由意外更改引起錯誤,但不抵抗惡意修改。請注意,為了能對抗有權訪問備份的對手,備份清單需要儲存在其他安全的地方,或以其他方式驗證自備份以來未被修改。

pg_verifybackup 可用於根據備份清單檢查備份的完整性。

--manifest-force-encode

強制備份清單中的所有檔名進行十六進位制編碼。如果未指定此選項,則僅對非 UTF-8 檔名進行十六進位制編碼。此選項主要用於測試讀取備份清單檔案的工具能否正確處理這種情況。

--no-estimate-size

阻止伺服器估計將要流式傳輸的備份資料總量,導致 pg_stat_progress_basebackup 檢視中的 backup_total 列始終為 NULL

在沒有此選項的情況下,備份將首先列舉整個資料庫的大小,然後返回併發送實際內容。這可能會使備份花費更長的時間,特別是,在傳送第一個資料之前會花費更長的時間。如果此估算時間過長,此選項有助於避免這種估算時間。

使用 --progress 時不允許使用此選項。

--no-manifest

停用備份清單的生成。如果未指定此選項,伺服器將生成併發送一個備份清單,可以使用 pg_verifybackup 來驗證該清單。清單是備份中包含的所有檔案的列表,不包括可能包含的任何 WAL 檔案。它還儲存每個檔案的大小、最後修改時間和可選的校驗和。

--no-slot

防止為備份建立臨時複製槽。

預設情況下,如果選擇了日誌流式傳輸但未在 -S 選項中提供槽名稱,則會建立臨時複製槽(如果源伺服器支援)。

此選項的主要目的是允許在伺服器沒有可用複製槽時進行基線備份。幾乎總是首選使用複製槽,因為它能防止伺服器在備份期間刪除必要的 WAL。

--no-verify-checksums

停用校驗和的驗證,如果它們在從中獲取基線備份的伺服器上已啟用。

預設情況下,會驗證校驗和,校驗和失敗將導致非零退出狀態。但是,在這種情況下,基線備份不會被刪除,就好像使用了 --no-clean 選項一樣。在 pg_stat_database 檢視中也會報告校驗和驗證失敗。

以下命令列選項控制與源伺服器的連線

-d connstr
--dbname=connstr

指定用於連線伺服器的引數,作為連線字串;這些將覆蓋任何衝突的命令列選項。

此選項的名稱為 --dbname,以與其他客戶端應用程式保持一致;但由於 pg_basebackup 不連線到叢集中的任何特定資料庫,因此伺服器將忽略連線字串中包含的任何資料庫名稱。但是,以這種方式提供的資料庫名稱會覆蓋預設資料庫名稱(replication),以在 ~/.pgpass 中查詢複製連線的密碼。類似地,用於連線 PostgreSQL 的中介軟體或代理可能會使用該名稱來實現連線路由等目的。資料庫名稱也可以由邏輯複製槽同步使用。

-h 主機
--host=主機

指定伺服器所在機器的主機名。如果值以斜槓開頭,則用作 Unix 域套接字的目錄。預設值從 PGHOST 環境變數獲取(如果已設定),否則將嘗試進行 Unix 域套接字連線。

-p
--port=

指定伺服器正在監聽連線的 TCP 埠或本地 Unix 域套接字副檔名。預設值為 PGPORT 環境變數(如果已設定),或者編譯時預設值。

-s interval
--status-interval=interval

指定傳送狀態資料包回源伺服器之間的時間間隔(秒)。較小的值允許更準確地從伺服器監控備份進度。值為零會完全停用週期性狀態更新,儘管在請求時仍會發送更新,以避免基於超時的斷開連線。預設值為 10 秒。

-U 使用者名稱
--username=使用者名稱

指定用於連線的使用者名稱。

-w
--no-password

禁止發出密碼提示。如果伺服器需要密碼身份驗證,而其他方式(如 .pgpass 檔案)不可用,則連線嘗試將失敗。此選項在批處理作業和指令碼中非常有用,因為沒有使用者在場輸入密碼。

-W
--password

強制 pg_basebackup 在連線到源伺服器之前提示輸入密碼。

此選項絕非必需,因為如果伺服器要求密碼身份驗證,pg_basebackup 將自動提示輸入密碼。但是,pg_basebackup 會浪費一次連線嘗試來了解伺服器需要密碼。在某些情況下,鍵入 -W 以避免額外的連線嘗試是值得的。

還提供其他選項

-V
--version

列印 pg_basebackup 版本並退出。

-?
--help

顯示有關 pg_basebackup 命令列引數的幫助,然後退出。

環境變數

此實用程式與大多數其他 PostgreSQL 實用程式一樣,使用 libpq 支援的環境變數(參見 第 32.15 節)。

環境變數 PG_COLOR 指定是否在診斷訊息中使用顏色。可能的值為 alwaysautonever

註釋

在備份開始時,需要在源伺服器上執行檢查點。這可能需要一些時間(尤其是在未選擇選項 --checkpoint=fast 時),在此期間 pg_basebackup 可能會顯示為閒置。

備份將包括資料目錄和表空間中的所有檔案,包括配置檔案以及第三方放置在目錄中的任何其他檔案,但某些由 PostgreSQL 管理的臨時檔案和作業系統檔案除外。但只複製常規檔案和目錄,除非保留了用作表空間的符號連結。指向 PostgreSQL 已知某些目錄的符號連結將被複製為空目錄。其他符號連結和特殊裝置檔案將被跳過。有關精確詳細資訊,請參見 第 54.4 節

在普通格式下,表空間將備份到其在源伺服器上的相同路徑,除非使用了 --tablespace-mapping 選項。如果未使用此選項,在與伺服器相同的宿主機器上執行普通格式的基線備份時,如果使用了表空間,將無法正常工作,因為備份必須寫入與原始表空間相同的目錄位置。

使用 tar 格式時,使用者有責任在啟動使用資料的 PostgreSQL 伺服器之前解壓每個 tar 檔案。如果存在其他表空間,則需要將它們的 tar 檔案解壓到正確的位置。在這種情況下,這些表空間的符號連結將由伺服器根據包含在 base.tar 檔案中的 tablespace_map 檔案內容建立。

pg_basebackup 可與相同或較舊的主要版本的伺服器一起使用,最低可達 9.1。但是,WAL 流式傳輸模式(-X stream)僅適用於伺服器版本 9.3 及更高版本,tar 格式(--format=tar)僅適用於伺服器版本 9.5 及更高版本,增量備份(--incremental)僅適用於伺服器版本 17 及更高版本。

pg_basebackup 將保留資料檔案的組許可權,如果源叢集上啟用了組許可權。

示例

要建立伺服器 mydbserver 的基線備份並將其儲存在本地目錄 /usr/local/pgsql/data

$ pg_basebackup -h mydbserver -D /usr/local/pgsql/data

要為每個表空間建立一個壓縮的 tar 檔案來備份本地伺服器,並將其儲存在 backup 目錄中,同時顯示進度報告

$ pg_basebackup -D backup -Ft -z -P

要備份單個表空間的本地資料庫,並使用 bzip2 壓縮

$ pg_basebackup -D - -Ft -X fetch | bzip2 > backup.tar.bz2

(如果資料庫中有多個表空間,此命令將失敗。)

要建立本地資料庫的備份,其中 /opt/ts 中的表空間被重新定位到 ./backup/ts

$ pg_basebackup -D backup/data -T /opt/ts=$(pwd)/backup/ts

要建立本地伺服器的備份,其中每個表空間的檔案都使用 gzip 以級別 9 壓縮,並存儲在 backup 目錄中

$ pg_basebackup -D backup -Ft --compress=gzip:9

另請參閱

pg_dump第 27.4.6 節

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步說明的內容,請使用此表格報告文件問題。