CodeGym /課程 /SQL SELF /pg_croncron 在 Linux 上自動化...

pg_croncron 在 Linux 上自動化備份設定

SQL SELF
等級 44 , 課堂 0
開放

自動化備份就像自動刷牙一樣,只是這次是幫你的資料庫刷乾淨。定期備份這個流程可以拯救世界(這裡指的是你的資料)免於災難。沒有人想在凌晨三點收到伺服器掛掉的訊息,然後發現最後一次備份竟然是兩週前。自動化就是解方:再也不用冒著人為失誤讓資料有風險啦。

自動化工具超多,但今天我們聊兩個最熱門的:

  1. cron — 這是 Linux 上大家都很熟的萬用排程器。
  2. pg_cron — PostgreSQL 的擴充套件,可以直接在資料庫伺服器裡排程任務。

pg_cron 其實底層還是靠 cron 服務。這個服務只在 Linux 上有喔!

來吧,開始!

安裝 pg_cron

pg_cron 是 PostgreSQL 的擴充套件,讓你可以直接在資料庫裡排自動任務。這超方便,讓你的 PostgreSQL 變成小型運維中心。

安裝步驟:

  1. 確認你用的是 PostgreSQL 10+,因為 pg_cron 只支援新版。
  2. 用你的套件管理器安裝擴充套件。以 Ubuntu 為例:

    sudo apt install postgresql-<version>-cron
    

    <version> 換成你系統裡 PostgreSQL 的版本。

  3. 在 PostgreSQL 設定檔裡啟用擴充套件。打開 postgresql.conf,加上:

    shared_preload_libraries = 'pg_cron'
    

    為什麼要這樣?pg_cron 需要在 PostgreSQL 啟動時就載入 library,這是必須的。

  4. 重啟 PostgreSQL 伺服器:

    sudo systemctl restart postgresql
    
  5. 在你的資料庫裡啟用這個擴充套件:

    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 自動備份你的資料庫啦。就算伺服器突然去度假,你的資料也很安全!

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