浅沫记忆 发表于 2022-2-3 15:49:48

PostgreSQL 实现定时任务的四种方法

      
       文章转载自公众号:SQL编程思想
      
       数据库定时任务可以用于实现定期的备份、统计信息采集、数据汇总、数据清理与优化等。PostgreSQL 没有提供类似 Oracle、MySQL 以及 Microsoft SQL Sever 的内置任务调度功能,因此本文给大家介绍一下 PostgreSQL 数据库中实现定时任务的 4 种方法。      
       方法一:操作系统定时任务      
       Linux 定时任务(crontab)或者 Windows 任务计划程序(Task Scheduler)为我们提供了一个实现定时任务传统的方法。以 crontab 为例,我们可以使用以下命令编辑任务列表:      
       crontab -e
             
       然后在打开的文件中使用以下格式增加一行数据:      
              #分钟   小时   月份中的某一天月份   星期          命令
#(0-59)(0-23) (1-31)         (1-12)(0-7 )
<minute> <hour> <day of month> <month> <day of week> <command>
      
       其中的前五个字段表示执行命令的时间,可以使用星号(*)匹配所有的时间。例如,将 <month> 设置为星号表示每个月都执行命令。      
       举例来说,输入以下内容表示每天零点执行数据库逻辑备份操作。      
       0 0 * * * pg_dump --no-password -U user db_name > backup.sql
      
          为了安全起见不要直接输入密码,而是应该将密码加入 .pgpass 文件,并且将该文件的权限设置为仅当前用户可见:      
       chmod 600 .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= 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 工具。   







   预告 | 2021 PG亚洲大会12月与您相约       PG ACE计划的正式发布       三期PostgreSQL国际线上沙龙活动的举办       六期PostgreSQL国内线上沙龙活动的举办    中国PostgreSQL分会与腾讯云战略合作协议签订
   中国PostgreSQL分会与美创科技战略合作协议签订       中国PostgreSQL分会与中软国际战略合作协议签订       中国PostgreSQL分会“走进”北京大学       中国PostgreSQL分会“走进”深圳大学       PGFans社区核心用户点亮计划      
   
PostgreSQL 14.0 正式发布

深度报告:开源协议那些事儿
从“非主流”到“潮流”,开源早已值得拥有
Oracle中国正在进行新一轮裁员,传 N+6 补偿
PostgreSQL与MySQL版权比较
新闻|Babelfish使PostgreSQL直接兼容SQL Server应用程序
四年三冠,PostgreSQL再度荣获“年度数据库”
中国PostgreSQL分会入选工信部重点领域人才能力评价机构



更多新闻资讯,行业动态,技术热点,请关注中国PostgreSQL分会官方网站
https://www.postgresqlchina.com
中国PostgreSQL分会生态产品
https://www.pgfans.cn
中国PostgreSQL分会资源下载站
https://www.postgreshub.cn




   点击此处阅读原文
   ↓↓↓
本文分享自微信公众号 - 开源软件联盟PostgreSQL分会(kaiyuanlianmeng)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

https://my.oschina.net/postgresqlchina/blog/5415311
页: [1]
查看完整版本: PostgreSQL 实现定时任务的四种方法