CodeGym /課程 /SQL SELF /資料還原時的問題與錯誤

資料還原時的問題與錯誤

SQL SELF
等級 44 , 課堂 3
開放

大家都覺得備份就像下雨天的雨傘:你以為它能救你一切。但如果傘上有洞,你還是會淋濕。備份和還原也是一樣:只要哪裡出錯,你可能會丟資料,甚至更慘,資料庫直接壞掉。所以搞懂錯誤和怎麼預防真的很重要。

還原資料時的問題

  1. PostgreSQL 版本不相容

最常見也最煩的問題之一,就是你想把某個版本 PostgreSQL 的資料還原到另一個版本(比如你想把 11 版的備份還原到 15 版)。PostgreSQL 沒保證版本之間的相容性。

為什麼會這樣?

  • 不同版本之間資料格式可能會變。
  • 有些 function 跟參數可能被砍掉或改掉。

怎麼避免?

  • 一定要用 pg_dump 來備份,不要直接複製 PostgreSQL 的資料夾。pg_dump 會產生通用的 SQL script,可以在任何相容的版本還原。
  • 還原前先查一下版本相容性。可以去 PostgreSQL 官方文件 找資料。

舉個例子,假設你用 PostgreSQL 14 做備份:

pg_dump -U user -d my_database -f backup.sql

現在你想在 PostgreSQL 15 還原:

psql -U user -d my_database -f backup.sql

然後你會看到像這樣的錯誤:

ERROR:  unrecognized configuration parameter "old_function"

解法:把伺服器的 PostgreSQL 升級,或用 pg_upgrade 工具來搬移。

  1. 缺少必要的 WAL 檔案

有時候你用增量或差異備份還原時,會突然失敗——通常就是因為缺少 WAL(Write-Ahead Logging)檔案。PostgreSQL 需要這些檔案來「補齊」最後一次完整備份後的變更。如果這些檔案不見或壞掉,資料庫就沒辦法完成還原。

這種情況常發生在你沒開 WAL 檔案歸檔,或有人手賤清掉資料夾想省空間。所以如果你要用不完整備份,一定要在 postgresql.conf 開啟歸檔:

archive_mode = on
archive_command = 'cp %p /path/to/wal_archive/%f'

還有記得常常檢查歸檔有沒有正常運作,檔案是不是都還在。這點小麻煩,換來還原時的安心,超值得。

  1. 備份檔案損壞

你的備份檔案可能會壞掉,這樣還原就沒救了。

為什麼會這樣?

  • 檔案傳輸或儲存時損壞。
  • 備份過程中突然出錯。

怎麼避免?

用壓縮和 checksum 來檢查備份檔案有沒有壞。比如備份完後產生 MD5:

md5sum backup.sql > backup.sql.md5

還原前一定要檢查備份檔案:

md5sum -c backup.sql.md5

問題跟解法

你試著還原壞掉的檔案:

pg_restore -U user -d my_database backup.dump

然後看到:

pg_restore: fatal error: input file appears to be a text file, but you are using the 'pg_restore' command-line tool; try using psql instead

解法:用文字編輯器打開檔案看看還有沒有救。如果損壞不嚴重,可以手動修 SQL 檔。

  1. 使用者權限不足

有時候還原時會遇到權限不夠的錯誤,特別是你用權限比較小的帳號還原時。

為什麼會這樣?

使用者沒權限建立資料表、schema 或其他資料庫物件。

怎麼避免?

用有足夠權限的帳號來還原:

pg_restore -U postgres -d my_database backup.dump
  1. 覆蓋現有資料庫

另一個常見錯誤是你還原備份時,資料庫裡已經有資料。如果你不小心「蓋掉」現有資料,基本上就回不去了。

為什麼會這樣?

你沒用 --clean flag,導致新備份直接疊在舊資料上。

怎麼避免?

還原時加上 --clean,會先把舊結構刪掉:

pg_restore --clean -U user -d my_database backup.dump
  1. 未完成交易錯誤

還原時有時會遇到資料卡在未完成的交易裡,這在大資料庫特別容易發生。

為什麼會這樣?

交易因為伺服器掛掉而「壞掉」。

怎麼避免?

確保 PostgreSQL 伺服器在還原前把所有交易都處理完。如果有問題,重啟伺服器:

sudo service postgresql restart

怎麼預防還原錯誤

我們剛剛講了怎麼避免特定問題,但還有一些通用策略可以幫你避掉大部分狀況:

常常測試還原。 建一個測試用資料庫,試著還原看看。

備份多份資料。 用雲端、在地硬碟、遠端伺服器都存一份。

自動化備份流程。cron 或類似工具排程。

檢查檔案完整性。 用 checksum 確認備份沒壞。

保持 PostgreSQL 版本同步。 不要拖延 PostgreSQL 更新,不然以後會遇到版本不合的問題。

真實案例與解法

案例 1: WAL 檔案遺失。 你的伺服器突然斷電,發現需要的 WAL 檔案不見了。這時沒完整備份就沒救了。最簡單的解法就是常常檢查 WAL 歸檔設定。

案例 2: 備份檔案壞掉。 你把備份檔傳到伺服器,結果發現檔案是空的。這時就用別的備份來源,或試試看能不能從部分壞掉的檔案救回來。

案例 3: 版本不相容。 你想把 PostgreSQL 12 的資料搬到 PostgreSQL 14,結果遇到錯誤。用 pg_dump 匯出,再用新版還原就對了。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION