热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

详解PostgreSQL

目录操作系统定时任务pgAgent安装pgAgent创建定时任务pg_cron安装pg_cron配置pg_cronpg_timetable安装pg_timetable使用pg_ti

文章目录[隐藏]

  • 目录
  • 操作系统定时任务
  • pgAgent
  • 安装 pgAgent
  • 创建定时任务
  • pg_cron
    • 安装 pg_cron
    • 配置 pg_cron
  • pg_timetable
    • 安装 pg_timetable
    • 使用 pg_timetable
  • 总结

定时 任务

数据库定时任务可以用于实现定期的备份、统计信息采集、数据汇总、数据清理与优化等。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 [7 or 0 == Sunday])
     

其中的前五个字段表示执行命令的时间,可以使用星号(*)匹配所有的时间。例如,将 设置为星号表示每个月都执行命令。

举例来说,输入以下内容表示每天零点执行数据库逻辑备份操作。

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

创建定时任务

右键点击“pgAgent Jobs”节点,选择“Create” > “pgAgent Job”创建一个新的定时任务。

job

其中,“General”页面可以输入一些基本信息,包括任务的名称。“Steps”页面可以设置多个操作步骤,包括执行的脚本或者 SQL 语句等。“Schedules”页面用于定义任务执行的时间计划。“SQL”页面可以显示创建或者修改任务的语句。

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 

安装 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

首先,我们可以使用官方发布的二进制安装程序安装 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': 
Password for 'https://cyberboy@github.com': 

运行 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,定义任务链的执行计划。

chain

此外,为了给基本任务传递控制参数,任务链中的任务都可以附带一个执行参数。详细的配置方法和案例可以参考官方网站。

总结

本文介绍了在 PostgreSQL 数据库中实现定时任务的 4 种方法,包括操作系统定时任务、pgAgent 代理、pg_cron 插件以及 pg_timetable 工具。

到此这篇关于PostgreSQL 实现定时任务的 4 种方法的文章就介绍到这了,更多相关PostgreSQL 定时任务内容请搜索云图网以前的文章或继续浏览下面的相关文章希望大家以后多多支持云图网!


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
author-avatar
坏坏不贱_233
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有