PostgreSQL 实现定时任务的 4 种方法
操作系统定时任务
crontab -e
#分钟 小时 月份中的某一天 月份 星期 命令
#(0-59) (0-23) (1-31) (1-12) (0-7 [7 or 0 == Sunday])
<minute> <hour> <day of month> <month> <day of week> <command>
0 0 * * * pg_dump --no-password -U user db_name > backup.sql
chmod 600 .pgpass
pgAgent
安装 pgAgent
创建定时任务
点击“Save”按钮保存设置并创建任务,然后我们就可以在“pgAgent Job”节点下看到创建的任务。
pg_cron
-- 每周六 3:30am (GMT) 删除历史记录
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
schedule
----------
42
-- 每天 10:00am (GMT) 执行清理作业
SELECT cron.schedule('nightly-vacuum', '0 10 * * *', 'VACUUM');
schedule
----------
43
-- 将清理作业修改为 3:00am (GMT)
SELECT cron.schedule('nightly-vacuum', '0 3 * * *', 'VACUUM');
schedule
----------
43
-- 停止计划中的任务
SELECT cron.unschedule('nightly-vacuum' );
unschedule
------------
t
(1 row)
SELECT cron.unschedule(42);
unschedule
------------
t
安装 pg_cron
sudo yum install -y pg_cron_12
sudo apt-get -y install postgresql-12-cron
git clone https://github.com/citusdata/pg_cron.git
cd pg_cron
# Ensure pg_config is in your path, e.g.
export PATH=/usr/pgsql-12/bin:$PATH
make && sudo PATH=$PATH make install
配置 pg_cron
shared_preload_libraries = 'pg_cron'
cron.database_name = 'postgres'
sudo service postgresql-12 restart
-- 使用 superuser 运行以下命令
CREATE EXTENSION pg_cron;
-- 可选操作,为其他用户授予访问权限
GRANT USAGE ON SCHEMA cron TO username;
pg_timetable
安装 pg_timetable
docker run --rm \
cybertecpostgresql/pg_timetable:latest \
-h 10.0.0.3 -p 54321 -c worker001
docker run --rm \
-e PGTT_PGHOST=10.0.0.3 \
-e PGTT_PGPORT=54321 \
cybertecpostgresql/pg_timetable:latest \
-c worker001
$ env GIT_TERMINAL_PROMPT=1 go get github.com/cybertec-postgresql/pg_timetable/
Username for 'https://github.com': <Github Username>
Password for 'https://cyberboy@github.com': <Github Password>
$ cd ~/go/src/github.com/cybertec-postgresql/pg_timetable/
$ go run main.go --dbname=dbname --clientname=worker001 --user=scheduler --password=strongpwd
或者,也可以编译成二进制程序并运行:
$ go build
$ ./pg_timetable --dbname=dbname --clientname=worker001 --user=scheduler --password=strongpwd
$ cd ~/go/src/github.com/cybertec-postgresql/pg_timetable/
$ go get github.com/stretchr/testify/
$ go test ./...
$ RUN_DOCKER=true go test ./...
使用 pg_timetable
# ./pg_timetable
Application Options:
-c, --clientname= Unique name for application instance
-v, --verbose Show verbose debug information [$PGTT_VERBOSE]
-h, --host= PG config DB host (default: localhost) [$PGTT_PGHOST]
-p, --port= PG config DB port (default: 5432) [$PGTT_PGPORT]
-d, --dbname= PG config DB dbname (default: timetable) [$PGTT_PGDATABASE]
-u, --user= PG config DB user (default: scheduler) [$PGTT_PGUSER]
-f, --file= SQL script file to execute during startup
--password= PG config DB password (default: somestrong) [$PGTT_PGPASSWORD]
--sslmode=[disable|require] What SSL priority use for connection (default: disable)
--pgurl= PG config DB url [$PGTT_URL]
--init Initialize database schema and exit. Can be used with --upgrade
--upgrade Upgrade database to the latest version
--no-program-tasks Disable executing of PROGRAM tasks [$PGTT_NOPROGRAMTASKS]
SELECT timetable.job_add('MyJob', 'SELECT public.my_func()' , NULL, 'SQL', '5 0 * 8 *', live := TRUE);
SELECT timetable.job_add('MyJob', 'SELECT public.my_func()' , NULL, 'SQL', '23 0-20/2 * * *', live := TRUE);
第一个阶段用于配置 base_task,定义需要执行的操作。包括 SQL 语句、外部程序以及内置的操作。 第二个阶段用于配置 task_chain,定义一组顺序执行的基本任务。 第三阶段用于配置 chain_execution_config,定义任务链的执行计划。
总结
☞女朋友的一个建议,这位程序员创立仅 551 天公司就被 10 亿美元收购了
☞抽成 30% 的苹果税是良心价?谷歌也学“坏”了
☞“面向对象就是一个错误!”
☞回溯 Rust 2020:正在成为最受欢迎的编程语言
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 增绿就是增优势 植树就是植未来 7967503
- 2 网购500元假茅台官方扫码为真 7993627
- 3 顾茜茜抖音账号被永久封禁 7849381
- 4 《政府工作报告》全文公布 7777615
- 5 多名外卖小哥提醒避雷黄焖鸡 7618112
- 6 夫妻连生9女 取名从招娣盼娣到仇娣 7552224
- 7 春捂要捂到什么时候?医生建议来了 7470027
- 8 老干部局招聘要求50岁 工资3000元 7360207
- 9 金秀贤把入伍期间照片私发给金赛纶 7239414
- 10 中小企业经营向暖 7127847