支援版本: 目前 (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 資料庫叢集的基礎備份。備份的製作不會影響資料庫的其他客戶端,可用於時間點恢復(請參閱Section 25.3),也可作為日誌傳輸或串流複寫備用伺服器的起點(請參閱Section 26.2)。

pg_basebackup 可以進行資料庫的完整或增量基礎備份。當用於進行完整備份時,它會製作資料庫叢集檔案的精確副本。 當用於進行增量備份時,完整備份中的某些檔案可能會被替換為相同檔案的增量版本,其中僅包含自參考備份以來已修改的那些區塊。 增量備份無法直接使用;相反,必須先使用 pg_combinebackup 將其與其所依賴的先前備份組合。 有關增量備份的更多資訊,請參閱 Section 25.3.3,有關從備份中恢復的步驟,請參閱 Section 25.3.5

在任何模式下,pg_basebackup 都會確保伺服器自動進入和退出備份模式。備份始終針對整個資料庫叢集進行;無法備份個別資料庫或資料庫物件。對於選擇性備份,必須使用其他工具,例如 pg_dump

備份透過使用複寫協定的常規 PostgreSQL 連線進行。連線必須使用具有 REPLICATION 權限(請參閱Section 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 檢視表都會報告備份的進度。 有關詳細資訊,請參閱 Section 27.4.6

選項

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

-D 目錄
--pgdata=目錄

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

當備份採用 tar 格式時,目標目錄可以指定為 - (dash),導致 tar 檔案寫入到 stdout

此選項為必填項。

-F 格式
--format=格式

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

p
plain

將輸出寫為純文字檔案,其版面配置與來源伺服器的資料目錄和資料表空間相同。當叢集沒有其他資料表空間時,整個資料庫將放置在目標目錄中。如果叢集包含其他資料表空間,則主要資料目錄將放置在目標目錄中,但所有其他資料表空間將放置在與來源伺服器上相同的絕對路徑中。(請參閱 --tablespace-mapping 以變更該設定。)

這是預設格式。

t
tar

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

如果目標目錄指定為 - (破折號),tar 內容會寫入標準輸出,適合用於管線傳輸到 (例如) gzip。只有在叢集沒有額外的表空間且未使用 WAL 串流時,才允許這樣做。

-i old_manifest_file
--incremental=old_manifest_file

執行增量備份。必須提供參考備份的備份資訊清單 (manifest),並上傳到伺服器,伺服器會傳送要求的增量備份做為回應。

-R
--write-recovery-conf

建立一個 standby.signal 檔案,並將連線設定附加到目標目錄中的 postgresql.auto.conf 檔案(或在使用 tar 格式時,附加到基本封存檔案中)。這簡化了使用備份結果設定待機伺服器的流程。

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 都必須是絕對路徑。如果任一路徑需要包含等號 (=),請在其前面加上反斜線。可以多次指定此選項以用於多個表空間。

如果以這種方式重新定位表空間,則會更新主資料目錄內的符號連結,以指向新的位置。因此,新的資料目錄已準備好用於具有更新位置的所有表空間的新伺服器執行個體。

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

--waldir=waldir

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

-X method
--wal-method=method

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

支援以下收集預寫式日誌的 method

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 基本備份

-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 兆位元組之間。

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

-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 雜湊函數可為每個檔案提供密碼學上安全的摘要,供希望驗證備份是否未被竄改的使用者使用,而 CRC32C 演算法提供的檢查碼計算速度更快;它擅長捕獲由於意外更改而導致的錯誤,但無法抵抗惡意修改。請注意,為了有效地對抗可以存取備份的攻擊者,備份清單需要安全地儲存在其他地方,或者以其他方式驗證自備份以來未被修改。

可以使用 pg_verifybackup 來檢查備份的完整性,並與備份清單進行比較。

--manifest-force-encode

強制備份清單中的所有檔案名稱都進行十六進位編碼。如果未指定此選項,則只有非 UTF8 檔案名稱才會進行十六進位編碼。此選項主要用於測試讀取備份清單檔案的工具是否正確處理此情況。

--no-estimate-size

阻止伺服器估計將要串流傳輸的備份資料總量,導致 backup_total 欄位在 pg_stat_progress_basebackup 檢視中始終為 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
--host=host

指定伺服器正在執行的機器的 hostname。如果值以斜線開頭,則將其用作 Unix 域套接字的目錄。預設值取自 PGHOST 環境變數(如果已設定),否則將嘗試 Unix 域套接字連線。

-p port
--port=port

指定伺服器正在監聽連線的 TCP port 或本機 Unix 域套接字檔案擴充功能。預設為 PGPORT 環境變數(如果已設定)或編譯到程式中的預設值。

-s interval
--status-interval=interval

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

-U username
--username=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 已知特定目錄的符號連結將被複製為空目錄。 其他符號連結和特殊裝置檔案將被略過。 有關詳細信息,請參閱第 53.4 節

在 plain 格式中,資料表空間將備份到它們在來源伺服器上擁有的相同路徑,除非使用 --tablespace-mapping 選項。 如果沒有這個選項,如果在與伺服器相同的主機上執行 plain 格式的基本備份,如果正在使用資料表空間,則將無法運作,因為備份必須寫入與原始資料表空間相同的位置。

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

pg_basebackup 可以與相同或更舊的主要版本的伺服器一起運作,最低到 9.1。 但是,WAL 串流模式(-X stream)僅適用於伺服器版本 9.3 及更高版本,而 tar 格式(--format=tar)僅適用於伺服器版本 9.5 及更高版本。

如果來源叢集上啟用了群組權限,則 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

建立本機伺服器的備份,每個資料表空間使用一個 tar 檔案,並使用 9 級的 gzip 壓縮,儲存在目錄 backup

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

另請參閱

pg_dump第 27.4.6 節

提交更正

如果您在文件中看到任何不正確、與您對特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。