PostgreSQL物理備份與搭建從庫詳細(xì)過程
在 PostgreSQL 中,物理備份(Physical Backup)是 PostgreSQL 高可用、災(zāi)難恢復(fù)和搭建從庫(Standby)的核心手段。
一、物理備份基礎(chǔ)概念
1.1 什么是物理備份?
物理備份是指直接復(fù)制 PostgreSQL 的數(shù)據(jù)文件(即 $PGDATA 目錄下的所有文件),包括:
- 表數(shù)據(jù)文件(
base/) - WAL 日志(
pg_wal/) - 控制文件(
global/pg_control) - 配置文件(
postgresql.conf,pg_hba.conf等)
與邏輯備份(pg_dump)不同,物理備份:
- 保留數(shù)據(jù)庫內(nèi)部結(jié)構(gòu)(如 OID、文件布局);
- 恢復(fù)速度極快(直接拷貝文件);
- 支持時間點(diǎn)恢復(fù)(PITR)(配合 WAL 歸檔);
- 可用于搭建流復(fù)制從庫。
1.2 物理備份的前提條件
要執(zhí)行有效的物理備份,必須滿足:
wal_level >= replica(默認(rèn)replica即可);- 啟用連續(xù)歸檔(Continuous Archiving)或使用
pg_basebackup -X stream; - 備份期間數(shù)據(jù)庫可正常運(yùn)行(熱備份);
- 所有節(jié)點(diǎn) PostgreSQL 版本、操作系統(tǒng)架構(gòu)一致(主從搭建時)。
二、物理備份的兩種主流方法
2.1 方法一:使用 pg_basebackup(官方推薦)
pg_basebackup 是 PostgreSQL 自帶的工具,專為創(chuàng)建基礎(chǔ)備份(Base Backup)設(shè)計,支持流式傳輸 WAL,操作簡單、安全可靠。
基本語法
pg_basebackup [選項] -D <目標(biāo)目錄>
常用選項說明
| 選項 | 說明 |
|---|---|
-h <host> | 主庫 IP 或主機(jī)名 |
-U <user> | 復(fù)制用戶(需 REPLICATION 權(quán)限) |
-D <dir> | 備份輸出目錄 |
-Fp / -Ft | 輸出格式:plain(默認(rèn))或 tar |
-X stream | 同時流式接收 WAL,避免備份期間 WAL 被清理 |
-P | 顯示進(jìn)度 |
-v | 詳細(xì)輸出 |
-R | 自動生成 standby 配置(用于搭建從庫) |
-C | 在主庫創(chuàng)建復(fù)制槽(防止 WAL 過早回收) |
-S <slot_name> | 指定復(fù)制槽名稱 |
實(shí)戰(zhàn):創(chuàng)建物理備份(用于 PITR)
# 創(chuàng)建備份目錄 mkdir -p /backup/base_$(date +%Y%m%d) # 執(zhí)行備份 pg_basebackup -h 192.168.10.50 \ -U repuser \ -D /backup/base_$(date +%Y%m%d) \ -Fp -P -v -X stream
此備份可用于后續(xù) PITR 恢復(fù),但不能直接啟動為從庫(缺少
standby.signal)。
2.2 方法二:文件系統(tǒng)級快照(LVM/ZFS/Btrfs)
適用于支持快照的存儲系統(tǒng),備份速度接近瞬時,對數(shù)據(jù)庫性能影響極小。
以 LVM 為例
創(chuàng)建快照卷
lvcreate -L 10G -s -n pgdata_snap /dev/vg0/pgdata
快照大小需容納備份期間的寫入量。
掛載快照并拷貝
mkdir /mnt/snap mount /dev/vg0/pgdata_snap /mnt/snap rsync -aHAXx /mnt/snap/ /backup/base_$(date +%Y%m%d)/ umount /mnt/snap
刪除快照
lvremove /dev/vg0/pgdata_snap
優(yōu)勢與限制
- 幾乎零停機(jī)、低 I/O 壓力;
- 依賴特定存儲技術(shù);
- 需手動處理 WAL 歸檔一致性(建議配合
pg_start_backup()/pg_stop_backup())。
注意:PostgreSQL 15+ 已棄用
pg_start_backup(),推薦使用pg_basebackup或存儲快照 + WAL 歸檔。
三、基于物理備份搭建從庫(流復(fù)制 Standby)
物理備份是搭建從庫最標(biāo)準(zhǔn)、最高效的方式。以下演示如何使用 pg_basebackup 一鍵初始化從庫。
3.1 環(huán)境準(zhǔn)備
| 節(jié)點(diǎn) | IP | 角色 |
|---|---|---|
| node1 | 192.168.10.50 | Primary |
| node2 | 192.168.10.51 | Standby |
前提:
- 主庫已配置流復(fù)制(見下文);
- 從庫已安裝相同版本 PostgreSQL;
- 網(wǎng)絡(luò)互通,SSH 免密(可選,用于文件同步)。
3.2 主庫配置(node1)
1. 修改postgresql.conf
listen_addresses = '*' wal_level = replica max_wal_senders = 10 wal_keep_size = 1GB # PG 13+,舊版用 wal_keep_segments hot_standby = on
2. 配置pg_hba.conf
# 允許復(fù)制連接 host replication repuser 192.168.10.51/32 md5
3. 創(chuàng)建復(fù)制用戶
CREATE USER repuser WITH REPLICATION ENCRYPTED PASSWORD 'replpass123';
4. 重載配置
pg_ctl reload -D $PGDATA
3.3 從庫初始化(node2)
步驟 1:停止 PostgreSQL(如有)
sudo systemctl stop postgresql-14
步驟 2:清空數(shù)據(jù)目錄
rm -rf /var/lib/pgsql/14/data/*
步驟 3:使用 pg_basebackup 初始化
sudo -u postgres pg_basebackup \ -h 192.168.10.50 \ -U repuser \ -D /var/lib/pgsql/14/data \ -P -v -R -X stream -C -S standby_slot_1
關(guān)鍵選項解釋:
-R:自動生成standby.signal和postgresql.auto.conf(含primary_conninfo);-C -S:在主庫創(chuàng)建名為standby_slot_1的復(fù)制槽,防止 WAL 被過早清理。
步驟 4:驗(yàn)證生成的文件
/var/lib/pgsql/14/data/standby.signal(空文件,標(biāo)識為從庫);postgresql.auto.conf內(nèi)容示例:
primary_conninfo = 'user=repuser password=replpass123 host=192.168.10.50 port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any' primary_slot_name = 'standby_slot_1'
步驟 5:啟動從庫
sudo systemctl start postgresql-14
3.4 驗(yàn)證從庫狀態(tài)
在從庫執(zhí)行:
-- 確認(rèn)處于恢復(fù)模式 SELECT pg_is_in_recovery(); -- 應(yīng)返回 true -- 查看是否只讀 SHOW hot_standby; -- on
在主庫執(zhí)行:
-- 查看復(fù)制狀態(tài) SELECT * FROM pg_stat_replication;
關(guān)鍵字段:
application_name:默認(rèn)為pg_basebackup,可通過-E指定;state:streaming表示正常流復(fù)制;sync_state:async(異步)或sync(同步)。
四、物理備份 + WAL 歸檔實(shí)現(xiàn) PITR
若僅用于災(zāi)難恢復(fù)(非搭建從庫),需配合 WAL 歸檔實(shí)現(xiàn)任意時間點(diǎn)恢復(fù)。
4.1 配置 WAL 歸檔(主庫)
# postgresql.conf archive_mode = on archive_command = 'cp %p /archive/wal/%f'
確保 /archive/wal/ 目錄存在且 PostgreSQL 有寫權(quán)限。
4.2 恢復(fù)流程
停止 PostgreSQL
pg_ctl stop -D $PGDATA
清理原數(shù)據(jù)目錄
rm -rf $PGDATA/*
還原物理備份
cp -r /backup/base_20260210/* $PGDATA/
創(chuàng)建 recovery.signal
touch $PGDATA/recovery.signal
配置恢復(fù)目標(biāo)(可選)
在 $PGDATA/postgresql.auto.conf 中添加:
restore_command = 'cp /archive/wal/%f %p' recovery_target_time = '2026-02-10 18:00:00'
啟動數(shù)據(jù)庫
pg_ctl start -D $PGDATA
數(shù)據(jù)庫將重放 WAL 至目標(biāo)時間點(diǎn),然后自動轉(zhuǎn)為主庫模式。
五、高級技巧與最佳實(shí)踐
5.1 使用復(fù)制槽(Replication Slot)保護(hù) WAL
復(fù)制槽可防止主庫在從庫斷連時清理 WAL,避免從庫無法追平。
創(chuàng)建槽(主庫):
SELECT pg_create_physical_replication_slot('standby1');- 從庫配置中指定槽名(
primary_slot_name)。
注意:需監(jiān)控槽的 lag,避免磁盤爆滿。
5.2 壓縮與遠(yuǎn)程備份
- 壓縮備份:
pg_basebackup ... -Ft | gzip > backup.tar.gz
- 遠(yuǎn)程備份:
pg_basebackup ... -D - | ssh user@remote "cat > backup.tar"
5.3 自動化腳本示例
#!/bin/bash
BACKUP_DIR="/backup/base_$(date +%Y%m%d)"
pg_basebackup -h 192.168.10.50 -U repuser -D "$BACKUP_DIR" -Fp -P -X stream
if [ $? -eq 0 ]; then
echo "Backup succeeded: $BACKUP_DIR"
# 清理7天前的備份
find /backup -name "base_*" -mtime +7 -exec rm -rf {} \;
else
echo "Backup failed!"
exit 1
fi5.4 常見問題排查
| 問題 | 原因 | 解決方案 |
|---|---|---|
pg_basebackup: could not connect to server | 主庫未監(jiān)聽、防火墻、認(rèn)證失敗 | 檢查 listen_addresses、pg_hba.conf、網(wǎng)絡(luò) |
| 從庫啟動報錯 “WAL ends before end of backup” | 備份期間主庫重啟 | 使用 -X stream 或確保 WAL 歸檔完整 |
| 從庫延遲高 | 網(wǎng)絡(luò)慢、主庫負(fù)載高 | 監(jiān)控 pg_stat_replication,優(yōu)化硬件 |
| 無法寫入從庫 | 正常行為 | 從庫為只讀,需 promote 后才可寫 |
六、物理備份 vs 邏輯備份對比
| 維度 | 物理備份 | 邏輯備份 |
|---|---|---|
| 恢復(fù)速度 | 極快(文件拷貝) | 慢(SQL 重放) |
| 備份體積 | 大(含所有文件) | ?。▋H數(shù)據(jù)+DDL) |
| 跨版本遷移 | 不支持(需相同主版本) | 支持(需兼容) |
| 搭建從庫 | 唯一標(biāo)準(zhǔn)方式 | 不可行 |
| PITR 支持 | 是(需 WAL) | 否 |
| 存儲開銷 | 高 | 低 |
結(jié)論:生產(chǎn)環(huán)境高可用架構(gòu)必須依賴物理備份;邏輯備份適用于跨版本遷移或部分表導(dǎo)出。
總結(jié):PostgreSQL 物理備份是構(gòu)建高可用、實(shí)現(xiàn)災(zāi)難恢復(fù)的基石。通過 pg_basebackup,可一鍵完成:
- 安全的熱備份;
- 從庫的快速初始化;
- 與 WAL 歸檔結(jié)合實(shí)現(xiàn) PITR。
關(guān)鍵要點(diǎn):
- 主庫必須配置
wal_level = replica和復(fù)制權(quán)限; - 使用
-R -X stream -C選項簡化從庫搭建; - 復(fù)制槽可防止 WAL 丟失,但需監(jiān)控;
- 定期驗(yàn)證備份可恢復(fù)性。
掌握物理備份技術(shù),是 PostgreSQL DBA 的必備技能。
到此這篇關(guān)于PostgreSQL物理備份與搭建從庫的文章就介紹到這了,更多相關(guān)PostgreSQL物理備份內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于PostgreSQL突然無法啟動的排查過程及解決方法
SQL數(shù)據(jù)庫服務(wù)器無法啟動的原因可能有多種,這篇文章主要介紹了關(guān)于PostgreSQL突然無法啟動的排查過程及解決方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-07-07
PostgreSQL 備份與恢復(fù)實(shí)戰(zhàn)操作pg_dump / pg_restore 
本文將帶你深入掌握 PostgreSQL 最核心的備份恢復(fù)工具 —— pg_dump 和 pg_restore,涵蓋邏輯備份、物理備份、增量備份、自動化腳本等企業(yè)級實(shí)踐,感興趣的朋友跟隨小編一起看看吧2025-10-10
Postgresql數(shù)據(jù)庫之創(chuàng)建和修改序列的操作
這篇文章主要介紹了Postgresql數(shù)據(jù)庫之創(chuàng)建和修改序列的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
pgsql 實(shí)現(xiàn)用戶自定義表結(jié)構(gòu)信息獲取
這篇文章主要介紹了pgsql 實(shí)現(xiàn)用戶自定義表結(jié)構(gòu)信息獲取,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgresSql 多表關(guān)聯(lián)刪除語句的操作
這篇文章主要介紹了PostgresSql 多表關(guān)聯(lián)刪除語句的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

