Sheet happens. 上一堂我們也學過資料庫崩潰後完整還原的步驟。不過現實總是愛搞突發狀況。如果你的備份檔案壞掉了怎麼辦?現在就來搞懂這個問題吧。
履歷表要放哪裡比較好?
開玩笑啦。現在我們要討論技術問題。但別忘了,玩笑裡總有點認真成分 :)
分析備份損壞的情況
損壞的備份 — 就像你畢業論文檔案交件前突然打不開一樣。症狀也差不多:
- 還原時出錯:用
pg_restore會看到像這樣的錯誤:
pg_restore: [archiver] input file does not appear to be a valid archive
- 部分資料不見了或檔案大小怪怪的(突然變很小或直接是零)。
- 解壓後的 SQL 檔案有資料斷掉、不正常的符號或空白區塊。
備份損壞的原因超多:
- 備份過程被中斷(像是突然斷電或系統關機)。
- 檔案傳輸錯誤(複製到隨身碟或網路傳輸時出錯)。
- 硬體故障(硬碟、RAM、RAID 陣列壞掉)。
- 系統或備份工具設定錯誤。
- 病毒、惡意程式,還有經典的「手滑點錯」。
從損壞的備份救回資料
檔案壞掉不代表世界末日。有時候還是能救回一些東西。來看看幾種做法。
用 pg_restore 嘗試還原
如果你的備份是用 pg_dump 做的 custom 或 directory 格式,可以試著用 pg_restore 加上 --ignore-errors 參數來還原。指令範例:
pg_restore --dbname=your_database --ignore-errors backup_file.dump
這個參數會讓工具遇到錯誤時繼續往下跑。當然,壞掉的地方資料會不見,但至少能救回一部分。
如果這樣有用,記得還原完要仔細檢查資料,記下哪些東西沒救回來。
利用部分資料
假設你有 SQL 純文字格式的備份。可以用文字編輯器打開(推薦用進階一點的,比如 Visual Studio Code 或 Notepad++),看看檔案斷在哪裡。如果檔案還能讀,大部分 SQL 指令都還在:
- 把壞掉的部分刪掉。
- 手動或用
psql執行剩下的 SQL 指令:
psql -U username -d database_name -f partial_backup.sql
讀取 custom 格式的備份檔
如果你的備份是 custom 格式,可以試著分段抽出內容:
pg_restore --list backup_file.dump > file_list.txt
這個指令會產生備份裡所有物件的清單。然後你可以試著只還原部分(像是某些資料表或 schema):
pg_restore --dbname=your_database --use-list=file_list.txt backup_file.dump
編輯 file_list.txt,把壞掉的項目排除掉再還原。
用歸檔日誌(WAL)還原
如果你有用增量或差異備份(像 pg_basebackup),你應該有歸檔日誌(WAL 檔案)。這些檔案記錄從上次備份後所有變動。要還原資料可以:
- 找到最後一個完整的備份(例如全備份)。
- 告訴 PostgreSQL WAL 檔案在哪:
restore_command = 'cp /path/to/wal_directory/%f %p'
- 執行還原。
用第三方工具
有時候可以靠檔案救援工具減少損壞。很紅的工具有 ddrescue。指令範例:
ddrescue --force backup_file.dump recovered_dump.file
這個工具會盡量救回最多的資料,產生一個新檔案。
怎麼預防備份損壞
對,處理壞掉的檔案真的很崩潰。來想想怎麼避免這種事吧。
多地點存放備份
就像專案備份一樣,永遠不要把雞蛋放同一個籃子。建議多重備份:
- 本地伺服器。
- 雲端(Amazon S3、Google Cloud Storage,或 Dropbox 這種簡單服務)。
- 外接硬碟(想超級保險的話)。
定期檢查備份完整性
IT 圈有句話:「沒測過的備份根本不是備份」。要定期測試還原。做法:
- 把備份載到測試伺服器。
- 從備份還原資料。
- 檢查資料正不正確。
用檢查碼(checksum)
備份時產生檔案的 checksum(像用 MD5 或 SHA256):
md5sum backup_file.dump > backup_file.md5
還原時比對現在的 checksum 跟原本的:
md5sum -c backup_file.md5
這樣你就能提前發現檔案壞掉。
損壞備份還原實例
來看幾個真實案例。
案例 1. 檔案傳輸錯誤
你用 FTP 傳備份,結果發現檔案比預期小。你用 pg_dump 做的 SQL 純文字備份,所以:
- 用編輯器打開檔案。
- 刪掉壞掉的資料部分。
- 用
psql還原剩下的內容。
案例 2. WAL 部分資料遺失
你的伺服器用增量備份和 WAL 歸檔。突然有些檔案不見了。不過你還是靠 pg_basebackup 和剩下的 WAL 檔案,設定好還原路徑,把資料救回來。
記住,備份不只是存檔,還要驗證。不要等到世界末日才發現備份根本沒用。如果真的壞了也別慌:PostgreSQL 有很多方法能救資料。重點是要快又小心!
如果真的完全沒救——再回去看這堂課的第一點吧。
GO TO FULL VERSION