自动化备份就像自动刷牙,不过是给你的数据库刷。定期备份能救世界(其实就是救你的数据)免于灾难。没人想凌晨三点收到服务器挂了的消息,然后发现上次备份还是两周前。自动化能解决这个问题:再也不用因为人手失误而冒数据丢失的风险了。
自动化工具有很多,但今天我们聊两个最火的:
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 启动时加载库——这是必须的。重启 PostgreSQL 服务器:
sudo systemctl restart postgresql在你的数据库里激活扩展:
CREATE EXTENSION pg_cron;
到这一步 pg_cron 就能用了!
创建自动备份任务
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:00。$$ $$里的命令:我们用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 执行日志
有时候你想知道哪里出错了。记得把命令输出重定向到日志文件,方便排查。加个重定向:
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 和 cron 对比
所以我们有两个强力工具。怎么选?
pg_cron很适合你想直接在 PostgreSQL 里安排和管理任务。不用离开数据库,扩展性也不错。cron更通用。不光能给 PostgreSQL 用,还能自动化别的任务。
| 特点 | pg_cron | cron |
|---|---|---|
| 集成难度 | 集成在 PostgreSQL,但需要扩展 | 啥进程都能用 |
| 安装 | 要装扩展 | 大多数 Linux 系统自带 |
| 日志 | 存在 PostgreSQL 里(表 cron.job_run_details) |
写到系统日志(一般 /var/log/syslog) |
| 灵活性 | 只能在 PostgreSQL 里跑 SQL | 啥命令、脚本、二进制都能跑 |
检查任务执行情况
想确认备份真的在跑,可以手动执行 cron 里的命令:
pg_dump -U username -F c -f /backups/university_backup.dump university
还可以去指定目录看看备份文件在不在、大小和最后创建时间。比如:
ls -lh /backups/
记得定期查日志,确保任务都正常跑。
常见错误的简单防护
错误 №1: "忘了设置权限!"
如果跑 cron 的用户没权限执行 pg_dump,任务就跑不起来。一定要保证用户能访问数据库。
错误 №2: "文件存错地方了!"
一定要写全路径。cron 不知道你的环境变量——全路径必须写:pg_dump -> /usr/bin/pg_dump。
错误 №3: "日志去哪了?"
别忘了把命令输出重定向到日志文件。不然出问题你啥都看不到。
到这一步,你已经可以自动给数据库做备份了。现在,就算服务器突然去度假,你的数据也稳稳的!
GO TO FULL VERSION