目次
- 操作系统定时使命
- pgAgent
- 安装 pgAgent
- 创建定时使命
- pg_cron
- pg_timetable
- 安装 pg_timetable
- 使用 pg_timetable
- 总结
数据库定时使命可以用于实现定期的备份、统计信息采集、数据汇总、数据清算与优化等。PostgreSQL 没有提供类似 Oracle、MySQL 以及 Microsoft SQL Sever 的内置使命调理功能,因此本文给各人先容一下 PostgreSQL 数据库中实现定时使命的 4 种方法。
操作系统定时使命
Linux 定时使命(crontab)或者 Windows 使命筹划程序(Task Scheduler)为我们提供了一个实现定时使命传统的方法。以 crontab 为例,我们可以使用以下下令编辑使命列表:
复制代码 然后在打开的文件中使用以下格式增长一行数据:- #分钟 小时 月份中的某一天 月份 星期 命令
- #(0-59) (0-23) (1-31) (1-12) (0-7 [7 or 0 == Sunday])
- <minute> <hour> <day of month> <month> <day of week> <command>
复制代码
此中的前五个字段表现执行下令的时间,可以使用星号(*)匹配所有的时间。比方,将 <month> 设置为星号表现每个月都执行下令。
举例来说,输入以下内容表现天天零点执行数据库逻辑备份操作。- 0 0 * * * pg_dump --no-password -U user db_name > backup.sql
复制代码
为了安全起见不要直接输入密码,而是应该将密码加入 .pgpass 文件,并且将该文件的权限设置为仅当前用户可见:复制代码 pgAgent
pgAgent 是一个用于 PostgreSQL 数据库的使命调理署理,可以或许基于复杂的调理筹划运行多步调的批处理、shell 脚本以及 SQL 下令。对于 Unix/Linux 系统,pgAgent 以背景进程的方式运行;对于 Windows 系统,pgAgent 以服务的情势运行。
安装 pgAgent
PgAdmin 4 管理工具集成了 pgAgent 的功能,但是这两者必要单独安装。我们可以通过官方网站下载 PgAdmin 4 以及 pgAgent。详细的安装步调和留意事项可以参考官网文档。安装完成之后,我们可以在 PgAdmin 4 左侧导航树中看到“pgAgent Jobs”节点。
创建定时使命
右键点击“pgAgent Jobs”节点,选择“Create” > “pgAgent Job”创建一个新的定时使命。
此中,“General”页面可以输入一些根本信息,包罗使命的名称。“Steps”页面可以设置多个操作步调,包罗执行的脚本或者 SQL 语句等。“Schedules”页面用于界说使命执行的时间筹划。“SQL”页面可以表现创建或者修改使命的语句。
点击“Save”按钮生存设置并创建使命,然后我们就可以在“pgAgent Job”节点下看到创建的使命。
pg_cron
pg_cron 是由 citusdata 公司开发的一个 PostgreSQL 定时使命插件(类似于 Oracle 中的 DBMS_SCHEDULER)。pg_cron 作为一个背景工作进程运行,使用类似 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
pg_cron 现在只支持 Linux 操作系统。对于 Red Hat、CentOS 以及 Fedora 等操作系统可以使用以下下令举行安装(PostgreSQL 12):- sudo yum install -y pg_cron_12
复制代码
对于 Debian 以及 Ubuntu 可以使用以下下令举行安装(PostgreSQL 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
为了在启动 PostgreSQL 时运行 pg_cron 背景工作进程,我们必要将 pg_cron 添加到 postgresql.conf 文件中的 shared_preload_libraries配置项。 默认情况下,pg_cron 背景进程使用 postgres 数据库获取所需的元数据。但是我们也可以使用 cron.database_name 配置参数举行设置。- shared_preload_libraries = 'pg_cron'
- cron.database_name = 'postgres'
复制代码
重启 PostgreSQL:- sudo service postgresql-12 restart
复制代码
然后我们可以使用以下下令创建 pg_cron 函数以及元数据相关的表:- -- 使用 superuser 运行以下命令
- CREATE EXTENSION pg_cron;
-
- -- 可选操作,为其他用户授予访问权限
- GRANT USAGE ON SCHEMA cron TO username;
复制代码
pg_timetable
pg_timetable 是由 CYBERTEC 公司开发的 PostgreSQL 作业调理程序,提供了灵活的配置方式和许多高级功能。包罗由多个使命构成的使命链、支持 SQL 下令和可执行程序、内置使命(比方发送邮件)、完全基于数据库的配置和日志功能、cron 风格的筹划调理、并发执行的保护等。
安装 pg_timetable
首先,我们可以使用官方发布的二进制安装程序安装 pg_timetable,现在支持 Windows、Linux 以及 macOS 操作系统。
别的,官方的 docker 镜像可以点此下载。
master 分支的 latest 标签是最新版本,使用下令行的运行方式如下:- 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
复制代码
除此之外,我们也可以使用源码举行编译安装。首先下载并安装 Go 语言情况,然后使用 go get 下令拷贝 pg_timetable 源码:- $ 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>
复制代码
运行 pg_timetable:- $ 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 ./...
复制代码
也可以使用 postgres docker 镜像运行测试:- $ RUN_DOCKER=true go test ./...
复制代码
使用 pg_timetable
pg_timetable 独立于 PostgreSQL 服务器运行,相称于一个客户端进程。安装完成之后,执行以下下令运行 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]
复制代码
源代码的 sample 目次中提供了大量的示例可以参考。以下下令可以创建一个 8 月份 00:05 运行“MyJob”的定时使命:- 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,界说使命链的执行筹划。
此外,为了给根本使命通报控制参数,使命链中的使命都可以附带一个执行参数。详细的配置方法和案例可以参考官方网站。
总结
本文先容了在 PostgreSQL 数据库中实现定时使命的 4 种方法,包罗操作系统定时使命、pgAgent 署理、pg_cron 插件以及 pg_timetable 工具。
到此这篇关于PostgreSQL 实现定时使命的 4 种方法的文章就先容到这了,更多相关PostgreSQL 定时使命内容请搜索脚本之家从前的文章或继承欣赏下面的相关文章盼望各人以后多多支持脚本之家! |