備份當前數據:無論采用哪種恢復方式,都應先備份現有數據庫集群,防止恢復過程中數據覆蓋或丟失。
執行命令:sudo pg_dumpall -U postgres > /path/to/backup/all-databases.sql
該命令會生成包含所有數據庫結構和數據的SQL備份文件。
停止PostgreSQL服務:恢復操作前需停止服務,確保數據一致性。
執行命令:sudo systemctl stop postgresql
邏輯備份通過pg_dump生成可讀的SQL或自定義格式文件,恢復時通過psql或pg_restore還原數據。
pg_dump生成自定義格式(支持壓縮和并行恢復):pg_dump -Fc laozheng > laozheng.dumppg_dump -Fp laozheng > laozheng.sqlsudo -u postgres pg_restore -d laozheng /path/to/laozheng.dumpsudo -u postgres psql -d laozheng < /path/to/laozheng.sqlsudo -u postgres pg_restore -d laozheng -C /path/to/laozheng.tarpsql -U postgres -d laozheng -c "\dt"驗證表結構及數據。物理備份通過pg_basebackup復制數據庫集群的物理文件(包括數據目錄、WAL日志),恢復速度快,但需停機。
pg_basebackup -Ft -Pv -Xf -z -Z5 -p 5432 -D /backup/full_backup-Ft表示tar格式,-Pv顯示進度,-Xf包含WAL日志,-z壓縮,-Z5壓縮級別5。sudo systemctl stop postgresql/var/lib/postgresql/15/main/):sudo rm -rf /var/lib/postgresql/15/main/*sudo tar -xzf /backup/full_backup/base.tar.gz -C /var/lib/postgresql/15/main/sudo chown -R postgres:postgres /var/lib/postgresql/15/main/sudo systemctl start postgresqlSELECT * FROM key_table LIMIT 10;)。PITR通過WAL(Write-Ahead Logging)日志將數據庫恢復到指定時間點(如某時刻、某事務ID),需提前開啟WAL歸檔。
/etc/postgresql/<版本>/main/postgresql.conf),修改以下參數:wal_level = replica
archive_mode = on
archive_command = 'cp %p /usr/local/pgsql/arch/%f'
max_wal_senders = 2
wal_keep_segments = 100
重啟服務使配置生效:sudo systemctl restart postgresql。pg_basebackup創建全量備份(如備份到/backup/pitr_base):pg_basebackup -D /backup/pitr_base -Ft -Pv -Xf -z -Z5 -p 5432。sudo systemctl stop postgresqlsudo rm -rf /var/lib/postgresql/15/main/*sudo cp -r /backup/pitr_base/* /var/lib/postgresql/15/main/postgresql.auto.conf文件(用于恢復配置):echo "restore_command = 'cp /usr/local/pgsql/arch/%f %p'" >> /var/lib/postgresql/15/main/postgresql.auto.confecho "recovery_target_time = '2025-10-15 14:30:00+08'" >> /var/lib/postgresql/15/main/postgresql.auto.confrecovery_target_time可根據需求改為事務ID,如recovery_target_xid = '12345')sudo systemctl start postgresqljournalctl -u postgresql -f。若WAL日志損壞導致數據庫無法啟動,可使用pg_resetwal工具重置WAL日志(需謹慎操作,可能導致數據丟失)。
sudo systemctl stop postgresqlsudo cp -r /var/lib/postgresql/15/main /var/lib/postgresql/15/main_backuppg_resetwal:sudo pg_resetwal -D /var/lib/postgresql/15/main -f-f參數強制重置,無備份時不建議使用)sudo systemctl start postgresqlsudo -u postgres psql -c "\l"。pg_restore -l列出備份內容)。journalctl -u postgresql -f實時查看日志,及時處理錯誤。