1. 使用pg_dump/pg_restore進行邏輯恢復
這是PostgreSQL最常用的邏輯備份恢復方法,適用于常規數據丟失場景。首先通過pg_dump
導出數據庫為SQL或自定義格式(.dump)文件,再通過pg_restore
或psql
導入到目標數據庫。若需恢復特定時間點數據,可使用pg_dump
的--stop-at
選項指定時間點(如--stop-at='2025-10-17 14:30:00'
),僅導出該時間點前的數據;恢復時添加--data-only
選項可僅恢復數據(不包含表結構)。操作前需停止PostgreSQL服務以保證數據一致性。
2. 物理備份與WAL日志恢復(時間點恢復)
物理備份通過pg_basebackup
工具創建數據庫集群的完整副本(包含數據目錄),結合WAL(Write-Ahead Logging)日志可實現任意時間點恢復。步驟如下:停止PostgreSQL服務,使用pg_basebackup
備份數據目錄(pg_basebackup -h hostname -U username -D /path/to/backup -F t -z -P -X stream -R
);將備份恢復到數據目錄后,利用WAL日志重放后續變更(通過pg_resetwal
或pg_waldump
工具查看并應用WAL日志)。此方法適用于大規模數據庫或需要精確到秒級恢復的場景。
3. 使用pg_dirtyread擴展恢復已刪除數據
若數據被DELETE
或UPDATE
操作刪除但未被VACUUM
清理,可通過pg_dirtyread
擴展讀取MVCC(多版本并發控制)機制下的“dead”元組。操作步驟:安裝擴展(CREATE EXTENSION IF NOT EXISTS pg_dirtyread;
);通過擴展查詢表數據(SELECT * FROM tablename USING pg_dirtyread('tablename');
)。注意:此方法僅能恢復未被覆蓋的數據,且需數據庫處于運行狀態。
4. 使用pg_resetwal修復WAL日志問題
當WAL日志文件損壞或丟失導致數據庫無法啟動時,可使用pg_resetwal
工具重置WAL日志和pg_control
文件。操作前需停止PostgreSQL服務并備份數據目錄(cp -R /var/lib/pgsql/data /var/lib/pgsql/data_backup
);執行命令(pg_resetwal -D /var/lib/pgsql/data -f
)重置WAL日志;啟動PostgreSQL服務后,需重新創建數據庫或從備份恢復數據。此方法會丟失未提交事務,需謹慎使用。
5. 第三方工具輔助恢復
barman.conf
文件,添加服務器信息(如[barman]
部分設置ssh
、port
、dbname
等);通過barman backup dbname
命令執行備份;恢復時使用barman recover dbname /path/to/recovery.conf
命令恢復到指定目錄。pg_rewind
快速同步。安裝工具(sudo yum install postgresql12-pg_rewind
);執行命令(pg_rewind --target-pgdata=/var/lib/pgsql/data --source-server='host=source_host dbname=database_name user=username password=password'
)同步數據。6. 恢復前的關鍵注意事項
pg_dump
導出到新文件),防止恢復過程中數據進一步損壞。postgres
用戶);備份與恢復的PostgreSQL版本需一致,避免兼容性問題。VACUUM
或VACUUM FULL
,MVCC元組可能已被清理,恢復成功率會降低。