操作系统定时任务
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://[email protected]': <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);
以下命令表示从 0 点到 20 点,每两个小时的 23 分时运行“MyJob”任务: SELECT timetable.job_add('MyJob', 'SELECT public.my_func()' , NULL, 'SQL', '23 0-20/2 * * *', live := TRUE);
pg_timetable 计划任务的完整配置由 3 个阶段组成:
-
第一个阶段用于配置 base_task,定义需要执行的操作。包括 SQL 语句、外部程序以及内置的操作。 -
第二个阶段用于配置 task_chain,定义一组顺序执行的基本任务。 -
第三阶段用于配置 chain_execution_config,定义任务链的执行计划。
总结
☞女朋友的一个建议,这位程序员创立仅 551 天公司就被 10 亿美元收购了
☞抽成 30% 的苹果税是良心价?谷歌也学“坏”了
☞“面向对象就是一个错误!”
☞回溯 Rust 2020:正在成为最受欢迎的编程语言
文章评论