|
| 1 | + |
| 2 | +:sectnums: |
| 3 | +:sectnumlevels: 5 |
| 4 | +:imagesdir: ./images |
| 5 | + |
| 6 | += pg_cron |
| 7 | + |
| 8 | +== 概述 |
| 9 | +在 PostgreSQL 中运行周期性任务,例如执行 VACUUM或删除旧数据,是一种常见需求。实现这一点的简单方法是配置 cron或其他外部守护进程,使其定期连接到数据库并运行命令。然而,随着数据库越来越多地作为托管服务或独立容器运行,配置和运行一个单独的守护进程通常变得不切实际。此外,很难让您的 cron任务感知故障转移,或者跨集群节点调度任务。 |
| 10 | + |
| 11 | +pg_cron 是 PostgreSQL 的开源定时任务扩展,允许直接在数据库内部设置 cron 风格的任务调度,用于自动化数据维护任务(清理,聚合), 数据库健康检查,执行存储过程和自定义函数等操作。它将cron任务存储在表中,周期性任务会随着 PostgreSQL 服务器自动进行故障转移。详情可以参见https://github.com/citusdata/pg_cron[pg_cron文档]。 |
| 12 | + |
| 13 | +== 安装配置 |
| 14 | + |
| 15 | +[TIP] |
| 16 | +环境中已经安装了IvorySQL1.17及以上版本,安装路径为/usr/local/ivorysql/ivorysql-1 |
| 17 | + |
| 18 | +=== 源码安装 |
| 19 | + |
| 20 | +``` |
| 21 | +# 拉取pg_cron源码 |
| 22 | +git clone https://github.com/citusdata/pg_cron.git |
| 23 | +cd pg_cron |
| 24 | +# 将pg_config的路径设置到PATH环境变量里,eg: |
| 25 | +export PATH=/usr/local/ivorysql/ivorysql-1/bin/:$PATH |
| 26 | +make |
| 27 | +make install |
| 28 | +``` |
| 29 | + |
| 30 | +=== 配置文件 (ivorysql.conf) |
| 31 | + |
| 32 | +``` |
| 33 | +# 共享预加载扩展 |
| 34 | +shared_preload_libraries = 'pg_cron' |
| 35 | + |
| 36 | +# 指定任务元数据存储库(默认当前库) |
| 37 | +cron.database_name = 'ivorysql' |
| 38 | + |
| 39 | +# 允许的最大并发任务数 |
| 40 | +cron.max_running_jobs = 5 |
| 41 | +``` |
| 42 | + |
| 43 | +=== 重启服务 |
| 44 | + |
| 45 | +``` |
| 46 | +pg_ctl restart -D ./data -l logfile |
| 47 | +``` |
| 48 | + |
| 49 | +=== 创建Extension并确认pg_cron版本 |
| 50 | + |
| 51 | +psql 连接到数据库,执行如下命令: |
| 52 | +``` |
| 53 | +ivorysql=# CREATE extension pg_cron; |
| 54 | +CREATE EXTENSION |
| 55 | + |
| 56 | +ivorysql=# SELECT * FROM pg_available_extensions WHERE name = 'pg_cron'; |
| 57 | + name | default_version | installed_version | comment |
| 58 | +---------+-----------------+-------------------+--------------------------- |
| 59 | + pg_cron | 1.6 | |Job scheduler for PostgreSQL |
| 60 | +(1 row) |
| 61 | +``` |
| 62 | +
|
| 63 | +== 核心功能使用 |
| 64 | +
|
| 65 | +=== 创建定时任务 |
| 66 | +
|
| 67 | +``` |
| 68 | +SELECT cron.schedule( |
| 69 | + 'nightly-data-cleanup', -- 任务名称(唯一标识) |
| 70 | + '0 3 * * *', -- cron表达式(每天UTC 3:00) |
| 71 | + $$DELETE FROM logs |
| 72 | + WHERE created_at < now() - interval '30 days'$$ -- 执行SQL |
| 73 | +); |
| 74 | +``` |
| 75 | +
|
| 76 | +cron表达式速查表: |
| 77 | +
|
| 78 | +|==== |
| 79 | +|示例|含义 |
| 80 | +|'0 * * * *'|每小时整点执行 |
| 81 | +|'*/15 * * * *'|每15分钟执行 |
| 82 | +|'0 9 * * 1-5'|工作日早9点执行 |
| 83 | +|'0 1 1 * *'|每月1日凌晨1点执行 |
| 84 | +|==== |
| 85 | +
|
| 86 | +pg_cron还允许使用 '$'表示月份的最后一天。 |
| 87 | +
|
| 88 | +=== 任务管理 |
| 89 | +
|
| 90 | +``` |
| 91 | +# 查看所有任务 |
| 92 | +SELECT * FROM cron.job; |
| 93 | +
|
| 94 | +image::p31.png[] |
| 95 | +
|
| 96 | +# 查看任务执行历史 |
| 97 | +SELECT * FROM cron.job_run_details ORDER BY start_time DESC LIMIT 10; |
| 98 | +
|
| 99 | +image::p32.png[] |
| 100 | +
|
| 101 | +# 删除任务 |
| 102 | +SELECT cron.unschedule('nightly-data-cleanup'); |
| 103 | +
|
| 104 | +# 暂停任务(更新状态) |
| 105 | +UPDATE cron.job SET active = false WHERE jobname = 'delete-job-run-details'; |
| 106 | +``` |
0 commit comments