Chuyển đến nội dung chính

第 16 課:備份和時間點復原 (PITR)

使用 pg_basebackup,配置 WAL 歸檔、連續歸檔並執行時間點恢復 (PITR)。

🔒 DevSecOps — 第 16 課 第 16 課:備份與時間點復原__HTMLTAG_53___ (PITR)

PostgreSQL 與 Patroni 和 PostgreSQL 高可用性etcd

第 4 部分:備份、監控與調整

xdev.asia

目標____HTMLTAG_68__HTMLTAG_69___完成本課程後,您將:____HTMLTAG_70__HTMLTAG_71__HTMLTAG_72___設定 WAL 檔案____HTMLTAG_73__HTMLTAG_74___使用 pg_執行備份___HTMLTAG_75__HTMLTAG_76___配置連續存檔___HTMLTAG_77__HTMLTAG_78___將資料庫還原到特定時間點____HTMLTAG_79__HTMLTAG_80___自動備援策略___HTMLTAG_81__HTMLTAG_ML82___MLTAG_82___ML_UUU​​T_UU​​T_UU4_​​D_UUU​​T5_​​D_UUU​​T5_​​D____ML82___417_ML備份策略概述___HTMLTAG_86__HTMLTAG_87___1.1。備份類型___HTMLTAG_88__HTMLTAG_89___A。邏輯備份

# pg_dump / pg_dumpall
pg_dump -h localhost -U postgres mydb > mydb.sql
pg_dumpall -h localhost -U postgres > cluster.sql

Pros:

✅ Easy to restore specific tables

✅ Portable across PostgreSQL versions

✅ Human-readable (text)

Cons:

❌ Slow for large databases

❌ Not suitable for PITR

❌ Requires downtime for consistent backup

B。實體備份___HTMLTAG_92__CODEBLOCK_1__HTMLTAG_93___C。連續歸檔(WAL 歸檔)___HTMLTAG_94__CODEBLOCK_2__HTMLTAG_95___1.2。 RTO 和 RPO:目標)= 可接受的資料遺失量是多少?

___CODEBLOCK_4__HTMLTAG_105___1.3。備份策略決策矩陣

__HTMLTAG_108__HTMLTAG_109__HTMLTAG_110__HTMLTAG_111___要求___HTMLTAG_112__HTMLTAG_113___解决方案___HTMLTAG_114 _HTMLTAG_115__HTMLTAG_116__HTMLTAG_117__HTMLTAG_118__HTMLTAG_119___零資料遺失____HTMLTAG_120__HTMLTAG_121___同步複製+ PITR___HTMLTAG_122__HTMLTAG_123__HTMLTAG_124__HTMLTAG_125___快速恢復(<1 小時)HTMLTAG_126__HTMLTAG_127___流式傳輸複製___HTMLTAG_128__HTMLTAG_129__HTMLTAGML4130功能___HTMLTAG_132__HTMLTAG_133___WAL 歸檔 + pg_basebackup___HTMLTAG_134__HTMLTAG_135__HTMLTAG_136__HTMLTAG_137___長期保留___HTMLTAG_138__HTMLTAG_139___定期p g_basebackup___HTMLTAG_140__HTMLTAG_141__HTMLTAG_142__HTMLTAG_143___災難復原___HTMLTAG_144__HTMLTAG_145___場外備援+ PITR___HTMLTAG_146__HTMLTAG_147__HTMLTAG_148__HTMLTAG_149

2。 WAL 歸檔設定___HTMLTAG_152__HTMLTAG_153___2.1。了解 WAL 歸檔___HTMLTAG_154__HTMLTAG_155__HTMLTAG_156___WAL(預先寫入日誌)=交易日誌檔___HTMLTAG_158__CODEBLOCK_5__HTMLTAG_159__HTMLTAG_160___WAL段:___HTMLTAG_162__CODEBLOCK_6__HTMLTAG_163___2.2。設定WAL歸檔___HTMLTAG_164__HTMLTAG_165___PostgreSQL設定___HTMLTAG_166__CODEBLOCK_7__HTMLTAG_167__HTMLTAG_168___參數說明__ _HTMLTAG_169___:___HTMLTAG_170__CODEBLOCK_8__HTMLTAG_171___建立歸檔目錄___HTMLTAG_172__CODEBLOCK_9__HTMLTAG_173___2.3。高階存檔指令___HTMLTAG_174__HTMLTAG_175___A。存檔到遠端伺服器 (rsync)

