CodeGym /课程 /SQL SELF /用 pg_cron 和 cron 在 Linux 下自动化...

用 pg_cron 和 cron 在 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 启动时加载库——这是必须的。

  4. 重启 PostgreSQL 服务器:

    sudo systemctl restart postgresql
    
  5. 在你的数据库里激活扩展:

    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: "日志去哪了?"

别忘了把命令输出重定向到日志文件。不然出问题你啥都看不到。

到这一步,你已经可以自动给数据库做备份了。现在,就算服务器突然去度假,你的数据也稳稳的!

2
任务
SQL SELF, 第 44 级, 课程 0
已锁定
使用 `pg_cron` 自动创建备份
使用 `pg_cron` 自动创建备份
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION