Tự động hóa backup giống như đánh răng tự động, nhưng cho database của bạn. Quá trình backup định kỳ sẽ cứu thế giới (ý là dữ liệu của bạn) khỏi thảm họa. Không ai muốn lúc 3 giờ sáng nhận được tin nhắn server sập và nhận ra backup cuối cùng đã làm từ hai tuần trước. Tự động hóa giải quyết vấn đề này: không còn phải đánh cược dữ liệu chỉ vì con người quên.
Có nhiều tool để tự động hóa, nhưng hôm nay mình sẽ nói về hai cái phổ biến nhất:
cron— trình lập lịch nhiệm vụ cực kỳ quen thuộc trên Linux.pg_cron— extension cho PostgreSQL, cho phép chạy job trực tiếp từ server database.
Extension pg_cron bên dưới vẫn gọi service cron. Service này chỉ có trên Linux thôi nha!
Bắt đầu thôi!
Cài đặt pg_cron
pg_cron là extension cho PostgreSQL, cho phép bạn lên lịch các job tự động ngay trong database. Rất xịn, tiện lợi và biến PostgreSQL của bạn thành một trung tâm điều phối mini.
Các bước cài đặt:
- Đảm bảo bạn đang dùng PostgreSQL 10+, vì
pg_cronchỉ hỗ trợ trên các bản mới. Cài extension bằng package manager của hệ thống. Với Ubuntu chẳng hạn:
sudo apt install postgresql-<version>-cronThay
<version>bằng version PostgreSQL bạn đang dùng.Bật extension trong config của PostgreSQL. Mở file
postgresql.confvà thêm dòng này:shared_preload_libraries = 'pg_cron'Tại sao cần vậy?
pg_cronyêu cầu library phải được load khi PostgreSQL khởi động — bắt buộc luôn.Khởi động lại server PostgreSQL:
sudo systemctl restart postgresqlKích hoạt extension trong database của bạn:
CREATE EXTENSION pg_cron;
Đến đây là pg_cron đã sẵn sàng chiến rồi!
Tạo job tự động backup
Điểm mạnh nhất của pg_cron là cho phép chạy command vào thời điểm định sẵn. Giờ mình sẽ tạo một job để tự động chạy pg_dump.
Ví dụ:
SELECT cron.schedule(
'nightly_backup', -- tên job
'0 2 * * *', -- lịch (mỗi đêm lúc 2 giờ)
$$pg_dump -U username -F c -f /backups/university_backup.dump university$$ -- command
);
Giải thích chút nhé:
'nightly_backup'— tên job do bạn đặt, để dễ nhận biết.'0 2 * * *'— lịch theo format cron: mỗi ngày lúc 2:00 sáng.- Command trong
$$ $$: mình chạypg_dumpđể backup databaseuniversity.
Sau khi tạo xong, job sẽ tự động chạy theo lịch luôn!
Xem và xóa job pg_cron
Muốn xem tất cả các job hiện có:
SELECT * FROM cron.job;
Nếu job nào không cần nữa, xóa như này:
SELECT cron.unschedule(job_id);
Thay job_id bằng id của job lấy từ câu lệnh trên.
Dùng cron để tự động hóa
Nếu bạn thích kiểu truyền thống của Linux hoặc pg_cron không dùng được vì lý do nào đó, thì cron quyền năng sẽ giúp bạn.
Cấu hình job với cron
Đầu tiên, kiểm tra cron đã cài và chạy chưa:
sudo systemctl enable cron
sudo systemctl start cron
Giờ thêm job backup. Mở editor để chỉnh job cron:
crontab -e
Thêm dòng này:
0 2 * * * pg_dump -U username -F c -f /backups/university_backup.dump university
Dòng này sẽ làm gì:
- 2 giờ sáng mỗi ngày (
0 2 * * *) sẽ backup databaseuniversity. - Tất cả backup sẽ lưu vào file
/backups/university_backup.dump.
Sau khi lưu file crontab, job sẽ tự động chạy theo lịch.
Log thực thi cron
Đôi khi cần biết có gì sai sót không. Hãy đảm bảo output của command được ghi vào log để dễ kiểm tra. Thêm redirect vào command như sau:
0 2 * * * pg_dump -U username -F c -f /backups/university_backup.dump university >> /var/log/backup.log 2>&1
Giờ thì mọi thứ xảy ra khi chạy job sẽ được lưu vào file /var/log/backup.log.
So sánh pg_cron và cron
Vậy là ta có hai tool mạnh mẽ. Chọn cái nào đây?
pg_cronrất hợp nếu bạn muốn lên lịch và quản lý job ngay trong PostgreSQL. Tiện, không cần rời khỏi database và dễ scale job.cronthì đa năng hơn. Dùng cho PostgreSQL hay bất kỳ task tự động nào cũng được.
| Đặc điểm | pg_cron | cron |
|---|---|---|
| Dễ tích hợp | Tích hợp trong PostgreSQL, nhưng cần cài extension | Chạy cho mọi process |
| Cài đặt | Phải cài extension | Có sẵn trên hầu hết hệ Linux |
| Log | Lưu trong PostgreSQL (bảng cron.job_run_details) |
Ghi vào log hệ thống (thường là /var/log/syslog) |
| Linh hoạt | Chỉ chạy SQL trong PostgreSQL | Chạy mọi command, script, binary |
Kiểm tra job đã chạy chưa
Để kiểm tra backup có chạy không, bạn có thể tự chạy command cron bằng tay:
pg_dump -U username -F c -f /backups/university_backup.dump university
Cũng nên kiểm tra file backup trong thư mục chỉ định, xem dung lượng và thời gian tạo. Ví dụ:
ls -lh /backups/
Thường xuyên kiểm tra log và đảm bảo job chạy đúng nhé.
Bảo vệ đơn giản khỏi lỗi phổ biến
Lỗi số 1: "Quên set quyền!"
Nếu user chạy cron không có quyền chạy pg_dump, job sẽ fail. Đảm bảo user đó có quyền truy cập database.
Lỗi số 2: "File lưu sai chỗ!"
Luôn ghi rõ đường dẫn đầy đủ cho file và command. cron không biết môi trường của bạn đâu — phải dùng đường dẫn đầy đủ: pg_dump -> /usr/bin/pg_dump.
Lỗi số 3: "Log đâu rồi?"
Đừng quên redirect output của command vào file log. Không có log thì không biết lỗi gì đâu.
Đến đây là bạn đã sẵn sàng tự động backup database rồi. Giờ thì kể cả server có "đi nghỉ mát" bất ngờ, dữ liệu của bạn vẫn an toàn nhé!
GO TO FULL VERSION