CodeGym /課程 /SQL SELF /備份損壞時該怎麼辦

備份損壞時該怎麼辦

SQL SELF
等級 44, 課堂 4
開放

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 指令都還在:

  1. 把壞掉的部分刪掉。
  2. 手動或用 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 檔案)。這些檔案記錄從上次備份後所有變動。要還原資料可以:

  1. 找到最後一個完整的備份(例如全備份)。
  2. 告訴 PostgreSQL WAL 檔案在哪:
   restore_command = 'cp /path/to/wal_directory/%f %p'
  1. 執行還原。

用第三方工具

有時候可以靠檔案救援工具減少損壞。很紅的工具有 ddrescue。指令範例:

ddrescue --force backup_file.dump recovered_dump.file

這個工具會盡量救回最多的資料,產生一個新檔案。

怎麼預防備份損壞

對,處理壞掉的檔案真的很崩潰。來想想怎麼避免這種事吧。

多地點存放備份

就像專案備份一樣,永遠不要把雞蛋放同一個籃子。建議多重備份:

  • 本地伺服器。
  • 雲端(Amazon S3、Google Cloud Storage,或 Dropbox 這種簡單服務)。
  • 外接硬碟(想超級保險的話)。

定期檢查備份完整性

IT 圈有句話:「沒測過的備份根本不是備份」。要定期測試還原。做法:

  1. 把備份載到測試伺服器。
  2. 從備份還原資料。
  3. 檢查資料正不正確。

用檢查碼(checksum)

備份時產生檔案的 checksum(像用 MD5 或 SHA256):

md5sum backup_file.dump > backup_file.md5

還原時比對現在的 checksum 跟原本的:

md5sum -c backup_file.md5

這樣你就能提前發現檔案壞掉。

損壞備份還原實例

來看幾個真實案例。

案例 1. 檔案傳輸錯誤

你用 FTP 傳備份,結果發現檔案比預期小。你用 pg_dump 做的 SQL 純文字備份,所以:

  1. 用編輯器打開檔案。
  2. 刪掉壞掉的資料部分。
  3. 用 psql 還原剩下的內容。

案例 2. WAL 部分資料遺失

你的伺服器用增量備份和 WAL 歸檔。突然有些檔案不見了。不過你還是靠 pg_basebackup 和剩下的 WAL 檔案,設定好還原路徑,把資料救回來。

記住,備份不只是存檔,還要驗證。不要等到世界末日才發現備份根本沒用。如果真的壞了也別慌:PostgreSQL 有很多方法能救資料。重點是要快又小心!

如果真的完全沒救——再回去看這堂課的第一點吧。

2
任務
SQL SELF, 等級 44, 課堂 4
上鎖
忽略錯誤來還原資料庫
忽略錯誤來還原資料庫
1
問卷/小測驗
備份自動化設定,等級 44,課堂 4
未開放
備份自動化設定
備份自動化設定
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION