自動化備份就像自動刷牙一樣,只是這次是幫你的資料庫刷乾淨。定期備份這個流程可以拯救世界(這裡指的是你的資料)免於災難。沒有人想在凌晨三點收到伺服器掛掉的訊息,然後發現最後一次備份竟然是兩週前。自動化就是解方:再也不用冒著人為失誤讓資料有風險啦。
自動化工具超多,但今天我們聊兩個最熱門的:
cron— 這是 Linux 上大家都很熟的萬用排程器。pg_cron— PostgreSQL 的擴充套件,可以直接在資料庫伺服器裡排程任務。
pg_cron 其實底層還是靠 cron 服務。這個服務只在 Linux 上有喔!
來吧,開始!
安裝 pg_cron
pg_cron 是 PostgreSQL 的擴充套件,讓你可以直接在資料庫裡排自動任務。這超方便,讓你的 PostgreSQL 變成小型運維中心。
安裝步驟:
- 確認你用的是 PostgreSQL 10+,因為
pg_cron只支援新版。 用你的套件管理器安裝擴充套件。以 Ubuntu 為例:
sudo apt install postgresql-<version>-cron把
<version>換成你系統裡 PostgreSQL 的版本。在 PostgreSQL 設定檔裡啟用擴充套件。打開
postgresql.conf,加上:shared_preload_libraries = 'pg_cron'為什麼要這樣?
pg_cron需要在 PostgreSQL 啟動時就載入 library,這是必須的。重啟 PostgreSQL 伺服器:
sudo systemctl restart postgresql在你的資料庫裡啟用這個擴充套件:
CREATE EXTENSION pg_cron;
到這裡 pg_cron 就 ready 了!
建立自動備份任務
pg_cron 最大的賣點就是可以在指定時間跑指令。我們來建立一個自動執行 pg_dump 的任務。
範例:
SELECT cron.schedule(
'nightly_backup', -- 任務名稱
'0 2 * * *', -- 排程(每天凌晨2點)
$$pg_dump -U username -F c -f /backups/university_backup.dump university$$ -- 指令
);
來解釋一下:
'nightly_backup'— 這是你自訂的任務名稱,方便辨識。'0 2 * * *'— cron 格式的排程:每天凌晨2點。- 在
$$ $$裡的指令:我們執行pg_dump來備份university這個資料庫。
任務建立好後,它就會照排程自動執行啦!
查看和刪除 pg_cron 任務
想看目前有哪些任務:
SELECT * FROM cron.job;
如果有任務不需要了,可以這樣刪掉:
SELECT cron.unschedule(job_id);
把 job_id 換成你剛剛查到的任務 ID。
用 cron 自動化
如果你比較愛經典的 Linux 自動化方式,或是 pg_cron 有什麼原因不能用,cron 就是你的好朋友。
用 cron 設定任務
先確認 cron 有裝好而且有在跑:
sudo systemctl enable cron
sudo systemctl start cron
現在來加一個備份任務。打開 cron 任務編輯器:
crontab -e
加上這一行:
0 2 * * * pg_dump -U username -F c -f /backups/university_backup.dump university
這行魔法會做什麼:
- 每天凌晨2點(
0 2 * * *)備份university資料庫。 - 所有備份都會存到
/backups/university_backup.dump。
存檔後 crontab 任務就會自動開始跑囉。
cron 執行紀錄
有時候你會想知道哪裡出錯了。記得把指令的輸出寫到 log 檔方便 debug。只要在指令後面加上輸出導向:
0 2 * * * pg_dump -U username -F c -f /backups/university_backup.dump university >> /var/log/backup.log 2>&1
這樣所有執行過程都會寫進 /var/log/backup.log。
pg_cron vs cron 比較
所以我們有兩個超強工具。怎麼選?
pg_cron很適合你想直接在 PostgreSQL 裡排程和管理任務。很方便,不用離開資料庫,還能彈性擴充。cron更萬用。不只 PostgreSQL,其他自動化任務也能用。
| 特性 | pg_cron | cron |
|---|---|---|
| 整合容易度 | 內建在 PostgreSQL,但要裝擴充套件 | 什麼程序都能用 |
| 安裝 | 要裝擴充套件 | 大多數 Linux 系統都內建 |
| 紀錄 | 存在 PostgreSQL(cron.job_run_details 表) |
寫進系統 log(通常 /var/log/syslog) |
| 彈性 | 只能在 PostgreSQL 裡跑 SQL | 什麼指令、腳本、執行檔都能跑 |
檢查任務有沒有執行
想確認備份有沒有正常,可以手動跑一次 cron 指令:
pg_dump -U username -F c -f /backups/university_backup.dump university
也可以去指定資料夾看備份檔案有沒有、大小和最後建立時間。例如:
ls -lh /backups/
記得常常檢查 log,確保任務都正常執行。
常見錯誤的簡單防呆
錯誤一:「忘記設定權限!」
如果跑 cron 的使用者沒有權限執行 pg_dump,任務就不會動。記得讓使用者有資料庫存取權限。
錯誤二:「檔案存錯地方!」
一定要寫完整路徑。cron 不知道你的環境變數,完整路徑必須寫清楚:pg_dump -> /usr/bin/pg_dump。
錯誤三:「我的 log 呢?」
記得把指令輸出導向 log 檔。不然出問題你完全沒資訊可查。
到這裡你就 ready 自動備份你的資料庫啦。就算伺服器突然去度假,你的資料也很安全!
GO TO FULL VERSION