# archive_command using rsync
archive_command = 'rsync -a %p backup-server:/mnt/wal_archive/%f'

B。存檔至 S3 (wal-g)___HTMLTAG_178__CODEBLOCK_11__HTMLTAG_179___C。壓縮存檔___HTMLTAG_180__CODEBLOCK_12__HTMLTAG_181___2.4。監控歸檔

-- Check archiving status
SELECT archived_count, 
       failed_count,
       last_archived_wal,
       last_archived_time,
       last_failed_wal,
       last_failed_time
FROM pg_stat_archiver;

-- Example output: -- archived_count | failed_count | last_archived_wal | last_archived_time
-- ----------------+--------------+--------------------------+----------------------------- -- 1234 | 0 | 000000010000000000000056 | 2024-11-25 10:30:15.123456

-- If failed_count > 0, check logs!

# Check PostgreSQL logs for archive errors
sudo journalctl -u postgresql | grep -i archive

Common errors:

- Permission denied on archive directory

- Archive directory full

- Network timeout (for remote archiving)

3。使用 pg_basebackup___HTMLTAG_184__HTMLTAG_185___3.1 進行基本備援。基本 pg_basebackup___HTMLTAG_186__CODEBLOCK_15__HTMLTAG_187__HTMLTAG_188___輸出:___HTMLTAG_190__CODEBLOCK_16__HTMLTAG_191___3.2。壓縮的 tar 備援___HTMLTAG_192__CODEBLOCK_17__HTMLTAG_193___3.3。備份到遠端伺服器

___CODEBLOCK_18__HTMLTAG_195___3.4。使用複製槽備份___HTMLTAG_196__CODEBLOCK_19__HTMLTAG_197___3.5。驗證備份___HTMLTAG_198__CODEBLOCK_20__HTMLTAG_199___4。時間點恢復 (PITR)___HTMLTAG_200__HTMLTAG_201___4.1。 PITR 概念___HTMLTAG_202__HTMLTAG_203__HTMLTAG_204___PITR= 将数据库恢复到任何时间点(不仅仅是备份)时间)____HTMLTAG_208__CODEBLOCK_21__HTMLTAG_209__HTMLTAG_210___要求:____HTMLTAG_212__HTMLTAG_213__HTMLTAG_214___基本备份。準備PITR___HTMLTAG_222__HTMLTAG_223__HTMLTAG_224___建立復原目錄:HTMLTAG_226__CODEBLOCK_22 HTMLTAG_227__HTMLTAG_228___恢復基本備份:

CODEBLOCK_23__HTMLTAG_231___4.3。設定恢復___HTMLTAG_232__HTMLTAG_233__HTMLTAG_234___建立恢復設定:___HTMLTAG_236__CODEBLOCK_24__HTMLTAG_237__HTML TAG_238___恢復參數:____HTMLTAG_240__CODEBLOCK_25__HTMLTAG_241___4.4.恢復目標選項___HTMLTAG_242__HTMLTAG_243___A。恢復到特定時間
-- In postgresql.auto.conf
recovery_target_time = '2024-11-25 10:30:00'

B。恢復到特定事務___HTMLTAG_246__CODEBLOCK_27__HTMLTAG_247___C.恢復到特定 LSN___HTMLTAG_248__CODEBLOCK_28__HTMLTAG_249___D。恢復到最新的___HTMLTAG_250__CODEBLOCK_29__HTMLTAG_251___E。恢復目標(包含/排除)

-- Default: exclusive (stop BEFORE target)
recovery_target_inclusive = 'off'

-- Inclusive: include target transaction recovery_target_inclusive = 'on'

4.5。執行恢復___HTMLTAG_254__CODEBLOCK_31__HTMLTAG_255__HTMLTAG_256___日誌輸出:___HTMLTAG_258__CODEBLOCK_32__HTMLTAG_259__HTMLTAG_258__CODEBLOCK_32__HTMLTAG_259__HTMLTAG_260___如果暫停複:___HTMLTAG_262__CODEBLOCK_33__HTMLTAG_263__HTMLTAG_264___驗證恢復:___HTMLTAG_266__CODEBLOCK_34__HTMLTAG_267________HTMLTAG6。 PITR___HTMLTAG_268__CODEBLOCK_35__CODEBLOCK_36__HTMLTAG_269___5 之後的時間軸。使用 Patroni 實現自動化___HTMLTAG_270__HTMLTAG_271___5.1。 Patroni WAL歸檔___HTMLTAG_272__HTMLTAG_273__HTMLTAG_274___在patroni.yml中配置:___HTMLTAG_276__CODEBLOCK_37______HTMLTAG_277__HTV​​TAG_276__CODEBLOCK_37______HTMLTAG_277__HTPatTAG_278___Pato___ML MLTAG_280__HTMLTAG_281__HTMLTAG_282___在主資料庫上設定存檔____HTMLTAG_283__HTMLTAG_284___在副本上設定還原___HTMLTAG_285__HTMLTAG_286___處理時間線變更___HTMLTAG_287858285858_____備份腳本___HTMLTAG_290__CODEBLOCK_38__HTMLTAG_291__HTMLTAG_292___使用 cron 進行計劃:___HTMLTAG_294__CODEBLOCK_39__HTMLTAG_295___5.3. WALG-G整合___HTMLTAG_296__HTMLTAG_297__HTMLTAG_298___安裝WAL-G:___HTMLTAG_300__CODEBLOCK_40__HTM LTAG_301__HTMLTAG_302___設定:

CODEBLOCK_41__HTMLTAG_305__HTMLTAG_306___收回p 使用 WAL-G:___HTMLTAG_308__CODEBLOCK_42__HTMLTAG_309__HTMLTAG_310___使用 WAL-G 恢復:___HTMLTAG_312使用 WAL-G 恢復:___HTMLTAG_31216___CODEBLOC_431315312312512312572。災難復原計畫___HTMLTAG_314__HTMLTAG_315___6.1。災難復原策略___HTMLTAG_316__HTMLTAG_317__HTMLTAG_318___3-2-1規則:___HTMLTAG_320__CODEBLOCK_44__HTMLTAG_321___6.2。災難復原清單___HTMLTAG_322__HTMLTAG_323__HTMLTAG_324___準備:___HTMLTAG_326__CODEBLOCK_45__HTMLTAG_327___6.3。 DR 場景與流程___HTMLTAG_328__HTMLTAG_329___情境 1:資料庫損壞___HTMLTAG_330__CODEBLOCK_46__HTMLTAG_331___情境 2:資料中心故障___HTMLTAG_332__CODEBLOCK_47_____情境3:意外資料刪除___HTMLTAG_334__CODEBLOCK_48__HTMLTAG_335___6.4。恢復指標___HTMLTAG_336__HTMLTAG_337__HTMLTAG_338___RTO(恢復時間目標):HTMLTAG_340__CODEBLOCK_49 HTMLTAG_341__HTMLTAG_342___RPO(恢復點)目標):HTMLTAG_344__CODEBLOCK_50__HTMLTAG_345___7。監控和警報___HTMLTAG_346__HTMLTAG_347___7.1。關鍵備份指標___HTMLTAG_348__CODEBLOCK_51__CODEBLOCK_52__HTMLTAG_349___7.2。普羅米修斯指標___HTMLTAG_350__CODEBLOCK_53__HTMLTAG_351___7.3。備份驗證___HTMLTAG_352__CODEBLOCK_54__HTMLTAG_353___8。最佳實務___HTMLTAG_354__HTMLTAG_355✅ 執行___HTMLTAG_356__HTMLTAG_357__HTMLTAG_358__HTMLTAG_359___啟用 WAL 歸檔 - PITR所需___HTMLTAG_361__HTMLTAG_362__HTMLTAG_363___自動化備份 - 透過 cron/systemd 計時器進行每日 pg_basebackup____HTMLTAG_365__HTMLTAG_366__14G_366__138_365%366__F____366__F________366__演練___HTMLTAG_369__HTMLTAG_370__HTMLTAG_371___監控存檔 - 失敗警報___HTMLTAG_373__HTMLTAG_374__HTMLTAG_375 每天保留多個世代 403407 次備份;次___HTMLTAG_377__HTMLTAG_378__HTMLTAG_379___場外備份-S3,不同區域/資料中心___HTMLTAG_381__HTMLTAG_382__HTMLTA G_383___加密備援 -靜態與傳輸中____HTMLTAG_385__HTMLTAG_386__HTMLTAG_387___文件流程 -用於復原的操作手冊___HTMLTAG_389__HTMLTAG_390__HTMLTAG_391___驗證備份 - 每次備份後的 pg_verifybackup___HTMLTAG_393__HTMLTAG_394__HTMLTAGTO_395___MLTAG_393__HTMLTAG_394__HTMLTAGTO_395____​​Um​​ 從R4_____HT了解您的限制___HTMLTAG_397__HTMLTAG_398__HTMLTAG_399❌不要___HTMLTAG_400__HTMLTAG_401__HTMLTAG_402__HTMLTAG_403___不要跳過測試___MLTAG_404___MLTAG_404___403_F否備份___HTMLTAG_405__HTMLTAG_406__HTMLTAG_407___不要只在本機上儲存 - 資料中心故障=資料遺失____HTMLTAG_409__HTMLTAG_410__HTMLTAG_資料遺失____HTMLTAG_409__HTMLTAG_410__HTMLTAG_資料遺失____HTMLTAG_409__HTMLTAG_410__HTMLTAG_資料遺失____HT)445444444444164113元-____無提示資料遺失風險___HTMLTAG_413__HTMLTAG_414__HTMLTAG_415___不要過早刪除 WAL - 需要 PITR____HTMLTAG_417__HTMLTAG_418__HTMLTAG_419___MLTAG_417__HTMLTAG_418__HTMLTAG_419_____儲存成本與復原需要___HTMLTAG_421__HTMLTAG_422__HTMLTAG_423___不要備份到同一磁碟 - 磁碟故障 = 一切遺失____HTMLTAG_425__HTMLTAG_426__HTMLTAG_427___不要跳過加密 -安全/合規風險____HTMLTAG_429__HTMLTAG_430__HTMLTAG_431____不要假設它有效- 驗證、驗證、驗證___HTMLTAG_433__HTMLTAG_434__HTMLTAG_435___9。實驗室練習___HTMLTAG_436__HTMLTAG_437___實驗室 1:設定 WAL 歸檔___HTMLTAG_438__HTMLTAG_439__HTMLTAG_440___任務:___HTMLTAG_442__HTMLTAG1_43__4HT43__441442__HT和archive_command___HTMLTAG_445__HTMLTAG_446___建立存檔目錄___HTMLTAG_447__HTMLTAG_448___強制WAL切換:SELECT pg_switch_wal();HTMLTAG_450__HTMLTAG_451__HTMLTAG_452___驗證檔案中的WAL檔案目錄___HTMLTAG_453__HTMLTAG_454______監視 pg_stat_archiver___HTMLTAG_455__HTMLTAG_454_____HT45456 2:取得基礎備援___HTMLTAG_458__HTMLTAG_459__HTMLTAG_460___任務:HTMLTAG_462__HTMLTAG_463__HTMLTAG_464______使用pg_basebackup____MLTA_463__HTMLTAG_464___使用pg_basebackup________ML_466 ifybackup____HTMLTAG_467__HTMLTAG_468___計算備援大小與時間____HTMLTAG_469__HTMLTAG_470___壓縮備份並比較大小____HTMLTAG_471__HTMLTAG_472____15____MLTAG1_473HTMLTAGML_47412 3:執行PITR___HTMLTAG_476__HTMLTAG_477__HTMLTAG_478___任務:___HTMLTAG_480__HTMLTAG_481__H TMLTAG_482___建立帶有時間戳記的測試表____HTMLTAG_483__HTMLTAG_484___進行基本備援___HTMLTAG_485__HTMLTAG_486___插入更多資料___HT MLTAG_487__HTMLTAG_488___注意特定時間戳___HTMLTAG_489__HTMLTAG_490___在時間戳後插入「錯誤」資料____HTMLTAG_491__HTMLTAG_4 92___恢復到時間戳記(錯誤資料之前)___HTMLTAG_493__HTMLTAG_494___驗證恢復點是正確___HTMLTAG_495__HTMLTAG_496__HTMLTAG_497___實驗4:自動備份___HTMLTAG_498__HTMLTAG_499__HTMLTAG_500___任務:___HTMLTAG_502__HTMLTAG_503 __HTMLTAG_504___編寫保留的備份腳本____HTMLTAG_505__HTMLTAG_506___新增錯誤處理和通知___HTMLTAG_507__HTMLTAG_508___使用cron 排程___HTMLTAG_509__HTMLTAG_510___測試腳本執行___HTMLTAG_511__HTMLTAG_512___監控備援日誌___HTMLTAG_513__HTMLTAG_514__HTMLTAG_515___實驗室5:災難復原鑽___HTMLTAG_516__HTMLTAG_517__HTMLTAG_518___任務:___HTMLTAG_520__HTMLTAG_521__HTMLTAG_522________整個資料庫遺失(刪除資料目錄)___MLTAG_MLHTMLTAG1522_____145____ML_ML)___ML TMLTAG_526___重播WAL到最新觀點___HTMLTAG_527__HTMLTAG_528___測量RTO(恢復時間)___HTMLTAG_529__HTMLTAG_530___驗證資料完整性___HTMLTAG_531__HTMLTAG_532_______1記錄。疑難排解___HTMLTAG_536__HTMLTAG_537___問題:存檔不起作用___HTMLTAG_538__HTMLTAG_539__HTMLTAG_540___症狀:failed_count > 0 列印pg_stat_archiver____HTMLTAG_542__HTMLTAG_543__HTMLTAG_544____檢查:____HTMLTAG_546__CODEBLOCK_55__HTMLTAG_5 47__HTMLTAG_548____通用原因:___HTMLTAG_550__HTMLTAG_551__HTMLTAG_552___存檔目錄的權限被拒絕___HTMLTAG_553__HTMLTAG_554___存檔目錄不存在____HTMLTAG_555__HTMLTAG_556___磁碟已滿___HTMLTAG_557__HTMLTAG_558___網路問題(如果遠端存檔)___HTMLTAG_559__HTMLTAG_560__HTMLTAG_561___問題:pg_basebackup慢___HTMLTAG_562__HTMLTAG_563__HTMLTAG_564___優化:___HTMLTAG_566__CODEBLOCK_56__HTMLTAG_567___問題:PITR失敗 - WAL不找到___HTMLTAG_568__HTMLTAG_569__HTMLTAG_570___錯誤:無法開啟檔案「000000010000 000000000007」:沒有這樣的檔案或目錄___HTMLTAG_573__HTMLTAG_574__HTMLTAG_575__HTMLTAG_576___原因:WAL文件不在存檔或restore_command 中錯誤___HTMLTAG_578__HTMLTAG_579__HTMLTAG_580___修正:___HTMLTAG_582__CODEBLOCK_57__HTMLTAG_583___11。摘要___HTMLTAG_584__HTMLTAG_585___備份策略摘要

HTMLTAG_588__HTMLTAG_589__HTMLTAG_590__HTMLTAG_591___方法___HTMLTAG_592__HTMLTAG_593___RPO HTMLTAG_594__HTMLTAG_595___RTO___HTMLTAG_596__HTMLTAG_597___複雜性___HTMLTAG_598__HTMLTAG_599___使用案例 pg_dumpHTM LTAG_607___小時/天___HTMLTAG_608__HTMLTAG_609___小時___HTMLTAG_610__HTMLTAG_611___低___HTMLTAG_612__HTMLTAG_613___小資料庫,遷移___HTMLTAG_614__HTMLTAG_615__HTMLTAG_616__HTMLTAG_617___pg_basebackup___HTMLTAG_618__HTMLTAG_619___上次備份___HTML TAG_620__HTMLTAG_621___30-120分鐘___HTMLTAG_622__HTMLTAG_623___中___HTMLTAG_624__HTMLTAG_625___定期備份___HTMLTAG_626 HTMLTAG_627__HTMLTAG_628__HTMLTAG_629___WAL存檔___HTMLTAG_630__HTMLTAG_631___分鐘___HTMLTAG_632__HTMLTAG_633___30-120分鐘___HTMLTAG_634__HTMLTAG_635___中___HTMLTAG_636__HTMLTAG_637___PITR功能___HTMLTAG_638__HTMLTAG_639__HTMLTAG_640__HTMLTAG_641_______HTMLTAGML____2__42142_______ HTMLTAG_644__HTMLTAG_645___30-60秒___HTMLTAG_646__HTMLTAG_647___高____HTMLTAG_648__HTMLTAG_649___HA,零資料遺失____HTMLTAG_650__HTMLTAG151

關鍵概念____HTMLTAG_656__HTMLTAG_657___✅WAL 歸檔_ -交易的持續備份日誌___HTMLTAG_660__HTMLTAG_661___✅ pg_basebackup -整個叢集的實體備份___HTMLTAG_664__HTMLTAG_665___✅ PITR - 使用下列指令還原到任意時間點基本備份 + WAL___HTMLTAG_668__HTMLTAG_669___✅ RTO - 恢復速度有多快___HTMLTAG_672__HTMLTAG_673___✅ML ___MLTAG_672__HTMLTAG_673___✅ML ___MLG_F___4____4_____F&&&nb&___&F&&nb&___4____4&F&F&&F&&&&&&44&___資料遺失量是多少可接受___HTMLTAG_676__HTMLTAG_677___✅ 3-2-1規則- 3份副本,2種媒體類型,1份場外___HTMLTAG_680__HTMLTAG_681___恢復清單___HTMLTAG_682__HTMLTAG_683__HTMLTAG_684___停止PostgreSQL___HTMLTAG_685__HTMLTAG_686___ 還原基本備援___HTMLTAG_687__HTMLTAG_688___ 建立復原.訊號___HTMLTAG_689__HTMLTAG_690___設定Restore_command___HTMLHTMLTAG_689__HTMLTAG_690___配置Restore_command___HTMLHTMLTAG191121212___設定恢復目標(時間/xid/lsn)___HTMLTAG_693__HTMLTAG_694___&啟動 PostgreSQL____HTMLTAG_695__HTMLTAG_696___ 監控恢復日誌___HTMLTAG_697__HTMLTAG_698___ 驗證恢復點____HTMLTAG_699__HTMLTAG_700___ 如果滿意則升級___HTMLTAG_701__若滿足則更新複製需要___HTMLTAG_703__HTMLTAG_704__HTMLTAG_705___後續步驟____HTMLTAG_706__HTMLTAG_707___第 17課程將涵蓋_監控和可觀察性:___HTMLTAG_710__HTMLTAG_711__HTMLTAG_712___Prometheus + Grafana設定___HTMLTAG_713__HTMLTAG_712___Prometheus + Grafana設定___HTMLTAG_713__HTMLTAG_712___Prometheus + Grafana設定___HTMLTAG_713__HTMLTAG_712___Prometheus + Grafana設定___HTMLTAG_713__HTMLTAG_7114___ 關鍵指標_監控___HTMLTAG_717__HTMLTAG_718___日誌聚合___HTMLTAG_719__HTMLTAG_720___警報策略___HTMLTAG_721__HTMLTAG_722___效能儀表板____HTMLTAG_723__HTMLTAG_724___